gpt4 book ai didi

android - 在 setVisible 设置为 false 然后 true 之后,ActionBar 图标不再出现在 ActionBar 上

转载 作者:太空宇宙 更新时间:2023-11-03 12:21:50 24 4
gpt4 key购买 nike

我有一个模式为 ActionBar.NAVIGATION_MODE_TABS 的 ActionBar,我想在选择不同的选项卡时更改 ActionBar 上显示的图标。

我用一个 Activity 成功地做到了,但是当我再次将它应用到另一个 Activity 时它表现得很奇怪。

假设我有 2 个选项卡:Tab1 和 Tab2,我希望相机图标在选择 Tab2 时出现,在选择 Tab1 时消失。此外,Tab1 是 Activity 开始时将选择的第一个选项卡。所以我做了这样的事情:

因为我不想在HomeActivity第一次启动时出现相机图标,所以我设置了android:visible="false",然后当我运行下面的代码时:当HomeActivity启动时,相机图标没有出现在 ActionBar 上 -> 正确,但是当我切换到 tab2 时,相机图标也没有出现在 ActionBar 上,但是如果我按下“菜单”按钮 -> 一个名为“相机”的 MenuItem 显示为溢出操作栏项目。

如果我设置 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
}

[...]

}

关于android - 在 setVisible 设置为 false 然后 true 之后,ActionBar 图标不再出现在 ActionBar 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com