1

ユーザーが別のフラグメントで情報をフィルタリングするための情報を保持するいくつかの ListView を生成します。アプリを一時停止して再開しない限り(たとえば、バックグラウンドにしたり、画面をロックしたり)、問題なく動作します。これを行うと、リストをスクロールできますが、クリックすることはできません。

リスト生成コード:

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 に答える