Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 操作栏图标不显示';设置Visible为false后,t再次出现在ActionBar上,然后为true_Android_Android Actionbar_Actionbarsherlock - Fatal编程技术网

Android 操作栏图标不显示';设置Visible为false后,t再次出现在ActionBar上,然后为true

Android 操作栏图标不显示';设置Visible为false后,t再次出现在ActionBar上,然后为true,android,android-actionbar,actionbarsherlock,Android,Android Actionbar,Actionbarsherlock,我有一个带有模式操作栏的操作栏。导航\u模式\u选项卡,当我选择不同的选项卡时,我想更改操作栏上显示的图标 我在一个活动中成功地做到了这一点,但当我在另一个活动中再次应用它时,它表现得很奇怪 假设我有两个选项卡:Tab1和Tab2,我希望在选择Tab2时出现相机图标,在选择Tab1时消失。此外,Tab1是活动开始时选择的第一个选项卡。 所以我做了这样的事情: @Override public boolean onOptionsItemSelected ( MenuItem item ) {

我有一个带有模式
操作栏的操作栏。导航\u模式\u选项卡
,当我选择不同的选项卡时,我想更改操作栏上显示的图标

我在一个活动中成功地做到了这一点,但当我在另一个活动中再次应用它时,它表现得很奇怪

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

@Override
public boolean onOptionsItemSelected ( MenuItem item )
{
    if ( item.getItemId ( ) ==   R.id.edit_action  )
    {
        isEditMode ( true ) ;
        optionsMenu.findItem ( R.id.edit_action ).setVisible ( false );
        optionsMenu.findItem ( R.id.save_action ).setVisible ( true );
    }...
因为我不想在HomeActivity第一次启动时出现摄像头图标,所以我设置了
android:visible=“false”
,然后当我运行下面的代码:当HomeActivity启动时,摄像头图标不会出现在ActionBar->correct上,但当我切换到tab2时,摄像头图标也不会出现在ActionBar上,但如果我按“菜单”按钮->一个菜单项作为“摄像头”显示为溢出操作栏项

如果我设置了
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>
Tab1Fragment.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;
    }
}
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
        }       
    }
}
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
        }       
    }   
}
Tab2Fragment.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;
    }
}
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
        }       
    }
}
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
        }       
    }   
}

经过一些调查,我认为这是一个bug,但我不知道它是ActionBarSherlock的bug还是Android ActionBar的bug

原因

这是因为选项菜单中只有一个菜单项,假设菜单项是mItem。当我设置
mItem.setVisible(false)
时,ActionBar上将没有剩余的项目,显然,包含ActionBar菜单项的空间将被删除。之后,当我设置
mItem.setVisible(true)
时,空间不会恢复,在这种情况下,我的
mItem
被视为溢出菜单项->仅在使用设备的菜单硬件按钮时才会显示

解决方案

  • 使用多个菜单项
  • 巧妙地,使用
    setEnable(false)
    setIcon(null)
    setTitle(“”)的组合,而不是
    setVisible(false)

我也遇到了同样的问题,并找到了一个简单的解决方案:只需在活动中实现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 
    }

    [...]

}

我也面临同样的问题,并以这种方式解决:

首先,我保存com.actionbarsherlock.view.Menu时,onCreateOptions菜单(菜单菜单菜单)

然后我每天都去登记

public boolean onOptionsItemSelected ( MenuItem item )
这样称呼:

@Override
public boolean onOptionsItemSelected ( MenuItem item )
{
    if ( item.getItemId ( ) ==   R.id.edit_action  )
    {
        isEditMode ( true ) ;
        optionsMenu.findItem ( R.id.edit_action ).setVisible ( false );
        optionsMenu.findItem ( R.id.save_action ).setVisible ( true );
    }...

希望这有帮助。

我也有同样的问题,我发现
setVisible(true)
在至少有另一个
MenuItem
可见时起作用。我希望这能对某人有所帮助。

很好!对我有用@LeoLink的解决方案很好,但setTitle(“”)会导致分配和显示额外的空间,这会导致进度条向左移动。重新实现onPreparePanel()没有这样的缺点。