1

我们生成了几个 ListViews 来保存用户信息以过滤另一个片段中的信息。它工作正常,除非您暂停并恢复应用程序(例如,将其置于后台或锁定屏幕)。一旦你这样做,列表可以滚动,但不能点击。

列表生成代码:

private View addList(LayoutInflater inflater, ViewGroup container, final FilterValue.SearchCategory type, final String[] labels) {
    ArrayAdapter<String> adapter = generateArrayAdapter(inflater, labels, type);
    if(adapter == null) {
        return null;
    }
    filterAdapters.add(adapter);

    ListView list = (ListView) inflater.inflate(R.layout.on_demand_filter_list, container, false);

    list.setAdapter(adapter);
    list.setItemsCanFocus(false);
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    list.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    list.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(final View view, final MotionEvent motionEvent) {
            LOG.d(TAG, "NO TOUCHING!");
            return false;  //To change body of implemented methods use File | Settings | File Templates.
        }
    });
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            LOG.d(TAG, "onItemClick!");
            CheckedTextView textView = (CheckedTextView) view.findViewById(R.id.title);
            textView.toggle();
            if (textView.isChecked()) {
                filterValue.addToSelectedList(labels[i], type);
            } else {
                filterValue.removeFromSelectedList(labels[i], type);
            }
        }
    });
    list.setAdapter(adapter);
    list.setVisibility(View.GONE);
    filterListContainer.addView(list);

    return list;
}

onTouch 监听器的存在只是为了确保接收到 Touch。(是的。) DescendantFocusability 似乎没有效果,这个错误在添加之前和之后都存在。

每个都与一个显示或隐藏列表的按钮相关联。

    titleHeader.setOnClickListener(new View.OnClickListener() {
        public void onClick(View clickedView) {
            closeNetworkList();
            closeGenreList();
            titlesOpen = !titlesOpen;
            ImageView indicator = (ImageView) clickedView.findViewById(R.id.filter_expansion_indicator_icon);
            if (indicator != null) {
                if (titlesOpen) {
                    indicator.setImageResource(R.drawable.arrow_filter_up);
                } else {
                    indicator.setImageResource(R.drawable.arrow_filter_down);
                }
            }
            if (titlesOpen) {
                titlesListView.setVisibility(View.VISIBLE);
            } else {
                titlesListView.setVisibility(View.GONE);
            }
        }
    });

点击此按钮隐藏然后显示 listView(由 addList 生成)会重置某些内容,并且可以再次单击这些项目。

项目行的 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:focusable="false"
          android:focusableInTouchMode="false"
          android:padding="8dp"
          android:orientation="horizontal">

<CheckedTextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/on_demand_filter_checked_text_sel"
        android:gravity="center_vertical"
        android:paddingLeft="76dp"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:drawableLeft="@drawable/checkbox_sel"
        android:drawablePadding="14dp"
        style="@style/LargeRegular"/>

</LinearLayout>

焦点是新添加的,但都不起作用。在添加它们之前就出现了问题。

ListView 本身:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/list"
      android:layout_width="fill_parent"
      android:layout_height="275dp"
      android:layout_marginLeft="5dp"
      android:layout_marginRight="5dp"
      android:divider="@color/Transparent"
      android:descendantFocusability="blocksDescendants"
      android:cacheColorHint="#ffffff"/>

我已经不知所措了。我的团队中没有人对此有明智的解决方案。它工作正常,直到您暂停和恢复。我们绝对不会做任何触及恢复或暂停中的视图的事情。任何人都可以帮忙吗?我可以根据需要提供更多细节。

4

2 回答 2

0

记得我在片段活动方面遇到过类似的问题。我有一个布局请求被阻止的情况,它们并没有导致实际的布局遍历。我已经在Enroscar 库BaseFragment类)中使用片段类中的以下代码片段修复了它:

@Override
  public void onStart() {
    // ... other staff ...
    super.onStart();
    /*
      XXX I don't know the reason but sometimes after coming back here from other activity all layout requests are blocked. :(
      It looks like some concurrency issue or a views tree traversal bug
     */
    final View contentView = getActivity().findViewById(android.R.id.content);
    if (contentView != null) {
      final ViewParent root = contentView.getParent();
      if (contentView.isLayoutRequested() && !root.isLayoutRequested()) {
        if (DebugFlags.DEBUG_GUI) { Log.i("View", "fix layout request"); }
        root.requestLayout();
      }
    }
  }
于 2012-03-03T10:49:57.880 回答
0

我的应用程序遇到了类似的问题(扩展的 SurfaceView 在恢复后丢失了触摸事件)并通过在 onResume() 实现中调用 setFocusable(true) 来解决它。显然视图没有获得焦点,因此没有收到触摸事件。不确定这里是否是这种情况,但值得一试。

于 2012-03-01T22:03:57.040 回答