298

1 つのフラグメント (背景付きの全画面表示#77000000) を別のフラグメント (メインと呼びましょう) の上に表示している場合でも、メインのフラグメントはクリックに反応します (ボタンが見えなくてもクリックできます)。

質問: 最初の (メイン) フラグメントのクリックを防ぐにはどうすればよいですか?

編集

残念ながら、2番目のフラグメントで透明な背景を使用しているため、メインフラグメントを非表示にすることはできません(ユーザーは背後にあるものを見ることができます)。

4

12 に答える 12

629

clickable2 番目のフラグメントのビューのプロパティを true に設定します。ビューはイベントをキャッチして、メイン フラグメントに渡されないようにします。したがって、2 番目のフラグメントのビューがレイアウトの場合、次のコードになります。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
于 2013-03-27T15:30:03.380 に答える
75

解決策は非常に簡単です。2 番目のフラグメント (メインのフラグメントと重なっています) では、onTouchイベントをキャッチする必要があります。

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstance){
    View root = somehowCreateView();

    /*here is an implementation*/

    root.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });
    return root;
}
于 2012-04-30T20:07:06.177 に答える
2

私たちの何人かがこのスレッドに貢献した解決策は複数ありますが、別の解決策についても言及したいと思います。クリック可能でフォーカス可能にすることを好まない場合は、私のように XML ですべてのレイアウトのルート ViewGroup に当てはまります。以下のようなベースがある場合は、ベースに配置することもできます。

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ) : View? {
        super.onCreateView(inflater, container, savedInstanceState)

        val rootView = inflater.inflate(layout, container, false).apply {
            isClickable = true
            isFocusable = true
        }

        return rootView
    }

インライン変数を使用することもできますが、私は個人的な理由でそれを好みませんでした。

レイアウト XML が嫌いな人の役に立てば幸いです。

于 2020-03-18T09:36:57.307 に答える
0

あなたができることは、onClickプロパティを使用して前のフラグメントのレイアウトに空白のクリックを与えることです。そのメインフラグメントの親レイアウトにアクティビティで関数doNothing(View view)を作成し、何も書き込まないでください。これはあなたのためにそれを行います。

于 2016-08-03T06:06:29.257 に答える