2013-06-05 55 views
11

我想除了在設定項目,以創建像下面的圖片描述了我的動作條定製溢出菜單項:的Android創建自定義溢出菜單項

Action bar

但如果有一些空間ActionBar我不希望Item1和Item2作爲溢出進入設置項目,而是進入「我的溢出項目」。

這是我的菜單XML代碼:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:icon="@android:drawable/ic_menu_agenda" 
    android:title="Item1" 
    android:showAsAction="ifRoom|withText" /> 

<item 
    android:icon="@android:drawable/ic_menu_add" 
    android:title="Item2" 
    android:showAsAction="ifRoom|withText" /> 

<item android:id="@+id/pick_action_provider" 
    android:icon="@android:drawable/ic_menu_sort_by_size" 
    android:showAsAction="always" 
    android:title="Overflow" > 
    <menu> 
     <item android:id="@+id/action_sort_size" 
       android:icon="@android:drawable/ic_menu_camera" 
       android:title="Item3" /> 
     <item android:id="@+id/action_sort_alpha" 
       android:icon="@android:drawable/ic_menu_sort_alphabetically" 
       android:title="Item4" /> 
    </menu> 
</item> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="never" 
    android:title="@string/action_settings"/></menu> 

回答

6

這會幫助你。我已經編碼這個溢出菜單

在菜單/ main.xml中的文件

<item 
    android:id="@+id/overflow" 
    android:orderInCategory="100" 
    android:showAsAction="always" 
    android:icon="@drawable/ic_overflow" 
    android:title=""> 
    <menu> 
     <item 
      android:id="@+id/facebook" 
      android:title="Facebook"/> 

     <item 
      android:id="@+id/Twitter" 
      android:title="Twitter"/> 

     <item 
      android:id="@+id/Youtube" 
      android:title="Youtube"/> 
    </menu> 
</item> 

,這是你的java代碼:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 

    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    // Handle action bar actions click 

    super.onOptionsItemSelected(item); 
    if(item.getItemId() == R.id.facebook){ 
     Toast.makeText(Getstarted.this, "Option pressed= facebook",Toast.LENGTH_LONG).show(); 
    } 
    else if(item.getItemId() == R.id.Youtube){ 
     Toast.makeText(Getstarted.this, "Option pressed= youtube",Toast.LENGTH_LONG).show(); 
    } 
    else if(item.getItemId() == R.id.Twitter){ 
     Toast.makeText(Getstarted.this, "Option pressed= twitter",Toast.LENGTH_LONG).show(); 
    } 
    return true;  

} 
+1

謝謝,但 android:showAsAction =「always」 - > app:showAsAction =「always」 – Arnab

0

看到這些鏈接

http://www.codeproject.com/Articles/173121/Android-Menus-My-Way

http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

,我建議你使用actionbarsherlock創建自定義溢出菜單

看到這個答案要知道如何使用動作條福爾摩斯

ActionbarSherlock does not include "overflow" section of Action Bar (on Android 2.1)

+0

我不想使用外部庫或下拉菜單,因爲它是一個導航類型,而不是一個溢出菜單,我開發的Android 4+ – lory105

0

你最有可能需要刪除的設置項在菜單即@ + ID/action_settings創建溢出菜單項。

如果您仍然希望它在那裏,只是刪除它的「showAsActionAttribute」或將其交換到

android:showAsAction="always" 

對於項目1和項目2: 加入他們的showAsAction的屬性android:showAsAction="ifRoom|withText"

希望有所幫助。

0

做你想達到的最好方法是給自定義的ActionBar充氣。

執行以下步驟。

1)創建一個XML RelativeLayout

2)包含XML

3)充氣經由ActionBar類操作欄內的菜單項目和標籤。

4)就是這樣你完成了!

警告:不要忘記使用兼容性庫!上面的工作有一些依賴關係。

0

當從動作條

PopupMenu popup = new PopupMenu(MainActivity.this, v); 
popup.getMenuInflater().inflate(
          R.mymenu xml , popup.getMenu()); 



