Autoriser le contact extérieur pour DialogFragment

J'ai un Fragment dans mon application qui montre un DialogFragment .
J'ai dans le fragment un bouton qui ferme la boîte de dialogue. Mais quand je montre le dialogueFragment, les touches à l'extérieur de la boîte de dialogue ne font rien et je ne peux pas cliquer sur les boutons en dehors du fragment de dialogue.

Comment puis-je permettre des touches extérieures pour DialogFragment?

  • Une classe DialogFragment interne doit-elle être statique ou non?
  • Argument de passage à DialogFragment
  • IllegalStateException lors de l'utilisation de DialogFragment
  • Avantage d'utiliser un DialogFragment sur simple AlertDialog?
  • DialogFragment en plein écran dans Android
  • Comment élever un DialogFragment au-dessus d'un autre?
  • Erreur avec DialogFragment dans Android
  • Comment définir la taille de la police pour le texte des boutons de dialogue
  • 5 Solutions collect form web for “Autoriser le contact extérieur pour DialogFragment”

    Pour ce faire, un drapeau de la Window qui permet de toucher à l'extérieur doit être allumé et pour la bonne apparence, le drapeau de fond doit être effacé.
    Comme cela doit être fait après la création de la boîte de dialogue, je l'ai mis en œuvre via le Handler .

     @Override public void onViewCreated(final View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // This is done in a post() since the dialog must be drawn before locating. getView().post(new Runnable() { @Override public void run() { Window dialogWindow = getDialog().getWindow(); // Make the dialog possible to be outside touch dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); getView().invalidate(); } }); } 

    En ce moment, le contact extérieur est possible.

    Dans le cas où nous voulons le rendre plus agréable et sans cadre, le code suivant peut être ajouté:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Hide title of the dialog setStyle(STYLE_NO_FRAME, 0); } 

    C'est un drapeau plus générique pour permettre une action non seulement des actions tactiles

     window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 

    J'ai trouvé un moyen alternatif de traiter le licenciement sur le contact à l'extérieur. Veuillez vérifier l'exemple de code ci-dessous, qui fonctionnerait certainement,

     @Override public void onStart() { // mDialogView is member variable mDialogView = getView(); mDialogView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { float eventX = event.getRawX(); float eventY = event.getRawY(); int location[] = new int[2]; mDialogView.getLocationOnScreen(location); if (eventX < location[0] || eventX > (location[0] + mDialogView.getWidth()) || eventY < location[1] || eventY > location[1] + mDialogView.getHeight()) { dismiss(); return true; } return false; } }); } 

    Dans mon cas, je recevais getDialog () comme valeur nulle, mais getDialog (). Dismiss () ne fonctionnait pas. En outre, la solution qui est marquée comme ci-dessus, n'a pas non plus fonctionné dans mon cas. Donc, j'ai adopté cette approche.

    Vous devez définir un style approprié pour vos besoins. Vous pouvez en savoir plus sur les styles pour FragmentDialogs dans les documents officiels .

    Je crois que vous pourriez utiliser le style suivant:

    • STYLE_NO_FRAME

    Eh bien, soyons précis. Si vous souhaitez travailler avec des vues extérieures, vous ne devriez pas utiliser un fragment de dialogue, utilisez un fragment plutôt que cela.

      FragmentTransaction transaction = fragmentManager.beginTransaction(); // For a little polish, specify a transition animation transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); // To make it fullscreen, use the 'content' root view as the container // for the fragment, which is always the root view for the activity transaction.add(android.R.id.content, newFragment) .addToBackStack(null).commit(); 

    Et créez le contenu wrap_content, qui ressemblera apparemment à Dialog et, par défaut, il est placé en haut de l'écran.

    Pour plus de détails, visitez ici

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.