2014-04-17 6 views
5

Ich erstelle eine Aktivität, die wie ein Dialog aussieht. HierVerhindern, dass "Dialog" -Aktivität mit der Hintergrundaktivität beim Klicken auf äußere Grenzen interagiert

ist der Stil:

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

Hier ist die Aktivität 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); 
} 

Und auch im Inneren der Aktivität Touch Interceptor:

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

Es funktioniert ziemlich gut, Aktivität endet bei Berührung außerhalb von Dialoggrenzen, aber es interagiert auch mit Schaltflächen auf der Hintergrundaktivität, die schlecht ist. Dokumentation auf der onTouchEvent besagt, dass Sie True zurückgeben sollten, wenn Sie das Berührungsereignis konsumiert haben. Ich komme zurück, aber so scheint es nicht.

+0

http://stackoverflow.com/questions/4650246/how-to-ancancel-anddialog-themed-like-activity-when-touched-outs-the-window/5831214#5831214 es ist eine gute Antwort) –

+0

hast du meinen code angeschaut? Wenn du es würdest, wüsstest du, dass es von dort stammt. –

+0

Hier finden Sie meine Lösung für dieses Problem: http://stackoverflow.com/questions/16701915/can-we-interact-with-background-activity-when-displaying-a-dialog-over-it-in-and-and- – user2288580

Antwort

0

Beachten Sie, dass Sie brauche den ganzen Code auch aus der Frage.

Neben meiner Lösung innen Hintergrundaktivität (oder nur Grundaktivität der Anwendung) Ich fügte hinzu:

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

Und in der onCreate():

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

nun wie ein Werk Charme! :)

0

hm..interesting)
in meiner app verwende ich Fragmente, so dass ich DialogFragment anstelle von Dialog verwenden.
i sicher zeigen Dialogmethode

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 ist meine Gewohnheit DialogFragment
so gibt es keine Hintergründe Klicks erstellt) ich hoffe, dass dies für Sie nützlich)

+0

Die ganze Sache ist es in der Aktivität und nicht im DialogFragment zu tun –