mymenu.xml 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:icon="@android:drawable/ic_menu_agenda" 
    android:title="Item1" 
    android:showAsAction="ifRoom" /> 

<item 
    android:icon="@android:drawable/ic_menu_add" 
    android:title="Item2" 
    android:showAsAction="ifRoom" /> 

<item android:id="@+id/pick_action_provider" 
    android:icon="@android:drawable/ic_menu_sort_by_size" 
    android:showAsAction="ifRoom" 
    android:title="Overflow" > 
    <menu> 
     <item android:id="@+id/action_sort_size" 
     android:showAsAction="ifRoom|withText" 
       android:icon="@android:drawable/ic_menu_camera" 
       android:title="Item3" /> 
     <item android:id="@+id/action_sort_alpha" 
android:showAsAction="ifRoom|withText"  
       android:icon="@android:drawable/ic_menu_sort_alphabetically" 
       android:title="Item4" /> 
    </menu> 
</item> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="ifRoom" 
    android:title="@string/action_settings"/></menu> 
+0

你能解釋爲什麼以及如何回答這個問題嗎?你的代碼在做什麼? – Ben

0

點擊項目嘗試使用

<item .... <any_damn_name>:showAsAction="ifRoom|withText" /> 

不要忘記添加

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:<any_damn_name>="http://schemas.android.com/apk/res-auto" 

,並嘗試將用於片段和全球(設置單獨的菜單在Global.xml菜單文件中)

確保您按正確的順序充氣。

0

menu.xml

<item android:id="@+id/game" 
     android:icon="@drawable/menu_addnew" 
     android:title="game" 
     android:showAsAction="ifRoom"/> 
<item android:id="@+id/help" 
     android:icon="@drawable/menu_addnew" 
     android:title="help" /> 

abc.class文件,使這些變化:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.game_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
     case R.id.game: 
      Game(); 
      return true; 
     case R.id.help: 
      Help(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

Menus文檔。

0

的溢出創建樣式菜單並通過內容說明

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:contentDescription">@string/accessibility_overflow</item> 
</style> 

<style name="Your.Theme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> 
</style> 

致電ViewGroup.findViewsWithText並傳入您的內容說明。有點像這樣:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // The content description used to locate the overflow button 
    final String overflowDesc = getString(R.string.accessibility_overflow); 
    // The top-level window 
    final ViewGroup decor = (ViewGroup) getWindow().getDecorView(); 
    // Wait a moment to ensure the overflow button can be located 
    decor.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // The List that contains the matching views 
      final ArrayList<View> outViews = new ArrayList<>(); 
      // Traverse the view-hierarchy and locate the overflow button 
      decor.findViewsWithText(outViews, overflowDesc, 
        View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); 
      // Guard against any errors 
      if (outViews.isEmpty()) { 
       return; 
      } 
      // Do something with the view 
      final ImageButton overflow = (ImageButton) outViews.get(0); 
      overflow.setImageResource(R.drawable.ic_action_overflow); 

     } 

    }, 1000); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Add a dummy item to the overflow menu 
    menu.add("Overflow"); 
    return super.onCreateOptionsMenu(menu); 
} 

View.findViewsWithText僅API級別14中添加。因此,請嘗試按照您自己的方式執行以下操作:

public static void findViewsWithText(List<View> outViews, ViewGroup parent, String targetDescription) { 
    if (parent == null || TextUtils.isEmpty(targetDescription)) { 
     return; 
    } 
    final int count = parent.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = parent.getChildAt(i); 
     final CharSequence desc = child.getContentDescription(); 
     if (!TextUtils.isEmpty(desc) && targetDescription.equals(desc.toString())) { 
      outViews.add(child); 
     } else if (child instanceof ViewGroup && child.getVisibility() == View.VISIBLE) { 
      findViewsWithText(outViews, (ViewGroup) child, targetDescription); 
     } 
    } 
} 

這不是經過測試的代碼。因此,如果您在實施過程中遇到任何問題,請告訴我。