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
またはDrawerLayout
sの子を追加しようとしましたが、それぞれが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
これらのメソッドが実際に機能するためにそれらに渡す必要があるものを誰かが説明できますか?
そして、答え:
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>
isDrawerOpenを呼び出すためにビューまたはレイアウトへの参照を避けたい場合は、別の方法を適用できます。
この場合、重力を指定する必要があります。
mDrawerLayout.isDrawerOpen(Gravity.START);
mDrawerLayout DrawerLayoutへの参照であること。
あなたが言ったように、Android:layout_gravity="start"
を忘れないでください
アクティビティで、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)になります。