web-dev-qa-db-ja.com

AppCompat v7ツールバーonOptionsItemSelectedは呼び出されません

元のActionBarからAppCompatツールバーとsetSupportActionBar(toolbar)に変更しました。戻る矢印にgetSupportActionBar()およびsetDisplayHomeAsUpEnabled(true)を使用している場合、クリックがonOptionsItemSelectedまたは他のリスナーメソッドを呼び出すことはありません。

特別なリスナーを実装する必要がありますか?すべてがうまく機能する前に。

編集:ActionBarの初期化:

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mActionBar = getSupportActionBar();
mActionBar.setHomeButtonEnabled(true);

コンテンツをフラグメントに置き換えた後、私はこれを行います:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerToggle.setDrawerIndicatorEnabled(false);
mActionBar.setDisplayHomeAsUpEnabled(true);
41
Informatic0re

私はこの質問に回答したことを知っていますが、2日間のフラストレーションの後、問題の本当の原因を見つけました。

ActionBarDrawerToggleのドキュメントをご覧ください: https://developer.Android.com/reference/Android/support/v7/app/ActionBarDrawerToggle.html

そこに2つのコンストラクターがあることに注意してください。私の間違いは、ツールバーをパラメーターとして使用する2番目のコンストラクターを使用していたことです。ツールバーのActionBarとしてツールバーを設定している場合、構成ドキュメントの最後の行に気付くのに時間がかかりました: "ActionBarDrawerToggle(Activity、DrawerLayout、int、int)を使用してくださいアクティビティ "

最初のコンストラクターを使用した後、onOptionsItemSelected()は問題なく呼び出されました。

ここで最後の部分で説明するように、アクティビティからActionBarDrawerToggle.onConfigurationChanged()およびonOptionsItemSelected()を呼び出すことを忘れないでください: http://developer.Android.com/training/implementing-navigation/nav-drawer.html

116
Andrei Lupsa

DrawerToggleのOnClickListenerを実装する必要がありました。

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        popStackIfNeeded();
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        mActionBar.setDisplayHomeAsUpEnabled(false);
        mDrawerToggle.setDrawerIndicatorEnabled(true);
    }
});

これは私の問題を修正しました。

28
Informatic0re

SetSupportActionBar()メソッドを使用していくつかの問題がありました。また、特定のカラーテーマを無視するため、戻る矢印またはオーバーフローアイコンのスタイルを設定できません(どちらを覚えていないか)。 ActionBarの統合を廃止し、ツールバーをネイティブに使用しました。そのため、代わりに、次のようにすることができます。

通常のようにツールバーを含めるだけで、レイアウトに@ + id/toolbarのIDを使用していると想定します。

次に、コードで:

_toolbar = (Toolbar) findViewById(R.id.toolbar);
_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleNavButtonPress();
    }
});
_toolbar.setOnMenuItemClickListener(_menuItemClickListener);
_toolbar.inflateMenu(R.menu.message_list_menu);
Menu menu = _toolbar.getMenu();

この場合、_menuItemClickListenerはほぼ文字通り、現在のonOptionsItemSelected()メソッドの名前を変更できます。もうメニューがnullであるかどうかを確認する必要はありません。

メニューから項目を削除するには、単にmenu-> clear()を呼び出してください。したがって、私のonPauseで、メニューとonResumeをクリアし、それらをフラグメントに展開し、各フラグメントがonResumeでクリックハンドラーを設定します。 Androidはこのアプローチではあなたのためにそれをしないので、常にクリーンアップする必要があり、ツールバーは膨張するたびにメニューを追加し続けます。

最後に、すべての機能を有効にするには、アクションバーを完全に無効にしてスタイルから削除する必要があります。

4
reactive-core

すべてを試してみてもうまくいかない場合は、次のように独自のクリックリスナーを実装できます。

myNavList.setOnItemClickListener(new Android.widget.AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = myNavList.getItemAtPosition(position).toString();
        Toast.makeText(this, "You selected " + item, Toast.LENGTH_SHORT).show();
    }
});
0
Prof

言及されていないこと:
オプションメニューをonCreateOptionsMenで動的に作成し、そこにnullを返すと、アクションバーの上ボタンは機能しません。
何も追加せずにMenuパラメーターを返す場合は正常に機能します。

エミュレーターAPI 19でテスト済み

0
Max Izrin

私の場合、setHasOptionsMenu(true);onCreateViewで有効になっていません。これが誰かを助けることを願っています。

0
Coder Absolute