48

セットアップ

contentView が のインスタンスであるアクティビティがありDrawerLayout、アクション バーにドロワー インジケーターが表示されたナビゲーション ドロワーがあります。アクティビティには、オプションのリストを含む が含まれています。これをFragmentと呼びましょう。ListFragmentオプションをクリックすると、 を に置き換えListFragmentますDetailFragment

アプリケーションのアーキテクチャ

この時点で、ナビゲーション ドロワー インジケーターの代わりに「上」ナビゲーション オプションを表示したいと思います。を呼び出して引き出しインジケーターを無効にすると、「上」アイコンを表示できますmDrawerToggle.setDrawerIndicatorEnabled(false)が、これは引き出しアイコンを削除するだけです。機能は削除しません。つまり、キャレットをクリックすると、ナビゲーション引き出しがまだ開いています。

さらに、これらのサブビューでは、画面の端からドラッグして引き出しを開くことを無効にしたいと考えています。呼び出してこれを実行しようとしましたsetDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)が、この機能が無効になっているようには見えません。

ActionBarDrawerToggleインジケーターがクリックされたときにドロワーが開かないようにクラスを拡張しようとしましたが、オーバーライド アクション (「上」ナビゲーション) が実行されるだけで、ドロワーはまだ開きます

フラグメント使用時の Android ナビゲーション ドロワー イメージとアップ キャレットの切り替えの手順も実装しました。キャレットを表示する限りは機能しますが、上ボタンの機能をオーバーライドしてもメニューは開きます (アプリは戻って移動しますが、ドロワーも開きます)。

質問

つまり、簡単に言えば、私のレイアウト ルートがDrawerLayout:

  1. 引き出しインジケータを「上」キャレットに置き換えます(一時的に次の方法で実行できますmDrawerToggle.setDrawerIndicatorEnabled(false))
  2. キャレットがクリックされたときに引き出しが開かないようにし、代わりに独自の「上」機能でオーバーライドします
  3. 画面の端からドラッグしたときにドロワーが開かないようにします。

編集

ActionBarDrawerToggleよし、どちらもANDをオーバーライドするとonOptionsItemSelected、キャレットをクリックしてもメニューが開かないように見えます。ただし、端からドラッグすると開きます。ヘルプ!

4

5 に答える 5

22

これは私がたどり着いた解決策の一部にすぎませんが、このバグを理解するのは非常に困難だったので、後世のためにここに残しておきます。

これは、ナビゲーション ドロワーの ListView を定義する方法です。

<ListView
    android:id="@+id/listview_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start|bottom"
    android:background="#111"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />

電話した後でもsetDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)、引き出しをスライドして開くことができました。

ただし、layout_gravity"start"この問題に変更した後は、解決されたようです。

サンプルのナビゲーション ドロワーのみのアプリでこの問題を再現できたので、私の状況に固有の再現可能な問題ではないようです。

于 2013-10-28T22:09:13.253 に答える
12

ソニダの答えに基づいています。setDrawerIndicatorEnabled(false) を呼び出した後、onNavigateUp がまだ呼び出されていませんでした。そのため、それを呼び出す新しい onClickListener を作成しました。

public void setDrawerState(boolean isEnabled) {
    if ( isEnabled ) {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        drawerToggle.setDrawerIndicatorEnabled(true);
        drawerToggle.syncState();

    }
    else {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        drawerToggle.setDrawerIndicatorEnabled(false);
        drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onSupportNavigateUp();
            }
        });
        drawerToggle.syncState();
    }
}

私も思う

drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);

減価償却されていますが、それがなくても問題なく動作します。

于 2015-08-07T21:06:52.917 に答える
2

スワイプを無効にし、アクションバーのホーム ボタンを無効にする必要があります。

スワイプを無効にするために既に指定されているコードに基づいて構築された以下のコードを使用します

  public void setDrawerState(boolean isEnabled) {
        if ( isEnabled ) {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
            mDrawerToggle.setDrawerIndicatorEnabled(true);
            mDrawerToggle.syncState();
            getActivity().getActionBar().setHomeButtonEnabled(true);

        }
        else {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            mDrawerToggle.setDrawerIndicatorEnabled(false);
            mDrawerToggle.syncState();
            getActivity().getActionBar().setHomeButtonEnabled(false);
        }
    }
于 2015-10-25T07:34:55.893 に答える