web-dev-qa-db-ja.com

引き出しレイアウトでスライド式引き出しとしてリストビュー以外のものを使用することは可能ですか?

たとえば、単独のLinearLayoutの代わりに、画面の左からRelativeLayoutまたはListViewをスライドさせたいと思います。

ÀLinearLayoutAndroid:layout_gravity="start"を使用しようとしましたが、実行時にこのエラーが発生しました。

ClassCastException: Android.widget.LinearLayout$LayoutParams cannot 
be cast to Android.support.v4.widget.DrawerLayout$LayoutParams

レイアウトファイルは次のとおりです。

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/white"
    >

    <FrameLayout
        Android:id="@+id/content_frame"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <LinearLayout 
        Android:layout_width="320dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:orientation="vertical">

        <ImageView 
            Android:id="@+id/ivwLogo"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/video_icon"
        />

        <ListView 
            Android:id="@+id/left_drawer"
            Android:layout_width="320dp"
            Android:layout_height="match_parent"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp"
            Android:background="@Android:color/white"
        />

    </LinearLayout>
</Android.support.v4.widget.DrawerLayout>

ありがとう

34
BigDan

はい、引き出しレイアウトのスライド部分として任意のビューを持つことができます。 FrameLayoutを引き出しとして宣言し、それを自分のフラグメントに置き換えることを好みます。

表示されるエラーは、おそらく実装のJava部分にある他の理由によるものです。

26
Samarth Jain

_Android:id="@+id/left_drawer"_を移動(または新しいIDを作成)して重力を設定すると、これは機能します。

Idの移動(または新しい移動)は参照が正しいため、子ビューではなくcloseDrawer()を呼び出します。

しかし、最も重要なことは、DrawerLayoutでは、前述のように、その要素に_Android:layout_gravity_が設定されている必要があります。

最後に、必要な重力を持つベースビューでclose closeDrawer()を呼び出す必要があります。

例:

_<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/white">

    <FrameLayout
        Android:id="@+id/content_frame"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <LinearLayout 
        Android:id="@+id/left_drawer"
        Android:layout_width="320dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:orientation="vertical">

        <ImageView 
            Android:id="@+id/ivwLogo"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/video_icon" />

        <ListView 
            Android:id="@+id/left_drawer_child"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp"
            Android:background="@Android:color/white" />

    </LinearLayout>
</Android.support.v4.widget.DrawerLayout>
_

コード内:

_DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout)
LinearLayout mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer);
ListView mDrawerListChild = (ListView) findViewById(R.id.left_drawer_child);

...

mDrawer.closeDrawer(mDrawerLinear);
_

(これは基本的に@Karakuriが投稿したものですが、より完全な説明と例があります。)

63
Jon Adams

isDrawerOpen, closeDrawerなどのメソッドに対して正しいオブジェクト(mDrawerLinearと呼ばれるLinearLayout)を渡すようにしてください。この行は私のClassCastExceptionを解決しました:

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);
7
Roman

ListViewの代わりにAndroid:id="@+id/left_drawer"をLinearLayoutに移動してみてください

2
Karakuri