web-dev-qa-db-ja.com

フラグメントの背後にある非表示のレイアウトがクリックされています:

いくつかのフラグメントを作成し、次の方法で最初のフラグメントを追加します。

mainFragment = (MainFragment) MainFragment.create();
    getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    .add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG)
    .commit();

2番目のフラグメントは次のように追加されます。

     getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    //.hide(mainFragment)
    .add(R.id.content,VenueFragment.create(vid), "Venue Fragment")
    .addToBackStack(null)
    .commit();
    setDrawerIndicatorEnabled(false);

このトランザクションに非表示メソッドが適用されておらず、VenueFragmentが開かれていることがわかると、この場合の問題は、VenueFragmentが開かれている間(そして全画面表示)を押すことです。このフラグメントの空のセクションで、MainFragmentクリック可能なビューの呼び出しを呼び出します。 これを防ぐにはどうすればよいですか?

非表示オプションを使用すると、それは起こりませんが、何らかの理由でMainFragmentを削除するためのアニメーションが増えて、奇妙な体験になります。

29
Emil Adz

ViewGroupのルートVenueFragmentをクリック可能にして、クリックイベントを処理し、他のFragmentに(zオーダーで)渡されないようにする必要があります。

35
Emmanuel

2番目のフラグメントのビューのクリック可能なプロパティをtrueに設定します。

例えば:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:clickable="true" />
14

VenClickFragmentにonClickListenerを設定することは機能しますが、もう少し説明を追加します。メインフラグメントにタッチイベントを取得させることは、ベニューフラグメントが透過的な場合を処理するための動作です。その場合、タッチが透明なビューを透過して下のビューに到達することを期待するのが妥当です。そのため、Androidはタッチイベントを処理できるようになるまで渡します。onClickListenerを設定すると、イベントが処理され、次のビューに渡されなくなります。防止について「正確」にしたい場合下のフラグメントをクリックすると、いくつかのオプションがあります:

  1. OnPauseのメインフラグメントからonClickListenerを削除し、OnResumeに設定します。そうすれば、メインフラグメントがアクティブフラグメントではないときはいつでもクリックできません。
  2. VenueFragmentで最上位のレイアウトをサブクラス化し、OnTouchEventをオーバーライドしてtrueを返します。これは基本的にonClickListenerを設定するのと同じことを行いますが、すべてのタッチイベントをより明確にブロックする意図がある場合があります。
7
GLee

まあ非常に迅速な答えはAndroid:clickable="true"は、フラグメントのレイアウトプロパティの上部にあります。

ただし、activityFrameLayoutを作成し、idおよびactivityに他の要素はありません。fragmentを画面に表示したいときはいつでも、そのアクティビティを呼び出して使用してください

getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    .replace(R.id.frameLayoutId, mainFragment, MAIN_FRAGMENT_TAG)
    .commit();

addの代わりにreplaceを使用して、frameLayoutactivityは、で指定されたフラグメントのレイアウトに置き換えられます/ frameLayoutId

2
Rishav Chudal

私はより良い解決策を持っています、少なくとも私が思うことは:P。

トランザクションをフラグメント化している間は、hideおよびshowメソッドを使用します。

0
Code_Life