2013-03-13 7 views
11

Ho un Fragment nella mia app che mostra uno DialogFragment.
Ho nel frammento un pulsante che chiude la finestra di dialogo. Ma quando mostro il dialogFragment, i tocchi all'esterno della finestra di dialogo non fanno nulla e non riesco a fare clic sui pulsanti all'esterno del frammento della finestra di dialogo.Consenti tocco esterno per DialogFragment

Come posso consentire i tocchi esterni per DialogFragment?

risposta

15

Per farlo, una bandiera del Window che permette al tocco esterno deve essere acceso e per il buon aspetto la bandiera dim di sfondo dovrebbe essere cancellata.
Poiché deve essere eseguito dopo la creazione della finestra di dialogo, l'ho implementato tramite 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(); 
     } 
    }); 
} 

In questo momento è possibile il tocco esterno.

Nel caso in cui vogliamo renderlo più bello e senza la cornice, il seguente codice può essere aggiunto:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Hide title of the dialog 
    setStyle(STYLE_NO_FRAME, 0); 
} 
0

È necessario impostare uno stile appropriato per le proprie esigenze. Puoi leggere ulteriori informazioni sugli stili per FragmentDialogs nel official docs.

Credo che si potrebbe usare seguente stile:

  • STYLE_NO_FRAME
+0

sto già lavorando con STYLE_NO_FRAME, ed è l'unico che bene per me (in quanto l'interfaccia utente). – Yaniv

+1

@yaniv, allora è il momento di mostrare il codice :) – Warpzit

3

Questa è la bandiera più generico per consentire a qualsiasi azione non solo toccare azioni

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

Ho trovato un modo alternativo per gestire il congedo al tatto al di fuori. Controlli prego sotto esempio di codice, che avrebbe sicuramente lavorare,

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

Nel mio caso, mi è stato sempre getDialog() non valore nullo, ma getDialog(). Respingere() non funzionava. Inoltre, anche la soluzione contrassegnata come sopra, non ha funzionato nel mio caso. Quindi, ho preso questo approccio.

0

Bene, cerchiamo di essere specifici. Se si vuole lavorare con viste esterne, non si dovrebbe usare il frammento di dialogo, usare invece il frammento come questo.

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

e rendere il wrap_content di layout, che sarà a quanto pare sembra di dialogo e di default è posto nella parte superiore dello schermo.

Per maggiori dettagli visitate here