0

アプリケーションのコンテキストに基づいて、ActionBarItem を ActionBar からオプション メニューに移動できるようにしたいと考えています。

以下のアクティビティには 2 つのメニュー項目があります。1 つは ActionBar で ALWAYS_SHOW に設定され、もう 1 つは ActionBar に表示しないように設定されています。アクティビティのレイアウトには、ボタンが 1 つ含まれています。このボタンをクリックすると、ActionBar ボタンはオプション メニュー (ActionBar に表示されている場合) に移動するか、ActionBar (オプション メニューにある場合) に移動する必要があります。

このアクティビティは、ハニカムで期待どおりに機能します。ただし、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>
4

1 に答える 1

0

わかりました、私はこれを理解しました。2つの問題がありました。ICSでは、setShowAsActionを呼び出したときにonCreateOptionsMenuがトリガーされず、次にonCreateOptionsMenuが呼び出されたときに設定したshowAsAction値がactionbarButton保持されません。invalidateOptionsMenuこの問題は、を呼び出した後に追加することで修正されsetShowAsActionます。2番目の問題は、メニューが拡張された後に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);
    }
}
于 2012-06-21T15:27:59.617 に答える