Подтвердить что ты не робот

Возможно ли использовать что-либо, кроме списка, как скользящий ящик в drawerlayout

Я хотел бы иметь, например, LinearLayout или RelativeLayout, скользящий слева от экрана вместо одиночного ListView.

Я попытался использовать à LinearLayout с android: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>

Спасибо

4b9b3361

Ответ 1

Да, в качестве скользящей части макета выдвижного ящика можно иметь любой вид. Я предпочитаю объявлять FrameLayout в качестве ящика и заменять его своим фрагментом, и он отлично работает.

Ошибка, которую вы получаете, вероятно, связана с какой-то другой причиной в Java-части вашей реализации.

Ответ 2

Это будет работать, если вы переместите как android:id="@+id/left_drawer" (или создайте новый идентификатор), так и установите гравитацию.

Перемещение 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 отправил, но с более полным объяснением и примером.)

Ответ 3

Убедитесь, что вы передали правильный объект (ваш LinearLayout, называемый mDrawerLinear) для таких методов, как isDrawerOpen, closeDrawer и т.д. Эта строка разрешила мой ClassCastException:

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);

Ответ 4

Попробуйте переместить android:id="@+id/left_drawer" в LinearLayout вместо ListView