2014-04-17 4 views
5

Tworzę działanie, które wygląda jak okno dialogowe.Zapobieganie interakcji "okna dialogowego" z aktywnością w tle po kliknięciu poza granicami

Oto styl:

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

Oto aktywność 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); 
} 

A także wewnątrz kolektora dotykowym aktywny:

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

To prawie wszystko działa, aktywność kończy się na dotykowych oknach dialogowych, ale także współdziała z przyciskami na tle aktywności, która jest zła. Dokumentacja na temat onTouchEvent mówi, że powinieneś zwrócić wartość true, jeśli spożyłeś zdarzenie dotykowe. Zwrócę prawdę, ale tak się nie wydaje.

+0

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

+0

czy spojrzałeś na mój kod? Gdybyś to zrobił, wiedziałbyś, że to stąd. –

+0

Możesz znaleźć moje rozwiązanie tego problemu tutaj: http://stackoverflow.com/questions/16701915/can-we-interact-with-background-activity-when-displaying-a-dialog-over-it-in-and – user2288580

Odpowiedz

0

Note, które będą Potrzebuję też całego kodu z pytania.

Oprócz mojego rozwiązania wewnętrznej aktywności tle (lub tylko działalności podstawowej aplikacji) I dodaje:

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

A w onCreate():

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

Teraz działa jak urok! :)

0

hm..interesting)
w mojej aplikacji używam fragmentów, więc używam DialogFragment zamiast Dialog.
i stworzył metodę Pokażokno bezpieczne

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 jest mój zwyczaj DialogFragment
więc nie ma tła kliknięcia) mam nadzieję, że będzie to przydatne dla Ciebie)

+0

Cała sprawa dotyczy robienia tego w działaniu, a nie w DialogFragment –