13

我想在我的 ActionBar 中创建一个自定义溢出菜单项,另外在设置项中,如下图所述:

操作栏

但是,如果 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>
4

8 回答 8

9

这将对您有所帮助。我为溢出菜单编写了这个代码

在 menu/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;    

}
于 2014-11-23T14:51:44.143 回答
0

查看这些链接

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

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

我建议您使用 actionbarsherlock 创建自定义溢出菜单

请参阅此答案以了解如何使用操作栏 sherlock 创建溢出菜单项

ActionbarSherlock 不包括 Action Bar 的“溢出”部分(在 Android 2.1 上)

于 2013-06-05T10:35:45.480 回答
0

您很可能必须删除菜单中的设置项,即@+id/action_settings。

如果您仍然希望它在那里,只需删除它的“showAsActionAttribute”或将其交换为

android:showAsAction="always"

对于 Item1 和 Item2:将它们的showAsAction属性添加为android:showAsAction="ifRoom|withText"

希望有帮助。

于 2014-09-14T03:12:08.797 回答
0

做你想要实现的最好方法是膨胀自定义ActionBar

执行以下步骤。

1)创建一个XMLRelativeLayout

2) 在 XML 中包含一个菜单项和标签

3)通过类膨胀动作栏ActionBar

4) 就这样你完成了!!

警告:不要忘记使用兼容性库!!上面有一些依赖项才能正常工作。

于 2014-09-28T05:08:30.900 回答
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>
于 2014-10-07T12:25:10.783 回答
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 菜单文件中的设置)

确保以正确的顺序充气。

于 2014-10-17T09:23:03.993 回答
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);
    }
}

请参阅菜单文档。

于 2014-11-04T18:19:33.403 回答
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);
        }
    }
}

这不是经过测试的代码。因此,如果您在实施时有任何问题,请告诉我。

于 2014-12-02T05:52:11.170 回答