2013-05-16 7 views
7

Ich finde nicht den Weg, um dies zu arbeiten.machen Sie eine Vordergrundansicht Click-through

Meine Anwendung hat 2 FrameLayouts mit vielen Kindansichten (man stelle ImageViews der Einfachheit halber) übereinander gestapelt vor.

Mein Problem ist, ich brauche das FrameLayout auf der Oberseite und alle seine Kinder, um Berührungen durch sie gehen zu lassen, das darunterliegende FrameLayout (und seine Kinder) zu erreichen. So etwas wie Zeiger-Ereignisse: Keines in HTML, das auf alle Bildansichten des TOP-Framelayouts angewendet wurde.

Ich habe SetClickable (False) und SetEnabled (False) sowohl auf dem FrameLayout und seinen Kindern versucht, aber wenn ich auf eine deaktivierte Kinder (zum Beispiel ein ImageView) klicken, erreicht die Berührung ein zugrunde liegendes ImageView (d Kind des unteren FrameLayout)

Der folgende Code ist mein bester Versuch, ein FrameLayout und seine untergeordneten Elemente zu deaktivieren (mSlideLayout ist das übergeordnete FrameLayout, Layer ist jedes imageview untergeordnete). Fehle ich etwas?

/** Create the layers structure into the layout */ 
void create_layers() { 
    Context context=getActivity(); 
    mSlideLayout.removeAllViews(); 
    for (FunqLayer layer:mLayers) { 
     if (layer!=null) { 
      View v=layer.init_internal(context, mSlideLayout); // constructs the child layer, suppose it's an ImageView 
      if ((v!=null) && (mIsMuteTouches)) { 
       v.setEnabled(false); 
       v.setClickable(false); 
       // this should obviously let touches pass through but it doesnt :(
      } 
     } 
    } 
    if (mIsMuteTouches) { 
     // also do the same in the FrameLayout itself with no luck :(
     mSlideLayout.setEnabled(false); 
     mSlideLayout.setClickable(false); 
    } 
} 

Antwort

7

Ja, obviouly mir fehlte onInterceptTouchEvent, diese zwingende im framelayout und gibt true zurück, die obige Routine überflüssig macht:

FrameLayout slideLayout=new FrameLayout(getActivity()){ 
     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
      if (mIsMuteTouches) return true; 
      return super.onInterceptTouchEvent(ev); 
     } 
    };