Fragment over een ander fragmentnummer

Wanneer ik één fragment laat zien (dat is volledig scherm met #77000000achtergrond) over een ander fragment (laten we het hoofd noemen), mijn hoofdfragment reageert nog steeds op klikken (we kunnen op een knop klikken (we kunnen op een knop klikken Zelfs als we het niet zien).

Vraag : Hoe te voorkomen dat klikken op het eerste (hoofd) fragment?

bewerken

Helaas kan ik het hoofdfragment niet alleen verbergen, omdat ik transparante achtergrond op tweede fragment gebruik (dus kan de gebruiker zien wat er achter is).


Antwoord 1, Autoriteit 100%

Instellen clickableeigendommen op het standpunt van de tweede fragment op true. Het uitzicht zal het evenement vangen, zodat het niet wordt doorgegeven aan het hoofdfragment. Dus als het zicht van de tweede fragment een lay-out is, zou dit de code zijn:

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

Antwoord 2, Autoriteit 12%

oplossing is vrij eenvoudig. In ons tweede fragment (die ons hoofdfragment overlapt), moeten we gewoon vangen onTouchEvenement:

@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;
}

Antwoord 3, Autoriteit 4%

Voeg gewoon clickable="true"EN focusable="true"NAAR OUDERLOGING

<android.support.constraint.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:clickable="true"
      android:focusable="true">
      <!--Your views-->
 </android.support.constraint.ConstraintLayout>

Als u AndroidXgebruikt, probeer dit dan

<androidx.constraintlayout.widget.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:clickable="true"
      android:focusable="true">
          <!--Your views-->
 </androidx.constraintlayout.widget.ConstraintLayout>

Antwoord 4, Autoriteit 2%

U moet het eerste fragment verbergen wanneer u het tweede fragment laat zien als twee fragmenten in dezelfde containerweergave worden geplaatst.

Als u meer vragen wilt weten over het oplossen van problemen over fragment, kunt u mijn bibliotheek zien: https: / /github.com/justkiddingbaby/fragmentrigger

FirstFragment firstfragment;
SecondFragment secondFragment;
FragmentManager fm;
FragmentTransaction ft=fm.beginTransaction();
ft.hide(firstfragment);
ft.show(secondFragment);
ft.commit();

Antwoord 5

U moet android:focusable="true"met android:clickable="true"

clickablebetekent dat het kan worden aangeklikt door een aanwijzerapparaat of wordt getikt door een aanraakapparaat.

Focusablebetekent dat het de focus kan krijgen van een invoerapparaat zoals een toetsenbord. Invoerapparaten zoals toetsenborden kunnen niet beslissen welke mening zijn invoergebeurtenissen naar de ingangen zelf verzenden, zodat ze ze naar het standpunt sturen dat focus heeft.


Antwoord 6

Metod 1:

U kunt toevoegen aan alle fragmenten lay-out

android:clickable="true"
android:focusable="true"
android:background="@color/windowBackground"

Metode 2: (programmatisch)

Verleng alle fragmenten van FragmentBaseenz. Voeg deze code vervolgens toe aan FragmentBase

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    getView().setBackgroundColor(getResources().getColor(R.color.windowBackground));
    getView().setClickable(true);
    getView().setFocusable(true);
}

Antwoord 7

Er is meer dan één oplossing die sommigen van ons hebben bijgedragen aan deze thread, maar ik zou ook een andere oplossing willen noemen. Als je het niet leuk vindt om klikbaar en focusbaar gelijk te stellen aan de root van elke lay-out, ViewGroup in XML zoals ik. Je kunt het ook op je basis zetten als je er een hebt, zoals hieronder;

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
    }

Je kunt ook een inline variabele gebruiken, maar ik gaf er om persoonlijke redenen niet de voorkeur aan.

Ik hoop dat het helpt voor degenen die een hekel hebben aan lay-out-XML’s.


Antwoord 8

Het acceptabele antwoord zal “werken”, maar zal ook prestatiekosten veroorzaken (overwaarde, opnieuw meten bij verandering van oriëntatie) aangezien het fragment onderaan nog steeds wordt getekend. Misschien moet je het fragment gewoon op tag of ID zoeken en de zichtbaarheid instellen op GEGAAN of ZICHTBAAR als je het opnieuw moet laten zien.

In Kotlin:

fragmentManager.findFragmentByTag(BottomFragment.TAG).view.visibility = GONE

Deze oplossing verdient de voorkeur boven de alternatieve methoden hide()en show()van FragmentTransactionwanneer u animaties gebruikt. Je roept het gewoon aan vanuit de onTransitionStart()en onTransitionEnd()van Transition.TransitionListener.


Antwoord 9

Wat u kunt doen is een blanco klik geven op de lay-out van het vorige fragment door de eigenschap onClick te gebruiken voor de bovenliggende lay-out van dat hoofdfragment en in activiteit kunt u een functie maken doNothing(View view)en schrijf er niets in. Dit zal het voor je doen.


Antwoord 10

Dit klinkt als een geval voor DialogFragment. Anders verbindt u met Fragment Manager er een om te verbergen en de andere om te tonen. Dat heeft voor mij gewerkt.


Antwoord 11

Het toevoegen van android:clickable="true"werkte niet voor mij. Deze oplossing werkt niet op CoordinatorLayout als het een bovenliggende lay-out is. Daarom heb ik RelativeLayout als parent layout gemaakt, er android:clickable="true"aan toegevoegd en CoordinatorLayout op deze RelativeLayout geplaatst.


Antwoord 12

Ik had meerdere fragmenten met dezelfde xml.
Na uren te hebben doorgebracht, heb ik setPageTransformerverwijderd en het begon te werken

  //  viewpager.setPageTransformer(false, new BackgPageTransformer())

Ik had scalling-logica.

public class BackgPageTransformer extends BaseTransformer {
    private static final float MIN_SCALE = 0.75f;
    @Override
    protected void onTransform(View view, float position) {
        //view.setScaleX Y
    }
    @Override
    protected boolean isPagingEnabled() {
        return true;
    }
}

Other episodes