Wanneer ik één fragment laat zien (dat is volledig scherm met #77000000
achtergrond) 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 clickable
eigendommen 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 onTouch
Evenement:
@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 AndroidX
gebruikt, 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"
clickable
betekent dat het kan worden aangeklikt door een aanwijzerapparaat of wordt getikt door een aanraakapparaat.
Focusable
betekent 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 FragmentBase
enz. 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 FragmentTransaction
wanneer 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 setPageTransformer
verwijderd 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;
}
}