layout_weight在Drawerlayout中不使用LinearLayout

时间:2014-07-27 05:16:34

标签: android android-layout android-linearlayout drawerlayout

使用DrawerLayout时,我正在努力使用LinearLayout。这是使用Draw StudioLayout的Android Studio模板:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyActivity">

<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:background="#00f"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
    <LinearLayout
        android:background="#f00"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0">
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0" />
    </LinearLayout>
</LinearLayout>

<!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     If you're not building against API 17 or higher, use
     android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
     the container. -->
<fragment android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:name="com.test.testdrawerlayout.NavigationDrawerFragment"
    tools:layout="@layout/fragment_navigation_drawer" />

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

Android Studio中的预览显示:

http://imgur.com/UlPGzJS

但是,在我的Nexus 5上运行时,显示如下:

http://imgur.com/w4QeGbB

如您所见,layout_weight =&#34; 1&#34;部分根本没有显示。当我使用内部LinearLayout创建一个空白项目时,布局工作(蓝色布局占据屏幕的大部分,底部是红色布局,就像预览一样)。

任何想法都会非常感激,因为我现在完全被困住了。提前谢谢。

3 个答案:

答案 0 :(得分:1)

看来我使用的是较旧的Android SDK平台。一旦我进入SDK管理器并安装了API 19,它就可以工作了(使用新项目)。

也许这是旧版实施中的错误?

答案 1 :(得分:1)

这绝对是Android问题(或至少是appcompat/design库问题)。我在DrawerLayout中测试了不同的布局,并得出结论,问题是&#34; content_layout&#34;文件 - 显示在抽屉下方的文件。

只使用干净,简单的FrameLayout工作。没有CoordinatorLayout,没有片段,没有自定义布局,也没有第三方布局,只是一个很好的旧FrameLayout&#34; match_parent&#34;宽度和高度。

答案 2 :(得分:0)

  1. 在drawerlayout中你应该有一个FrameLayout,其中包含你屏幕的主要内容,在大多数情况下你也应该有一个ListView来保存导航抽屉的内容。
  2. 应该是这样的:

    <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">
        <!-- The main content view -->
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <!-- The navigation drawer -->
        <ListView android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#111"/>
    </android.support.v4.widget.DrawerLayout>
    
    1. 现在将LinearLayout放在FrameLayout中。可以将FrameLayout视为保存主屏幕的“容器”。
    2. 请注意官方Android文档说明

        

      主要内容视图(上面的FrameLayout)必须是第一个   DrawerLayout中的子项,因为XML顺序意味着   z-ordering和抽屉必须位于内容之上。

      有关更多参考和信息,建议您点击here查看此链接。

      如果它解决了您的问题,请将此标记为答案。谢谢。

      <强>更新

      好的,首先,从你的linearlayout中删除“xmlns:android =”http://schemas.android.com/apk/res/android“”。这应该只出现一次并在主根xml中,这导致DrawerLayout。

      接下来,修复您使用权重的方式。声明一个android:weightSum属性。把weightSum想象成一个馅饼。在这种情况下,我们将它设置为5,所以我们有5个馅饼。使用android:layout_weight属性在此布局中的任何内容。第一个设置为4,将占用屏幕的4/5。最后一个是底部屏幕的1/5。

      确保此LinearLayout仍然包含在FrameLayout中。您的LinearLayout应如下所示:

      <LinearLayout
          android:id="@+id/container"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical"
          android:weightSum="5">
          <LinearLayout
              android:background="#00f"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="4"/>
          <LinearLayout
              android:background="#f00"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_weight="1">
              <EditText
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_weight="0" />
          </LinearLayout>
      </LinearLayout>