web-dev-qa-db-ja.com

v4.widget.DrawerLayout.isDrawerOpen()/。openDrawer()/。closeDrawer()に何を渡す必要がありますか

DrawerLayoutは非推奨であるため、Android here )で提案されているように、コードを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の子を追加しようとしましたが、それぞれがthisエラーを出します:

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

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

24
Graeme

そして、答え:

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>
19
Graeme

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

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

mDrawerLayout.isDrawerOpen(Gravity.START);

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

あなたが言ったように、Android:layout_gravity="start"を忘れないでください

14
Jose M Lechon

アクティビティで、DrawerLayoutへの参照があり、この場合はIDがR.id.menuPaneのFrameLayoutである場合は、次のこともできます...

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

基本的に、DrawerLayout内でドロワーとして使用されているビューへの参照を渡す必要があります。これはとにかく常にmMenuPanel.getChildAt(1)になります。

2
speedynomads