2014-04-17 21 views
5

dış sınırları tıklandığında arka plan etkinliğiyle etkileşim kurmasını engelle İletişim kutusu gibi görünen bir etkinlik oluşturuyorum."Dialog" Etkinliğinin

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

aktivite onCreate() 'dir: Burada

tarzıdır

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

Ve ayrıca etkinlik dokunmatik interceptor iç:

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

Oldukça fazla çalışır, etkinlik iletişim kutusu dışına dokunarak etkinleşir, ancak aynı zamanda arka planda etkinlik olan düğmelerle de etkileşir. onTouchEvent belgesindeki belgeler, dokunma olayını tüketirseniz, doğru dönmeniz gerektiğini belirtir. Doğru döndüm, ama öyle görünmüyor.

+0

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

+0

koduma baktınız mı? Eğer biliyorsan, oradan alındığını biliyorsun. –

+0

Çözümüm bu soruna şu adresten ulaşabilirsiniz: http://stackoverflow.com/questions/16701915/can-we-interact-with-background-activity-when-displaying-a-dialog-over-it-in-and – user2288580

cevap

0

Not) sizin için bu irade yararlı o, olur umut ) böylece arka tıklama bulunmamaktadır benim özel DialogFragment
olduğunu Sorunun tüm koduna da ihtiyacım var. Arka plan aktivitesi
(veya uygulamanın sadece taban faaliyeti) içinde benim solüsyon ek olarak

ekledim:

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

Şimdi gibi çalışır:

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

Ve içinde onCreate() çekicilik! :)

0

hm..interesting)
Uygulamamda parçaları kullanıyorum, bu yüzden Dialog yerine DialogFragment kullanıyorum.
i güvenli gösteri iletişim yöntemini yarattı

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 i

+0

Her şey, DialogFragment içinde değil, aktivitede yapmakla ilgilidir. –