1

我的应用程序基于选项卡式布局,其中每个选项卡都分配了一个 FragmentActivity。
其中一项活动具有以下布局:

<FrameLayout
android:id="@+id/filialenView"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

<ListView android:layout_height="wrap_content" android:id="@+id/filialList"
  android:layout_width="fill_parent"></ListView>

</FrameLayout>

切换到该选项卡时,会创建并显示一个列表。
如果选择了列表项,则会创建一个 Fragment 并显示在列表顶部:

    Filiale fragment = new Filiale();
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.replace(R.id.filialenView, fragment);

    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

Fragment Filiale的布局“filial_detail.xml”看起来像

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
 ... content...
</LinearLayout>

并像这样在 onCreateView 中膨胀

View curView = inflater.inflate(R.layout.filial_detail, container, false);

一切都按预期工作,除了切换到 Fragment 后,不再可见的列表似乎保持输入焦点。如果我在某个“空白”区域触摸屏幕,片段后面的隐藏列表项就会触发。此外,如果我滑动,我可以从 LogCat 输出中看到列表滚动。
根据我对 FrameLayout 的理解,这样堆叠视图应该没问题。

那个代码有什么问题?

由于还没有答案或评论,一个更普遍的问题:
是否有任何已知的情况,背景中的视图应该接收输入,或者在任何情况下都是错误的行为?

4

1 回答 1

1

这种行为的原因是默认情况下 ViewGroups 不处理输入事件,而是将它们传递给它们后面的小部件(如果有的话)。
在我给定的代码中,列表的高度为“wrap_content”,因此剩余的垂直区域仅由将输入传递到隐藏片段的 LinearLayout 元素覆盖。
我想要的行为可以通过

  • 将 listView 的高度设置为“fill_parent”或
  • 使用空的 onClick 方法将 OnClickListener 添加到 LinearLayout
于 2011-06-03T20:23:11.977 回答