【问题标题】:DrawerLayout with ListView does not process item clicks on Samsung Tab/Android 5.0.2带有 ListView 的 DrawerLayout 不处理三星 Tab/Android 5.0.2 上的项目点击
【发布时间】:2016-03-10 05:06:36
【问题描述】:

我在我的主要活动(扩展 AppCompatActivity)中使用 android.support.v4.widget.DrawerLayout 和 com.android.support:appcompat-v7 来提供导航抽屉,并在抽屉内使用 ListView 来呈现用户可点击的项目。

除了在运行 Android 5.0.2Samsung Tab 设备上,这一切都运行良好。

代码已经过测试,可以在从 4.2.1 到 6.0.1 的各种 Android 版本上按预期运行,并且在运行 5.0.2 的模拟器上运行良好。

在三星设备上,导航抽屉在点击时会消失,但新活动(例如,MyPreferenceActivity 或 HelpPageActivity,在下面的代码中)永远不会显示。

我的问题:代码或布局有什么不正确的地方可能导致它无法在三星 Tab/5.0.2 设备上运行吗?

主要活动如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" android:gravity="fill"
    android:background="@color/standard_bkgnd">

<include
    android:id="@+id/toolbar_actionbar"
    layout="@layout/toolbar_actionbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/toolbar_actionbar"
    >

    <!-- normal content view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        ...main UI stuff...
    </LinearLayout>

    <!-- drawer view -->
    <include layout="@layout/nav_drawer" />

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

</LinearLayout>

nav_drawer 布局如下:

    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="280dp"
    android:layout_height="match_parent"
    android:background="@color/button_material_dark"
    android:orientation="vertical"
    android:layout_gravity="start">

    <RelativeLayout
        android:id="@+id/drawer_header"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@color/material_blue_grey_800"
        android:padding="8dp" >

        <ImageView
            android:id="@+id/app_icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/ic_launcher_08"
            android:layout_marginTop="15dp"
            android:contentDescription="@string/app_icon"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="42dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="15dp"
            android:layout_toRightOf="@+id/app_icon"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/app_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/app_name"
                android:textColor="#fff"
                android:textSize="16sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/desc"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginTop="4dp"
                android:text="@string/app_long_name"
                android:textColor="#fff"
                android:textSize="12sp" />
        </LinearLayout>
    </RelativeLayout>

    <ListView
        android:id="@+id/nav_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/drawer_header"
        android:choiceMode="singleChoice"/>

</RelativeLayout>

ListView 被配置为显示一些项目,用户可以单击这些项目来查看应用程序中的其他内容,或执行其他活动:

// Drawer Item click listeners
    drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            switch (position) {
                case 0: // preferences
                    startActivity(new Intent(that, MyPreferenceActivity.class));
                    break;
                case 1: // help
                    startActivity(new Intent(that, HelpPageActivity.class));
                    break;
                case 2: // send feedback
                    composeEmail();
                    break;
                default:
                    break;
            }

            _drawerLayout.postDelayed(new Runnable() {
                @Override
                public void run() {
                    _drawerLayout.closeDrawers();
                }
            }, 500);

            drawerList.clearChoices();

        }
    });

非常感谢任何建议!

【问题讨论】:

  • 什么是_drawerLayout.postDelayed()?你能把它踢出来再测试一下吗?
  • @XxGoliathusxX - 它旨在在短暂延迟后关闭导航抽屉。我会毫不拖延地尝试一下。希望我有一个可以测试它的设备 - 我现在依赖 Beta 测试人员的报告来获取这个特定的 HW/OS 组合。

标签: android android-layout listview android-5.0-lollipop drawerlayout


【解决方案1】:

因此,事实证明这毕竟与三星 Tab/5.0.2 没有任何关系 - 巧合的是,我收到的唯一问题报告来自这些设备。

问题是我的主要活动的横向布局具有正常内容视图和抽屉视图的顺序颠倒,这阻止了 ListItems 接收点击事件:

<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar_actionbar"
>

<!-- normal content view -->
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    ...main UI stuff...
</LinearLayout>

<!-- drawer view *** this must come after the normal content view *** -->
<include layout="@layout/nav_drawer" />

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

我一切换它们,事情就按预期工作了。呵呵。

【讨论】:

  • 但是如果你把抽屉放在内容下面,它会在不理解海拔高度的 Android 4 上中断,不是吗?
  • @EugenPechanec - 似乎在 4.2.1 和 4.4.2 上都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多