ActionView/Spinner 操作栏中有 match_parent

ActionView/Spinner with match_parent in action bar

我需要操作栏中的微调器来过滤内容,看起来与此类似:

但是微调器应该填满整个操作栏。

我尝试了什么:

1) actionBar.setListNavigationCallbacks(navigationAdapter, this);

是的,它有效。但我只需要在 1 个片段中使用这个过滤器。是的,我只能在这个片段中使用 ActionBar.NAVIGATION_MODE_LIST,而在其他片段中将其更改为 ActionBar.NAVIGATION_MODE_STANDARD。但是如果我想在另一个片段中添加 differenat 过滤器。所以,我应该在每个片段中设置类型、适配器等。非常非常可怕。

2) 更好的解决方案是使用菜单。在片段的 onCreateOptionsMenu 中,我只能在我需要的片段中添加带有 actionViewClass="android.widget.Spinner" 的项目。几乎是好的解决方案,除了该项目将右对齐并且不会填充完整的操作栏。

所以,我的问题是:如何让菜单项填充完整的动作蝙蝠长度? 或者你能建议更好的解决方案吗?

顺便说一句,setCustomView 对于 ActionBar - 糟糕的解决方案,原因与 setListNavigationCallbacks...

相同

找到解决方案。您应该使用自己的微调项布局。

而不是:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.projects_filteres, android.R.layout.simple_spinner_item);

使用:

ArrayAdapter<CharSequence> adapter =  new ArrayAdapter<CharSequence>(getActivity(), R.layout.projects_filter_item, 
                android.R.id.text1, getActivity().getResources().getStringArray(R.array.projects_filteres));

其中 R.array.projects_filteres - 只是来自资源的简单数组,R.layout.projects_filter_itemRelativeLayoutandroid:layout_width="match_parent":

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="fill_horizontal"
    android:orientation="vertical" >

    <TextView
        android:textColor="#000"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

因此,片段中 onCreateOptionsMenu 的整个代码如下所示:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.action_bar_context_menu, menu);

    android.view.MenuItem filter = menu.findItem(R.id.context_menu_filter);

    ArrayAdapter<CharSequence> adapter =  new ArrayAdapter<CharSequence>(getActivity(), R.layout.projects_filter_item, 
            android.R.id.text1, getActivity().getResources().getStringArray(R.array.projects_filteres));
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    Spinner spinner = (Spinner)MenuItemCompat.getActionView( filter);
    spinner.setAdapter(adapter);

    spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {


        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });

}