我有一个ActionBar模式ActionBar.NAVIGATION_MODE_TABS,当我选择不同的标签时,我想更改ActionBar上显示的图标. 我使用Activity成功完成了它,但是当我再次在另一个Activity上应用它时,它表现得很奇怪
我使用Activity成功完成了它,但是当我再次在另一个Activity上应用它时,它表现得很奇怪.
假设我有两个标签:Tab1和Tab2,我想在选择Tab2时显示一个Camera图标,并在选择Tab1时消失.而且,Tab1是活动开始时将选择的第一个选项卡.
所以我做了这样的事情:
因为我不想在HomeActivity第一次启动时出现相机图标,所以我设置android:visible =“false”,然后当我在代码下面运行时:当HomeActivity启动时,相机图标不会出现在ActionBar上 – > ;正确,但是当我切换到tab2时,摄像头图标也没有出现在ActionBar上,但如果我按下“菜单”按钮 – > MenuItem是“Camera”,显示为溢出操作栏项.
如果我设置android:visible =“true” – >除了第一次HomeActivity开始时第一次出现相机图标(不正确!!!) – >当我更改tab1 / tab2时,相机图标会消失/正确显示.
任何人都可以解释并给我一个解决方案,使其正常工作.
谢谢!
这是我的代码:
actionbar_home.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/actionbar_home_camera" android:title="@string/actionbar_rc_camera" android:icon="@drawable/ic_action_camera" android:showAsAction="always" android:visible="false"/> </menu>
HomeActivity.java
public class HomeActivity extends SherlockFragmentActivity { private ActionBar actionBar; private Menu menu; private Tab1Fragment tab1Fragment; private Tab2Fragment tab2Fragment; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); this.configActionBar(); this.createTabs(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.actionbar_home, menu); this.menu = menu; // pass objects to tabs tab1Fragment.setOptionMenu(this.menu); tab2Fragment.setOptionMenu(this.menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } private void configActionBar() { actionBar = this.getSupportActionBar(); // below line makes application icon in top-left corner become a button actionBar.setHomeButtonEnabled(true); // below line add an arrow "<" before the top-left icon //ab.setDisplayHomeAsUpEnabled(true); //actionBar.setDisplayShowTitleEnabled(true); } private void createTabs() { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab1 = actionBar.newTab().setText( Const.TAB_TITLE_HOME_TAB1); ActionBar.Tab tab2 = actionBar.newTab().setText( Const.TAB_TITLE_HOME_TAB2); // create the two fragments we want to use for display content tab1Fragment = new Tab1Fragment(); tab2Fragment = new Tab2Fragment(); // add listener tab1.setTabListener( new HomeTabListener(tab1Fragment)); tab2.setTabListener( new HomeTabListener(tab2Fragment)); actionBar.addTab(tab1); actionBar.addTab(tab2); } }
BaseTabFragment.java
public class BaseTabFragment extends SherlockFragment{ protected View root; protected Menu optionMenu; protected SherlockFragmentActivity container; public Menu getOptionMenu() { return optionMenu; } public void setOptionMenu(Menu optionMenu) { this.optionMenu = optionMenu; } public SherlockFragmentActivity getContainer() { return container; } public void setContainer(SherlockFragmentActivity container) { this.container = container; } }
Tab1Fragment.java
public class Tab1Fragment extends BaseTabFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment root = inflater.inflate(R.layout.tab1_layout, container, false); this.changeActionBarLayout(); return root; } private void changeActionBarLayout() { try { this.optionMenu.findItem(R.id.actionbar_home_camera) .setVisible(false); } catch (NullPointerException e) { // e will be thrown at the first time MainActivity is called } } }
Tab2Fragment.java
public class Tab2Fragment extends BaseTabFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment root = inflater.inflate(R.layout.tab2_layout, container, false); this.changeActionBarLayout(); return root; } private void changeActionBarLayout() { try { this.optionMenu.findItem(R.id.actionbar_home_camera) .setVisible(true); // Camera Icon still doesn't appear on ActionBar even when I set it as SHOW_AS_ACTION_ALWAYS this.optionMenu.findItem(R.id.actionbar_home_camera) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } catch (NullPointerException e) { // e will be thrown at the first time MainActivity is called } } }我遇到了同样的问题并找到了一个简单的解决方案:只需在Activity中实现onPreparePanel,即使所有项都不可见,也返回true.
public class HomeActivity extends SherlockFragmentActivity { [...] @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { super.onPreparePanel(featureId, view, menu); // this returns false if all items are hidden return true; // return true to prevent the menu's deletion } [...] }