按下状态 ::
默认状态 ::
我在做什么 ::
我想要什么 ::
我使用的代码 ::
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==R.id.searchID){
//SEARCH Button Handling
//((View) item).setBackgroundResource(R.color.actionBarIconPressed);
//item.setIcon(R.color.actionBarIconPressed);
item.setEnabled(true);
ft1=getSupportFragmentManager().beginTransaction();
ft1.hide(fragment1);
//Condition to check whether the fragment is already in container & based on that do appropriate actions
if (getSupportFragmentManager().findFragmentByTag("SearchFragmentTag")==null){
ft1.add(R.id.content_frame, fragSearch, "SearchFragmentTag");
ft1.addToBackStack(null);
ft1.commit();
}else{
ft1.remove(fragSearch);
ft1.add(R.id.content_frame, fragSearch, "SearchFragmentTag");
ft1.commit();
}
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getSupportMenuInflater();
menuInflater.inflate(R.menu.actionbar_sort_menu, menu);
return super.onCreateOptionsMenu(menu);
}
我的问题 ::
答案 0 :(得分:2)
在onOptionsItemSelected
中,您可以将MenuItem
转换为View
,然后更改其背景。我得到了一个开始答案,但我认为你可以改进它并根据你的需要改变它:
在数组中初始化您的ID:
int[] listItemId = { R.id.searchID, R.id.ratindID, R.id.likeID, R.id.shareID };
调用您选择的项目选择方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.searchID:
// call private method with int 1
onItemChangeBackground(1);
... // do some stuff
return true;
case R.id.ratindID:
onItemChangeBackground(2);
... // do some stuff
return true;
case R.id.likeID:
onItemChangeBackground(3);
...
return true;
case R.id.shareID:
onItemChangeBackground(4);
...
return true;
}
return super.onOptionsItemSelected(item);
}
通过切换int值来更改背景项:
private void onItemChangeBackground(int i) {
// Loop to reinit the background items
for(int ii = 0; ii < listItemId.length; ii++) {
// Cast the MenuItem into a View
( (View) findViewById(listItemId[ii]) )
// And set the default background (for example dark)
.setBackgroundColor(getResources().getColor(R.color.dark));
}
// Selected background
switch(i) {
case 1: ( (View) findViewById(R.id.searchID) )
.setBackgroundColor(getResources().getColor(R.color.blue));
break;
case 2: ( (View) findViewById(R.id.ratindID) )
.setBackgroundColor(getResources().getColor(R.color.blue));
break;
case 3: ( (View) findViewById(R.id.likeID) )
.setBackgroundColor(getResources().getColor(R.color.blue));
break;
case 4: ( (View) findViewById(R.id.shareID) )
.setBackgroundColor(getResources().getColor(R.color.blue));
break;
}
}
当您想要重新初始化背景项时,也可以使用setBackgroundDrawable()
设置带有选择器的drawable(就像在styles.xml中一样)。经过测试,它有效!
另一种解决方案可能是使用invalidateOptionsMenu()
。这将通过再次调用onCreateOptionsMenu()
来清除和重绘菜单。请记住,不要调用invalidateOptionsMenu()
,最后一种方法永远不会被召回,只能在活动创建的第一个方法中调用。这就是我们需要使其内容无效的原因:
更新所选项目的整数:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==R.id.searchID){
nbItemSelected = 1;
invalidateOptionsMenu();
...
} else if(...) {
nbItemSelected = 2;
invalidateOptionsMenu();
} ...
}
然后,在创建选项时更改背景:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_layout, menu);
if(nItemSelected != 0) {
// Find item, cast the selected item to a view
( (View) menu.findItem(listItemId[nItemSelected]) )
// Change its background
.setBackgroundColor(getResources().getColor(R.color.blue));
}
...
return true;
}
我想这也有可能,它可能有用。
答案 1 :(得分:0)
您是否正在创建TabBarView,例如您可以在iOs中找到的那些?
如果是这样,拆分操作栏不是最好的组件,最好将ViewPagerIndicator与ViewPager组件一起使用。在那里,您可以使用自定义图标状态和背景创建自定义图标。
我有一段很久以前创建的代码片段,用于需要该组件的应用程序。也许你可以环顾四周并拿走你需要的东西(但我告诉你,代码不是你能找到的最好的代码,因为我匆忙,事情可以做得更好,更好):
答案 2 :(得分:0)
@Casper你是否尝试过为ActionBar设置自定义选择器?
请参阅下面的一个
drawable/tab_bg_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Active tab -->
<item android:drawable="@drawable/tab_selected_customtabs" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/>
<!-- Inactive tab -->
<item android:drawable="@drawable/ab_transparent_customtabs" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
<!-- Pressed tab -->
<item android:drawable="@drawable/tab_selected_pressed_customtabs" android:state_pressed="true"/>
<!-- Selected tab -->
<item android:drawable="@drawable/tab_selected_focused_customtabs" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/>
</selector>