25

私は非推奨であるため、ここでアンドロイドDrawerLayoutが提案するように自分のコードを移動しようとしています。SlidingDrawer

私の問題は、これまでのところDrawerLayout、実装が非常に悪いか、役に立たないエラーメッセージが表示されているか (防御的なプログラミングがない)、ドキュメントで十分に説明されていないように見えることです。

isDrawerOpen()メソッドはここで説明されています:

public boolean isDrawerOpen (ドロワーを表示)

指定されたドロワー ビューが現在開いている状態かどうかを確認します。「開いている」と見なされるには、引き出しが完全に見える状態になっている必要があります。部分的な可視性を確認するには、isDrawerVisible(android.view.View) を使用します。

パラメータ: drawer - チェックする引き出しビュー

指定されたドロワー ビューが開いている場合は true

各メソッドisDrawerOpen(View drawer)openDrawer(View drawer)およびcloseDrawer(View drawer)が渡された場合は機能しません:DrawerLayout問題のメソッドまたはその子のいずれか。これらのメソッドが機能できるようにするために、これらのメソッドに何を入力する必要があるのか​​ わかりません。誰か教えてくれませんか?

実装に関する問題の説明全体については、以下を参照してください。

私は次のようなレイアウトを持っています:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/mainmenuPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/dualPane"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/menuPane"
        android:layout_width="300dp"
        android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>

私のコードでは、次のメソッドをボタンに接続しています。

protected void onCreate(Bundle savedInstanceState) {    
    ...
    mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
    ....
}

public boolean isDrawerOpen() {
    if(mMenuPanel != null) {
        return mMenuPanel.isDrawerOpen(mMenuPanel);
    }
    return false;
}

ただし、それ自体を引数として指定すると (極端に冗長になります)、次のエラーが発生します。

E/AndroidRuntime(11241): java.lang.ClassCastException: 
android.widget.FrameLayout$LayoutParams cannot be cast to 
android.support.v4.widget.DrawerLayout$LayoutParams

(お気づきのように、何が間違っていたかについての情報は提供されません。代わりに、問題の症状です)。

ここまたはここでの他の回答は、理解できないか、質問に非常に密接に関連しており、あまり説明がありません。それでも、私は偽物LinearLayoutまたはDrawerLayouts の子を追加しようとしましたが、それぞれがこのエラーを出します:

E/AndroidRuntime(11424): java.lang.IllegalArgumentException: 
View android.widget.FrameLayout{420f5ea8 V.E..... ........ 
0,0-800,1172 #7f060038 app:id/menuPane} is not a drawer

これらのメソッドが実際に機能するために何を渡す必要があるかを誰かが説明できますか?

4

4 に答える 4

19

そして、答え:

2 番目の子 (別名、「引き出し」) は、メソッドに渡す必要があるものです。私の問題は、レイアウトを可能な限り単純な実装に減らしてテストしたことを理解するまでに、「引き出し」から重力を取り除いたことです。重力がないと、上記のまったく関係のないエラー メッセージが表示されます。

次のセットアップを使用して、コードが機能することを確認できます。

mMenuPanel.isDrawerOpen(findViewById(R.id.drawer));

そしてレイアウトで:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/mainmenuPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/drawer"
        android:layout_width="300dp"
        android:layout_height="match_parent" 
        android:layout_gravity="start"/> <!-- This line was the problem!!!!!!!-->
</android.support.v4.widget.DrawerLayout>
于 2013-11-29T15:58:15.040 に答える
14

isDrawerOpenを呼び出すためにビューまたはレイアウトへの参照を避けたい場合は、別の方法を適用できます。

この場合、重力を指定する必要があります:

mDrawerLayout.isDrawerOpen(Gravity.START);

mDrawerLayoutであることは、 DrawerLayoutへの参照です。

あなたが言ったように、忘れないでandroid:layout_gravity="start"

于 2014-04-11T10:51:36.740 に答える
2

アクティビティで DrawerLayout への参照がある場合、この場合は ID R.id.menuPane を持つ FrameLayout も実行できます...

DrawerLayout mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
FrameLayout mMenuPane = (FrameLayout) findViewById(R.id.menuPane);
mMenuPanel.isDrawerOpen(mMenuPane);

基本的に、常に mMenuPanel.getChildAt(1) である DrawerLayout 内の引き出しとして使用されているビューへの参照を渡す必要があります。

于 2014-01-23T22:19:14.447 に答える
-1

あなたの質問からわかるように、サポート ライブラリのドロワー レイアウトを使用している場合は、次の方法もあります。

closeDrawers()

これにより、開いているすべての引き出し (通常は 1 つだけ) が閉じます。

于 2016-03-17T12:40:52.043 に答える