web-dev-qa-db-fra.com

Un agencement invisible derrière le fragment est cliqué:

J'ai créé plusieurs fragments et j'ajoute le premier fragment de la manière suivante:

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();

Le deuxième fragment est ajouté de la manière suivante:

     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);

Maintenant que vous voyez que la méthode hide n’est pas appliquée pour cette transaction et que la VenueFragment est ouverte, le problème dans ce cas-ci est que, même si la VenueFragment est ouverte (et c’est une vue plein écran), appuyer sur une section vide de ce fragment invoque les appels du MainFragment vues cliquables. Comment puis-je empêcher cela?

Si j'utilise l'option de masquage, cela ne se produit pas, mais pour une raison quelconque, l'animation permettant de supprimer la variable MainFragment est en cours et cela crée une expérience étrange. 

25
Emil Adz

Vous devez rendre la racine ViewGroup de VenueFragment cliquable de sorte qu'elle gère les événements de clic et qu'ils ne soient pas transmis (au sens z) par l'autre Fragment.

33
Emmanuel

Définissez la propriété cliquable sur la vue du deuxième fragment sur true. 

Par exemple: 

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

La définition d'un onClickListener sur VenueFragment fonctionnera, mais j'ajouterai un peu plus d'explications. Avoir le fragment principal un événement tactile est destiné à traiter le cas où le fragment de votre lieu est transparent. Dans ce cas, il peut être raisonnable de s’attendre à ce que le contact passe par votre vue transparente à celle qui se trouve en dessous. En tant que tel, Android transmet les événements tactiles jusqu'à ce qu'ils puissent être gérés. Définir un onClickListener gérera l'événement, l'empêchant d'être transmis à la vue suivante. Si vous voulez être "correct" sur la prévention des clics sur le fragment inférieur, il existe deux options:

  1. Supprimez onClickListener du fragment principal dans OnPause et définissez-le dans OnResume. Ainsi, chaque fois que le fragment principal n'est pas le fragment actif, vous ne pouvez pas cliquer dessus. 
  2. Sous-classez votre disposition de niveau supérieur dans votre VenueFragment et substituez OnTouchEvent pour renvoyer true. Cela fera essentiellement la même chose que de définir un onClickListener, mais vous constaterez peut-être que votre intention de bloquer tous les événements tactiles est plus claire. 
7
GLee

Eh bien, la réponse très rapide est Android:clickable="true" en haut des propriétés de présentation en fragment.

Mais il serait préférable de créer une activité avec un FrameLayout & its id et aucun autre élément dans cette activité. Donc, chaque fois que vous voulez qu'un fragment_ soit à l'écran, appelez cette activité et utilisez

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();

utilisez replace au lieu de add pour que le frameLayout du activité soit remplacé par la disposition du fragment telle que donnée par le frameLayoutId

1
Rishav Chudal

J'ai une meilleure solution, du moins c'est ce que je pense: P. 

pendant la fragmentation, utilisez la méthode hide and show.

0
Code_Life