Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在特定菜单项之间添加分隔符? 背景_Android_Android Actionbar_Submenu_Android Toolbar_Divider - Fatal编程技术网

Android 如何在特定菜单项之间添加分隔符? 背景

Android 如何在特定菜单项之间添加分隔符? 背景,android,android-actionbar,submenu,android-toolbar,divider,Android,Android Actionbar,Submenu,Android Toolbar,Divider,我在操作栏(实际上是工具栏)中有一个菜单项,单击该菜单项时,会显示可供选择的项目列表,类似于单选按钮: <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:icon="@drawable/..." android:t

我在操作栏(实际上是工具栏)中有一个菜单项,单击该菜单项时,会显示可供选择的项目列表,类似于单选按钮:

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

    <item
        android:icon="@drawable/..."
        android:title="@string/..."
        app:showAsAction="always">
        <menu>
            <group
                android:id="@+id/..."
                android:checkableBehavior="single">
                <item .../>
                <item .../>
                <item .../>
            </group>
        </menu>
    </item>
</menu>

我需要在这个项目列表下面放一个项目,在它和列表之间有一个分隔符。与材料设计指南所示内容类似(摘自):

编辑:下面是我想做的一个草图:

问题 我找不到办法来做这件事

我试过的 我找到的唯一可能的解决方案是:

  • 更改活动()的主题,但这也会影响活动的其他菜单项

  • 方法,当菜单项出现在操作栏上时,在菜单项之间放置分隔符,但此处它们不显示在工具栏上。它们出现在所选项目的弹出菜单上

  • 我试图在列表和额外项目之间放置假项目,我还尝试放置一个组、一个空组,甚至尝试各种属性

  • 可悲的是,一切都不起作用

    问题 如何在操作项弹出菜单的特定项之间添加分隔符

    也许我需要创建一个自定义弹出菜单时,点击的行动项目(如)?如果是,我如何在特定项目之间设置分隔符?
    也许可以将微调器用作动作项?

    好的,我找到了一个很好的解决方法,但我不确定样式是否应该是这样。这就是我所缺少的:

  • 项目背景位于微调器弹出窗口的背景之上,我不确定这是否正确
  • 我使用支持库的白色背景弹出微调器。我想应该有更好的办法把它变成白色
  • 我需要知道分隔器的正确样式。现在我用了一个简单的
  • 缺少操作栏项样式。我只是使用了一个简单的ImageView,我认为它应该有所不同
  • 出于某种原因,在一些Android版本(可能是棒棒糖和更低版本)上,这些项目的背景看起来是黑色而不是白色
  • 微调器有时可能与setOnItemSelectedListener有问题,但不确定何时出现问题 main活动

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        final MenuItem item = menu.findItem(R.id.action_settings);
        final Spinner spinner = ((Spinner) MenuItemCompat.getActionView(item));
        SimpleImageArrayAdapter adapter = new SimpleImageArrayAdapter(this);
        spinner.setAdapter(adapter);
        return true;
    }
    
    public class SimpleImageArrayAdapter extends ArrayAdapter<String> {
        private final String[] items = {"item 1", "item 2", "item 3", "extra item"};
    
        public SimpleImageArrayAdapter(Context context) {
            super(context, 0);
        }
    
        @Override
        public int getCount() {
            return items.length;
        }
    
        @Override
        public String getItem(final int position) {
            return items[position];
        }
    
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            View rootView = convertView == null ? LayoutInflater.from(getContext()).inflate(R.layout.spinner_item, parent, false) : convertView;
            TextView tv = (TextView) rootView.findViewById(android.R.id.text1);
            tv.setTextColor(0xff000000);
            tv.setText(items[position]);
            boolean isLastItem = position == getCount() - 1;
            rootView.findViewById(R.id.action_divider).setVisibility(isLastItem ? View.VISIBLE : View.GONE);
            rootView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            return rootView;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //this is the view that's shown for the spinner when it's closed
            ImageView iv = new ImageView(getContext());
            iv.setImageResource(android.R.drawable.ic_menu_add);
            int viewSize = getDimensionFromAttribute(MainActivity.this, android.support.v7.appcompat.R.attr.actionBarSize);
            iv.setLayoutParams(new ViewGroup.LayoutParams(viewSize, viewSize));
            iv.setScaleType(ScaleType.CENTER_INSIDE);
            iv.setBackgroundResource(getResIdFromAttribute(MainActivity.this, R.attr.selectableItemBackground));
            return iv;
        }
    
    }
    
    public static int getResIdFromAttribute(final Activity activity, final int attr) {
        if (attr == 0)
            return 0;
        final TypedValue typedValue = new TypedValue();
        activity.getTheme().resolveAttribute(attr, typedValue, true);
        return typedValue.resourceId;
    }
    
    public static int getDimensionFromAttribute(final Context context, final int attr) {
        final TypedValue typedValue = new TypedValue();
        if (context.getTheme().resolveAttribute(attr, typedValue, true))
            return TypedValue.complexToDimensionPixelSize(typedValue.data, context.getResources().getDisplayMetrics());
        return 0;
    }
    
    @覆盖
    公共布尔onCreateOptions菜单(菜单){
    getMenuInflater().充气(右菜单菜单菜单主菜单);
    最终菜单项=menu.findItem(R.id.action\u设置);
    最终微调器微调器=((微调器)MenuItemCompat.getActionView(项));
    SimpleImageArrayAdapter=新SimpleImageArrayAdapter(此);
    旋转器。设置适配器(适配器);
    返回true;
    }
    公共类SimpleImage ArrayAdapter扩展了ArrayAdapter{
    私有最终字符串[]items={“item 1”、“item 2”、“item 3”、“extra item”};
    公共SimpleImageArrayAdapter(上下文){
    超级(上下文,0);
    }
    @凌驾
    public int getCount(){
    返回项目。长度;
    }
    @凌驾
    公共字符串getItem(最终int位置){
    退货项目[位置];
    }
    @凌驾
    公共视图getDropDownView(int位置、视图转换视图、视图组父视图){
    View rootView=convertView==null?LayoutFlater.from(getContext())。充气(R.layout.spinner_项,父项,false):convertView;
    TextView tv=(TextView)rootView.findviewbyd(android.R.id.text1);
    tv.setTextColor(0xff000000);
    tv.setText(项目[位置]);
    布尔isLastItem=position==getCount()-1;
    rootView.findViewById(R.id.action_divider).setVisibility(isLastItem?View.VISIBLE:View.GONE);
    setLayoutParams(新的AbsListView.LayoutParams(LayoutParams.MATCH_父项,LayoutParams.WRAP_内容));
    返回rootView;
    }
    @凌驾
    公共视图getView(int位置、视图转换视图、视图组父视图){
    //这是关闭微调器时显示的视图
    ImageView iv=新的ImageView(getContext());
    iv.setImageResource(android.R.drawable.ic_菜单_添加);
    int viewSize=getDimensionFromAttribute(MainActivity.this,android.support.v7.appcompat.R.attr.actionBarSize);
    iv.setLayoutParams(新视图组.LayoutParams(viewSize,viewSize));
    iv.setScaleType(刻度型,中间为U型);
    iv.setBackgroundResource(getResIdFromAttribute(MainActivity.this,R.attr.selectableItemBackground));
    回报四;
    }
    }
    公共静态整型getResIdFromAttribute(最终活动活动,最终整型属性){
    如果(attr==0)
    返回0;
    最终类型值类型值=新类型值();
    activity.getTheme().resolveAttribute(attr,typedValue,true);
    返回typedValue.resourceId;
    }
    公共静态int getDimensionFromAttribute(最终上下文上下文,最终int属性){
    最终类型值类型值=新类型值();
    if(context.getTheme().resolveAttribute(attr,typedValue,true))
    返回TypedValue.complexToDimensionPixelSize(TypedValue.data,context.getResources().getDisplayMetrics());
    返回0;
    }
    
    res/menu/menu\u main.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          tools:context="com.example.user.myapplication.MainActivity">
        <item
            android:id="@+id/action_settings"
            android:actionLayout="@layout/spinner"
            android:title=""
            app:actionLayout="@layout/spinner"
            app:showAsAction="always"
            />
    </menu>
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/action_divider"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/divider"/>
    
        <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackground"
            android:gravity="center_vertical"
            android:minHeight="?attr/listPreferredItemHeightSmall"
            android:paddingEnd="?attr/listPreferredItemPaddingRight"
            android:paddingLeft="?attr/listPreferredItemPaddingLeft"
            android:paddingRight="?attr/listPreferredItemPaddingRight"
            android:paddingStart="?attr/listPreferredItemPaddingLeft"
            android:textAppearance="?attr/textAppearanceListItemSmall"/>
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    <Spinner
        android:id="@+id/spinner"
        style="@style/SpinnerWithoutArrow"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <style name="SpinnerWithoutArrow" parent="@style/Widget.AppCompat.Spinner">
        <item name="android:background">@null</item>
        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
    </style>
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size
            android:height="1dp"/>
        <solid android:color="#FFff0000" />
    </shape>
    
    
    
    res/layout/spinner\u item.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          tools:context="com.example.user.myapplication.MainActivity">
        <item
            android:id="@+id/action_settings"
            android:actionLayout="@layout/spinner"
            android:title=""
            app:actionLayout="@layout/spinner"
            app:showAsAction="always"
            />
    </menu>
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/action_divider"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/divider"/>
    
        <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackground"
            android:gravity="center_vertical"
            android:minHeight="?attr/listPreferredItemHeightSmall"
            android:paddingEnd="?attr/listPreferredItemPaddingRight"
            android:paddingLeft="?attr/listPreferredItemPaddingLeft"
            android:paddingRight="?attr/listPreferredItemPaddingRight"
            android:paddingStart="?attr/listPreferredItemPaddingLeft"
            android:textAppearance="?attr/textAppearanceListItemSmall"/>
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    <Spinner
        android:id="@+id/spinner"
        style="@style/SpinnerWithoutArrow"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <style name="SpinnerWithoutArrow" parent="@style/Widget.AppCompat.Spinner">
        <item name="android:background">@null</item>
        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
    </style>
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size
            android:height="1dp"/>
        <solid android:color="#FFff0000" />
    </shape>
    
    
    
    res/layout/spinner.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          tools:context="com.example.user.myapplication.MainActivity">
        <item
            android:id="@+id/action_settings"
            android:actionLayout="@layout/spinner"
            android:title=""
            app:actionLayout="@layout/spinner"
            app:showAsAction="always"
            />
    </menu>
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/action_divider"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/divider"/>
    
        <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackground"
            android:gravity="center_vertical"
            android:minHeight="?attr/listPreferredItemHeightSmall"
            android:paddingEnd="?attr/listPreferredItemPaddingRight"
            android:paddingLeft="?attr/listPreferredItemPaddingLeft"
            android:paddingRight="?attr/listPreferredItemPaddingRight"
            android:paddingStart="?attr/listPreferredItemPaddingLeft"
            android:textAppearance="?attr/textAppearanceListItemSmall"/>
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    <Spinner
        android:id="@+id/spinner"
        style="@style/SpinnerWithoutArrow"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <style name="SpinnerWithoutArrow" parent="@style/Widget.AppCompat.Spinner">
        <item name="android:background">@null</item>
        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
    </style>
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size
            android:height="1dp"/>
        <solid android:color="#FFff0000" />
    </shape>
    
    
    
    res/values/styles.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          tools:context="com.example.user.myapplication.MainActivity">
        <item
            android:id="@+id/action_settings"
            android:actionLayout="@layout/spinner"
            android:title=""
            app:actionLayout="@layout/spinner"
            app:showAsAction="always"
            />
    </menu>
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/action_divider"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/divider"/>
    
        <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackground"
            android:gravity="center_vertical"
            android:minHeight="?attr/listPreferredItemHeightSmall"
            android:paddingEnd="?attr/listPreferredItemPaddingRight"
            android:paddingLeft="?attr/listPreferredItemPaddingLeft"
            android:paddingRight="?attr/listPreferredItemPaddingRight"
            android:paddingStart="?attr/listPreferredItemPaddingLeft"
            android:textAppearance="?attr/textAppearanceListItemSmall"/>
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    <Spinner
        android:id="@+id/spinner"
        style="@style/SpinnerWithoutArrow"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <style name="SpinnerWithoutArrow" parent="@style/Widget.AppCompat.Spinner">
        <item name="android:background">@null</item>
        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
    </style>
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size
            android:height="1dp"/>
        <solid android:color="#FFff0000" />
    </shape>
    
    
    @空的
    @可绘图/abc\u弹出式\u背景\u mtrl\u多个
    
    res/drawable/divider.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          tools:context="com.example.user.myapplication.MainActivity">
        <item
            android:id="@+id/action_settings"
            android:actionLayout="@layout/spinner"
            android:title=""
            app:actionLayout="@layout/spinner"
            app:showAsAction="always"
            />
    </menu>
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/action_divider"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/divider"/>
    
        <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackground"
            android:gravity="center_vertical"
            android:minHeight="?attr/listPreferredItemHeightSmall"
            android:paddingEnd="?attr/listPreferredItemPaddingRight"
            android:paddingLeft="?attr/listPreferredItemPaddingLeft"
            android:paddingRight="?attr/listPreferredItemPaddingRight"
            android:paddingStart="?attr/listPreferredItemPaddingLeft"
            android:textAppearance="?attr/textAppearanceListItemSmall"/>
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    <Spinner
        android:id="@+id/spinner"
        style="@style/SpinnerWithoutArrow"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <style name="SpinnerWithoutArrow" parent="@style/Widget.AppCompat.Spinner">
        <item name="android:background">@null</item>
        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
    </style>
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size
            android:height="1dp"/>
        <solid android:color="#FFff0000" />
    </shape>
    
    
    
    现在:

    group1[ item0 item1 item2 ] group1[item3];
    
    改为:

    group1[ item0 item1] group1[item2 item3]
    
    组有一个
    分隔符
    ; 它喜欢在
    项之间添加
    分隔符

    如果
    分隔符
    不可用,请尝试
    背景
    ; 我从不使用
    菜单

    这是我的猜测

    您应该使用动作布局

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".LandingActivity">
        <item
            android:id="@+id/action_cart"
            android:title="cart"
            android:actionLayout="@layout/cart_update_count"
            android:icon="@drawable/shape_notification"
            app:showAsAction="always"/>
    </menu>
    
    
    
    然后动作布局可以有带分隔符的文本视图

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <View
            android:id="@+id/divider"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/divider"/>
    
        <TextView
            android:id="@android:id/text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/selectableItemBackground"
            android:gravity="center_vertical"          
            android:textAppearance="?attr/textAppearanceListItemSmall"/>
    
    </LinearLayout>
    
    
    
    然后您可以在代码中添加click listener