3

私は mode の ActionBar を持っていActionBar.NAVIGATION_MODE_TABSます。別のタブを選択したときに ActionBar に表示されるアイコンを変更したいと思います。

アクティビティで成功しましたが、別のアクティビティに再度適用すると奇妙な動作をしました。

Tab1 と Tab2 の 2 つのタブがあり、Tab2 が選択されているときにカメラ アイコンを表示し、Tab1 が選択されているときにカメラ アイコンを非表示にしたいとします。さらに、Tab1 は、アクティビティの開始時に選択される最初のタブです。だから私はこのようなことをしました:

HomeActivity の初回起動時にカメラ アイコンを表示したくないので、android:visible="false"以下のコードを実行すると、次のように設定しました。 tab2、カメラアイコンもActionBarに表示されませんが、「メニュー」ボタンを押すと、「カメラ」であるMenuItemがオーバーフローアクションバーアイテムとして表示されます。

そして、私が設定した場合android:visible="true"->初めてHomeActivityの開始時にカメラアイコンが表示されることを除いて(間違っています!!!)->タブ1/タブ2を変更すると、カメラアイコンが消えたり正しく表示されます。

誰でも説明して、正しく機能させるための解決策を教えてください。ありがとう!

これは私のコードです:

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
        }       
    }   
}
4

4 に答える 4

3

調査の結果、これはバグだと思いますが、ActionBarSherlock のバグなのか Android ActionBar のバグなのかわかりません。

理由

その理由は、オプション メニューに MenuItem が 1 つしかないためです。MenuItem が mItem だとしましょう。を設定mItem.setVisible(false)すると、ActionBar にアイテムが残らず、どうやら ActionBar MenuItems を含むスペースが削除されます。その後、 を設定するmItem.setVisible(true)と、スペースは復元されません。その場合、mItemオーバーフロー MenuItem と見なされます -> デバイスのメニュー ハードウェア ボタンを使用した場合にのみ表示されます。

解決

  • 複数の MenuItem を使用する
  • 微妙に、の代わりにsetEnable(false)andsetIcon(null)との組み合わせを使用しますsetTitle("")setVisible(false)
于 2012-11-28T17:57:46.683 に答える
0

私は同じ問題を抱えていましたsetVisible(true)が、少なくとも別のものがMenuItem表示されている場合に機能することがわかりました。これが誰かの役に立てば幸いです。

于 2014-01-30T10:23:44.857 に答える
0

私は同じ問題に直面し、この方法で解決しました:

まず、 onCreateOptionsMenu(Menu menu) のときに com.actionbarsherlock.view.Menu を保存します

@Override
public boolean onCreateOptionsMenu ( Menu menu )
{
    ShowOrEditTaskActivity.this.getSupportMenuInflater().inflate(R.menu.edit_or_show_task_menu, menu);
    setOptionsMenu ( menu );
    optionsMenu.findItem ( R.id.save_action ).setVisible ( false );
    return super.onCreateOptionsMenu ( menu ) ;
}

それから私は毎回チェックインします

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 );
    }...

お役に立てれば..

于 2013-11-30T06:14:40.113 に答える