3

そのため、上部にいくつかのタブがあるナビゲーションバーを持つ Android アプリに取り組んでおり、その部分は正常に動作していますが、今ではさまざまなフラグメントからアクションバーにメニュー項目を動的に追加できるようにしたいと考えています (いくつかのフラグメントには異なるオプションが利用できる場合があります)。これまでのところ、何を試しても、onCreateOptionsMenu を呼び出すことができないようです。これが私がこれまでに持っているものです

//First I have a holder class that is used to navigate between the different Fragment Tabs
 public class ActionHolder extends SherlockFragmentActivity implements ActionBar.TabListener {....
//And then I have this method for switching Fragments based on what Tab is selected
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
    int selectedTab = tab.getPosition();

    if (selectedTab == 0) {
        SalesMainScreen salesScreen = new SalesMainScreen();
        ft.replace(R.id.content, salesScreen);
    }
    else if (selectedTab == 1) {
        ClientMainScreen clientScreen = new ClientMainScreen();
        ft.replace(R.id.content, clientScreen);
    }.....

ここで、いくつかのメニュー項目をアクション バーに追加したいタブのフラグメント (SalesMainScreen) の 1 つを示します。

 @Override
public void onCreate (Bundle savedInstanceState) {
    Log.i("message","the oncreate method was called");
    setHasOptionsMenu(true);
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
    return inflater.inflate(R.layout.salesmainscreen, group, false);
}

@Override
 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.i("message", "the oncreatemenu method called");
    inflater.inflate(R.menu.menu_refresh, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

OnCreate Log メッセージが呼び出されていますが、onCreateOptionsMenu Log がまったく呼び出されていません。また、インポートによって問題が発生することもありますが、Sherlock メニューとメニュー インフレータをインポートすると、互換性がないという OnCreateOptionMenu メソッドであらゆる種類のエラー メッセージが表示されます。このセットアップで、メニュー項目をアクション バーに動的に追加することは可能ですか? または、項目を追加するだけで、表示されているフラグメントに適用されない項目に対してアクションを実行しないでください。

4

1 に答える 1

5

SherlockActionBarと タブを使用するアプリがあり、各タブにはSherlockFragment. メイン アクティビティにはアクション バーに独自のメニューがあり、フラグメントの 1 つが検索項目をアクション バー メニューに追加します。

主な活動は次のとおりです。

class MainActivity extends SherlockFragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...        
        ActionBar bar = getSupportActionBar();
        bar.addTab(createThingOneTab());
        bar.addTab(createThingTwoTab());
        bar.addTab(createThingThreeTab());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.activity_main, menu);
    }

}

タブのフラグメントには次のものがあります。

class ThingOneFragment extends SherlockFragment {

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

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        MenuItem search = menu.add("Search");
        search.setIcon(android.R.drawable.ic_menu_search);
        search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        ...
    }

}

メイン アクティビティを開始すると、ThingOneFragmentデフォルトでタブが表示され、アクション バーに検索アイコンが表示されます。他のタブを選択すると、検索アイコンが消えます。MenuMenuInflaterなどに Sherlock クラスを使用していることを確認する必要があります。

それが違いを生むかどうかはわかりませんが、私のTabListener見た目は次のようになります。

private TabListener createTabListener(final Class<? extends Fragment> clazz) {
    return new TabListener() {

        private Fragment mFragment;

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // no action
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            if (mFragment == null) {
                mFragment = Fragment.instantiate(activity, clazz.getName());
            }
            getSupportFragmentManager().beginTransaction()
                                       .replace(android.R.id.content, mFragment)
                                       .commit();
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // no action
        }
    };

それが問題の原因なのか、タブを処理する正しい方法なのかはわかりませんが、完全を期すために含めています。

于 2012-12-09T23:42:24.663 に答える