2014-04-17 10 views
5

Sto creando un'attività simile a una finestra di dialogo.Previene la "finestra di dialogo" Attività dall'interazione con l'attività in background quando si fa clic sui limiti esterni

Qui è lo stile:

<style name="TablesDialogActivity" parent="@android:style/Theme.Holo.Dialog"> 
    <item name="android:windowBackground">@drawable/frame_background_left</item> 
</style> 

Qui è l'attività onCreate():

protected void onCreate(Bundle savedInstanceState) { 
     getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL); 
     getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); 
     super.onCreate(savedInstanceState); 
} 

e anche all'interno l'attività tocco intercettore:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
     finish(); 
     return true; 
    } 
    return false; 
} 

Funziona praticamente, l'attività termina al tocco al di fuori dei limiti del dialogo, ma interagisce anche con i pulsanti sull'attività di sfondo che è cattiva. La documentazione su onTouchEvent dice che si dovrebbe restituire true se si è consumato l'evento di tocco. Ritorna vero, ma non sembra così.

+0

http://stackoverflow.com/questions/4650246/how-to-cancel-an-dialog-themed-like-activity-when-touched-outside-the-window/5831214#5831214 è bene risposta) –

+0

hai guardato il mio codice? se lo facessi sapresti che è preso da lì. –

+0

Puoi trovare la mia soluzione a questo problema qui: http://stackoverflow.com/questions/16701915/can-we-interact-with-background-activity-when-displaying-a-dialog-over-it-in-and – user2288580

risposta

0

nota, che si vuole serve anche l'intero codice dalla domanda.

Oltre alla mia soluzione all'interno sfondo attività (o solo l'attività di base della vostra applicazione) ho aggiunto:

private FrameLayout touchInterceptor; 

@Override 
protected void onPause() { 
    if (touchInterceptor.getParent() == null) { 
     ((ViewGroup) findViewById(android.R.id.content)).addView(touchInterceptor); 
    } 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    ((ViewGroup) findViewById(android.R.id.content)).removeView(touchInterceptor); 
    super.onResume(); 
} 

E nel onCreate():

// For intercepting clicks from dialog like activities 
    touchInterceptor = new FrameLayout(this); 
    touchInterceptor.setClickable(true); 

ora funziona come un fascino! :)

0

hm..interessante)
nella mia app io uso i frammenti, quindi uso DialogFragment invece di Dialog.
Ho creato il metodo di dialogo spettacolo sicuro

private static void showDialog(FragmentManager fragmentManager, String dialogTag, BeamDialogData data) { 

     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.commit(); 
     fragmentManager.executePendingTransactions(); 
     Fragment prev = fragmentManager.findFragmentByTag(dialogTag); 
     if (prev != null) { 
      ft.remove(prev); 
     } 
     ft.addToBackStack(null); 

     BeamDialog beamDialog = new BeamDialog(); 
     beamDialog.setData(data); 
     beamDialog.show(fragmentManager, dialogTag); 
    } 

    public static void showDialogSafe(final FragmentManager fragmentManager, final String dialogTag, 
      final BeamDialogData data, Handler handler) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
        showDialog(fragmentManager, dialogTag, data); 
      }   
     });  
    } 

BeamDialog è il mio DialogFragment personalizzato
quindi non ci sono sfondi click) spero, che questo sarà utile per voi)

+0

Il tutto consiste nel farlo nell'attività e non nel DialogFragment –

Problemi correlati