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_item
是 RelativeLayout
和 android: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) {
}
});
}
我需要操作栏中的微调器来过滤内容,看起来与此类似:
但是微调器应该填满整个操作栏。
我尝试了什么:
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_item
是 RelativeLayout
和 android: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) {
}
});
}