Android:在ICS中,如何将ActionBar项从Action Bar移动到选项菜单?

时间:2012-06-21 14:36:04

标签: android

我希望能够根据我的应用程序的上下文将ActionBarItem从ActionBar移动到选项菜单。

以下活动有2个菜单项。 1在ActionBar中设置为ALWAYS_SHOW,另一个在ActionBar中设置为NEVER显示。 Activity的布局包含一个按钮。单击此按钮时,ActionBar按钮应移动到选项菜单(如果它显示在ActionBar中)或应移动到ActionBar(如果它在选项菜单中)。

此活动在Honeycomb上按预期工作。但是,调用MenuItem.setShowAsAction方法对ICS没有影响。 MenuItem.setVisible会隐藏/显示ICS中的ActionBar项目,但不会导致项目移动到选项菜单。任何想法如何使这项工作在ICS?

public class TempProjActivity extends Activity implements OnClickListener
{
    Button hideButton;
    MenuItem actionbarButton;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        hideButton = (Button) findViewById(R.id.showhidebutton);
        hideButton.setOnClickListener(this);

    }

    boolean visible = true;
    @Override
    public void onClick(View v)
    {
        if(visible)
        {
            actionbarButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
            visible = false;
        }
        else
        {
            actionbarButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
            visible = true;
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.optionsmenu, menu);

        actionbarButton = menu.findItem(R.id.actionbarbutton);

        return super.onCreateOptionsMenu(menu);
    }
}


<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/actionbarbutton"
          android:icon="@drawable/ic_launcher"
          android:text="@string/button"
          android:showAsAction="always"/>
       <item 
           android:text="@string/extra"
          android:showAsAction="never"/>
</menu>


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFFFF"
    android:orientation="horizontal" >
    <Button android:id="@+id/showhidebutton" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>
</FrameLayout>

1 个答案:

答案 0 :(得分:0)

好的,我弄清楚了。有两个问题:在ICS上,当我调用setShowAsAction时没有触发onCreateOptionsMenu,并且下次调用onCreateOptionsMenu时,我没有保留我在actionbarButton上设置的showAsAction值。通过在调用invalidateOptionsMenu后添加setShowAsAction来解决此问题,通过在菜单膨胀后重新设置showAsAction值来解决第二个问题。

public class TempProjActivity extends Activity implements OnClickListener
{
    Button hideButton;
    MenuItem actionbarButton;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        hideButton = (Button) findViewById(R.id.showhidebutton);
        hideButton.setOnClickListener(this);

    }

    boolean visible = true;
    @Override
    public void onClick(View v)
    {
        if(visible)
        {
            visible = false;
            invalidateOptionsMenu();
        }
        else
        {
            visible = true;
            invalidateOptionsMenu();
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.optionsmenu, menu);

        actionbarButton = menu.findItem(R.id.actionbarbutton);

        if(visible)
        {
            actionbarButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        }
        else
        {
            actionbarButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
        }

        return super.onCreateOptionsMenu(menu);
    }
}