Возможно ли использовать что-либо, кроме списка, как скользящий ящик в 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>
Спасибо
Ответы
Ответ 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