RecyclerView 在 DrawerLayout 关闭时获得焦点
RecyclerView Becomes Focused when DrawerLayout is Closed
这是我发现的一个奇怪的错误。
但是如果我在片段中有一个 RecyclerView,然后打开然后关闭我的 DrawerLayout,我的 RecyclerView 就会成为焦点。这意味着关闭我的 DrawerLayout 将导致 ScrollView 跳转到我的 RecyclerView。显然,我希望 ScrollView 的位置在 DrawerLayout 关闭时不会移动,并且绝对不会停留在我的 RecyclerView 上。
代码
在我的整个应用程序中,我将 RecyclerView 包含在 ScrollView 中,类似于此设置:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="180dp">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/header_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:tint="#80000000"
android:scaleType="centerCrop"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true">
<TextView android:id="@+id/header_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:textColor="@color/text_SecondaryColor"
android:textSize="@dimen/header_xxlarge"/>
<View android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="@dimen/hr_thick"
android:background="@color/accent_PrimaryColor"/>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_margin="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/button_more"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:layout_width="400px"
android:layout_height="100px"
android:layout_gravity="center"
android:gravity="center"
android:background="@drawable/button_dark"
android:textColor="@drawable/button_dark_textcolor"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
而我的 DrawerLayout 的 XML 设计是这样安排的:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:layout_height="wrap_content"
android:layout_width="match_parent"
layout="@layout/toolbar" />
</LinearLayout>
<FrameLayout
android:id="@+id/contentframe"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/background_Secondary">
<!-- Relative Layout : Back Button -->
<RelativeLayout
android:id="@+id/menu_backcontainer"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<ImageView
android:id="@+id/menu_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:src="@drawable/angle"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<!-- List View : Menu Drawer Content -->
<ListView
android:id="@+id/menu"
android:layout_below="@id/menu_backcontainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:background="@color/background_PrimaryDarkColor">
</ListView>
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
我不确定我还需要在此处包含哪些其他 Java 代码,但这就是我实例化 RecyclerView 的方式:
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
对于我的 DrawerLayout:
drawerlayout = (DrawerLayout)findViewById(R.id.drawer);
menu = (ListView)findViewById(R.id.menu);
MenuAdapter adapter = new MenuAdapter(
this,
R.layout.listview_menuitem,
menuItemArray);
menu.setAdapter(adapter);
menu.setOnItemClickListener(new menuItemClickListener());
menuToggle = new ActionBarDrawerToggle(
this,
drawerlayout,
toolbar,
R.string.app_name,
R.string.app_name);
drawerlayout.setDrawerListener(menuToggle);
menuToggle.syncState();
哎呀,离开电脑一会儿喝杯咖啡的效果真是太棒了。
我只是将 FrameLayout 的 focusableInTouchMode
属性设置为 true
。
我想当我在打开 DrawerLayout 后触摸屏幕上的任何地方时,这会使 RecyclerViews 成为 ScrollView 中的焦点元素的愿望无效。也许有更好、更彻底的解释。但我希望这可以帮助其他可能遇到此问题的人。
这是我发现的一个奇怪的错误。
但是如果我在片段中有一个 RecyclerView,然后打开然后关闭我的 DrawerLayout,我的 RecyclerView 就会成为焦点。这意味着关闭我的 DrawerLayout 将导致 ScrollView 跳转到我的 RecyclerView。显然,我希望 ScrollView 的位置在 DrawerLayout 关闭时不会移动,并且绝对不会停留在我的 RecyclerView 上。
代码
在我的整个应用程序中,我将 RecyclerView 包含在 ScrollView 中,类似于此设置:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="180dp">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/header_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:tint="#80000000"
android:scaleType="centerCrop"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true">
<TextView android:id="@+id/header_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:textColor="@color/text_SecondaryColor"
android:textSize="@dimen/header_xxlarge"/>
<View android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="@dimen/hr_thick"
android:background="@color/accent_PrimaryColor"/>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_margin="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/button_more"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:layout_width="400px"
android:layout_height="100px"
android:layout_gravity="center"
android:gravity="center"
android:background="@drawable/button_dark"
android:textColor="@drawable/button_dark_textcolor"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
而我的 DrawerLayout 的 XML 设计是这样安排的:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:layout_height="wrap_content"
android:layout_width="match_parent"
layout="@layout/toolbar" />
</LinearLayout>
<FrameLayout
android:id="@+id/contentframe"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/background_Secondary">
<!-- Relative Layout : Back Button -->
<RelativeLayout
android:id="@+id/menu_backcontainer"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<ImageView
android:id="@+id/menu_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:src="@drawable/angle"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<!-- List View : Menu Drawer Content -->
<ListView
android:id="@+id/menu"
android:layout_below="@id/menu_backcontainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:background="@color/background_PrimaryDarkColor">
</ListView>
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
我不确定我还需要在此处包含哪些其他 Java 代码,但这就是我实例化 RecyclerView 的方式:
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
对于我的 DrawerLayout:
drawerlayout = (DrawerLayout)findViewById(R.id.drawer);
menu = (ListView)findViewById(R.id.menu);
MenuAdapter adapter = new MenuAdapter(
this,
R.layout.listview_menuitem,
menuItemArray);
menu.setAdapter(adapter);
menu.setOnItemClickListener(new menuItemClickListener());
menuToggle = new ActionBarDrawerToggle(
this,
drawerlayout,
toolbar,
R.string.app_name,
R.string.app_name);
drawerlayout.setDrawerListener(menuToggle);
menuToggle.syncState();
哎呀,离开电脑一会儿喝杯咖啡的效果真是太棒了。
我只是将 FrameLayout 的 focusableInTouchMode
属性设置为 true
。
我想当我在打开 DrawerLayout 后触摸屏幕上的任何地方时,这会使 RecyclerViews 成为 ScrollView 中的焦点元素的愿望无效。也许有更好、更彻底的解释。但我希望这可以帮助其他可能遇到此问题的人。