我正在开发一个应用程序,我必须在操作栏上添加自定义布局。添加自定义布局已完成,但是当我在操作栏上添加菜单项时,我的自定义布局会将其从操作栏右侧的位置更改为操作栏的中心。下面是我到目前为止所获得的图像。
我在动作栏上想要这样的东西。
操作栏最右侧的自定义布局(黄色按钮)和中间的菜单项。
使用原生android操作栏添加我的代码以实现此自定义布局:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.websearch_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
default:
return super.onOptionsItemSelected(item);
}
}
如何实现这一目标?
任何形式的帮助都将受到赞赏。
答案 0 :(得分:14)
只需在xml文件中使用orderInCategory
,它就会从较少的数字到更高的数字(从操作栏的左侧)开始排序。如:
<item
android:id="@+id/Refresh"
android:icon="@drawable/ic_action_refresh"
android:showAsAction="ifRoom"
android:title="@string/refresh"
android:orderInCategory="2"/>
<item
android:id="@+id/Search"
android:icon="@drawable/ic_action_action_search"
android:showAsAction="ifRoom|collapseActionView"
android:title="@string/search"
android:orderInCategory="1"/>
尽管刷新项目首先出现在xml文件中,但它不会是第一个。但是,操作栏中从左到右的搜索图标将首先根据其orderInCategory属性。
答案 1 :(得分:3)
我假设您将自定义视图设置为操作栏中的自定义视图。如果您使用的是ActionbarSherlock,则可以将自定义视图添加为普通菜单项,并使用.setActionView(yourCustomView or yourCustomLayoutId)
为其设置操作视图。然后,您可以设置.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
以显示视图。只需确保您的自定义视图设置为宽度wrap_content
,否则它会将其他菜单项推离屏幕。这可能在没有ActionbarSherlock的情况下也可以使用,但我还没有尝试过。
编辑:尝试修改您的onCreateOptionsMenu
方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.websearch_menu, menu);
// add this
menu.add(Menu.NONE, 0, Menu.NONE, "custom")
.setActionView(R.layout.header)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
并从onCreate方法
中删除它actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
编辑:
如果您需要引用自定义布局中的视图,可以按照以下onCreateOptionsMenu
方法执行此操作(注意:我在浏览器中编写了此代码,因此无法保证我没有创建错字或其他):
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// inflate the menu and add the item with id viewId,
// which has your layout as actionview
View actionView = menu.getItem(viewId).getActionView();
View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout);
// here you can set listeners to your view or store a reference
// to it somewhere, so you can use it later
return true;
}
答案 2 :(得分:2)
菜单项的顺序将根据它们夸大的XML文件中的顺序进行设置。
因此,您需要做的就是根据需要更改XML文件中的顺序。
答案 3 :(得分:0)
实现目标的一种方法是致电invalidateOptionMenu,在onCreateOptionsMenu方法中,根据您希望的顺序放置项目。
顺便说一句,如果你使用ActionBarSherlock,这个方法是可用的,所以忽略关于它的Lint警告。