2013-11-02 66 views
10

请帮帮忙, 我做了一个自定义菜单(添加支持库)(名称 - > main_activity_actions.xml)Android操作栏,三个点不显示

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 

<item 
    android:id="@id/search" 
    android:icon="@drawable/search" 
    android:title="@string/search" 
    yourapp:showAsAction="ifRoom" /> 
<item 
    android:id="@id/view_all" 
    android:title="@string/view_all" 
    yourapp:showAsAction="never"/> 
<item 
    android:id="@+id/action_settings" 
    yourapp:showAsAction="never" 
    android:title="@string/action_settings"/> 

现在我应该怎么做把action_settings分成三个点(操作栏),而不是硬件菜单按钮(没有任何黑客攻击)。

MainActivity

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main_activity_actions, menu); 
    return true; 
} 

好吧,我已经找到了破解,但是如果有任何其他方式然后让我知道,
哈克
把这个代码的onCreate

try { 
     ViewConfiguration config = ViewConfiguration.get(this); 
     Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); 
     if(menuKeyField != null) { 
      menuKeyField.setAccessible(true); 
      menuKeyField.setBoolean(config, false); 
     } 
    } catch (Exception ex) { 
     // Ignore 
    } 

为这个你需要导入

import java.lang.reflect.Field; 
import android.view.ViewConfiguration; 
+0

如果你想全面超越你可以使用动作提供商 – Hardik

+0

无需添加达致这力量‘谢谢’你的问题调用此方法;标记答案被接受是我们所需要的。 :-) –

回答

3

没有任何破解,你不能在所有设备上做到这一点。那些具有硬件菜单按钮的设备(我不确定是否全部)将使用它来代替溢出按钮(...)。

哪一种是好东西。这些设备的用户用于按菜单按钮进入菜单。所以对于他们来说,缺少溢出按钮是正常行为。

对于那些使用溢出按钮的设备,Android会根据showAsAction标记中的提示自行决定放置什么位置。这取决于屏幕大小,方向等。 This page有一个表格,显示了多少图标显示(其余进入溢出菜单)。

+0

我不想在所有设备上这样做,但在那些支持此功能的设备上。 –

+0

你不需要做任何特殊的事情,但是如果你有一个使用菜单按钮的设备,你不会在没有黑客的情况下将它变成3个点。 – Szymon

+0

只是最后一个问题,Hack是好还是坏,我的意思是它安全与否。 –

1

请为显示SherlokActionbar测试该代码:

public class MainActivity extends SherlockActivity { 
private com.actionbarsherlock.view.MenuItem mGoItem; 
private com.actionbarsherlock.view.MenuItem mClearItem; 

private static final int listSMS_ITEM_ID = 1; 
private static final int Distance_ITEM_ID = 5; 
private static final int About_ITEM_ID = 2; 
private static final int Search_ITEM_ID = 3; 
private static final int HELP_ITEM_ID = 4; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 

    mGoItem = menu.add(0, HELP_ITEM_ID, 0, null); 
    mGoItem.setIcon(R.drawable.refresh).setShowAsAction(
      MenuItem.SHOW_AS_ACTION_ALWAYS); 

    mGoItem = menu.add(0, Distance_ITEM_ID, 0, null); 
    mGoItem.setIcon(R.drawable.ic_launcher).setShowAsAction(
      MenuItem.SHOW_AS_ACTION_ALWAYS); 

    mGoItem = menu.add(0, listSMS_ITEM_ID, 0, null); 
    mGoItem.setIcon(R.drawable.refresh).setShowAsAction(
      MenuItem.SHOW_AS_ACTION_ALWAYS); 

    mGoItem = menu.add(0, Search_ITEM_ID, 0, null); 
    mGoItem.setIcon(R.drawable.ic_launcher).setShowAsAction(
      MenuItem.SHOW_AS_ACTION_ALWAYS); 

    return true; 
} 
// @Override 
public boolean onOptionsItemSelected(
     com.actionbarsherlock.view.MenuItem item) { 
    // TODO Auto-generated method stub 
    /* return super.onOptionsItemSelected(item); */ 

    switch (item.getItemId()) { 
    case listSMS_ITEM_ID: 

     Toast.makeText(getApplicationContext(), "listSMS", 1).show(); 


     return true; 

    case Search_ITEM_ID: 

     Toast.makeText(getApplicationContext(), " Search", 1).show(); 

     return true; 




    case Distance_ITEM_ID: 

     Toast.makeText(getApplicationContext(), " Distance", 1).show(); 
     return true; 



     case HELP_ITEM_ID: 
      Toast.makeText(getApplicationContext(), " HELP", 1).show(); 
      // 

      return true; 


    } 

    return false; 
} 
13

如果你想显示的三个点,而不管设备菜单按钮!那么您可以在您的应用程序类的onCreate方法 -

private void getOverflowMenu() { 

    try { 
     ViewConfiguration config = ViewConfiguration.get(this); 
     Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); 
     if(menuKeyField != null) { 
      menuKeyField.setAccessible(true); 
      menuKeyField.setBoolean(config, false); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

Genious。这是来自Google的唯一答案,它帮助了我! –

+0

出色地工作! – Erick

+0

+1。谢谢。当我升级到sdk编译api 24并在android api版本14和16中运行应用程序时,我遇到了这个问题。你解决了。 – statosdotcom