12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NavigationDrawerでDrawer内を入れ子でレイアウトする

Posted at

Navigation Drawerを使う場合、レイアウトにいろいろ制約があります。

  • DrawerLayoutの最初の子がメインコンテンツになります
  • 2番めの子がDrawerになります
  • Drawerはlayout_gravitystartが必要
  • Drawerの幅は240dp以上320dp以下でなくてはいけない

こうしてみるといろいろ制約が多くて面倒ですが、これに沿えば何もしなくてもドロワーが表示されるので、楽ちゃ楽ですね。

但し、一箇所、ハマりどころがあります。例えばドロワー内をListViewだけではなく、複雑なレイアウトにしたいと思いますよね?(威圧)

そう思って以下のように書いたりしてみます。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello World, MyActivity"/>

    <LinearLayout
        android:id="@+id/left_drawer_layout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111">

        <TextView
                android:text="sample header"
                android:textColor="#fff"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:layout_gravity="start"/>

        <Button
                android:id="@+id/left_drawer_button"
                android:layout_width="wrap_content"
                android:layout_height="48dp"
                android:layout_gravity="start"
                android:text="button"/>

        <ListView
                android:id="@+id/left_drawer_list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:divider="@android:color/transparent"
                android:dividerHeight="0dp"
                android:layout_gravity="start"
                android:choiceMode="singleChoice"/>

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

ルール上、問題無さそうですが、これで実行するとドロワーの中がLinearLayoutの最初の子であるTextViewしか表示されません。紆余曲折ありましたが解決策は単純で以下の行を追加するだけです。

    <LinearLayout
        android:id="@+id/left_drawer_layout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical" //←これ!
        android:background="#111">

ソースを追っかけて見たけど、childCount周りでおかしな制御してるようだが、わからなかった(敗北)。とりあえずこれでドロワー内を好きにレイアウトできるようになります。

12
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?