2016-04-12 4 views
2

Ich habe versucht, Ereignis von einer Ansicht auf eine andere Schaltfläche zu übertragen. Wenn der Benutzer die Ansicht unter einer bestimmten Bedingung berührt, wollte ich das Ereignis auf die Schaltfläche übertragen. In der Taste onTouchEvent rufe ich requestLayout() auf. Diese requestLayout() wird aufgerufen, wenn ich auf die Schaltfläche klicke, aber requestLayout() wird nicht aufgerufen, wenn ich das Ereignis von der Ansicht auf die Schaltfläche übertrage. This ist meine Follow-up-Frage zum vorherigen.Warum ruft RequestLayout() onLayout() nicht auf, wenn ich ein Ereignis von der Ansicht zur Schaltfläche in Android übertrage?

/// MaintActivity.java 
package com.example.mylayout; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends Activity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     setContentView(R.layout.activity_main);  

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

//-------activity_main.xml

<com.example.mylayout.MyViewGroup 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.example.mylayout.MyView 
    android:id="@+id/myview" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:background="@color/green"> 
    </com.example.mylayout.MyView> 

    <com.example.mylayout.MyButton 
    android:id="@+id/mybutton" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:text="@string/Next" 
    android:background="@color/red"> 
    </com.example.mylayout.MyButton> 

</com.example.mylayout.MyViewGroup> 

// -------- ------- MyViewGroup Paket com.example. mylayout;

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 

public class MyViewGroup extends ViewGroup{ 



    public MyViewGroup(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    public MyViewGroup(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 

    } 

    public MyViewGroup(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     int count = getChildCount(); 

     for (int i = 0; i < count; i++) { 
      final View child = getChildAt(i); 

     } 

     setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); 
    } 

    @Override 
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 
     // TODO Auto-generated method stub 
     System.out.println("I am from MyViewGroup:onLayout"); 
     for(int i = 0; i < getChildCount(); i++){ 
      final View child = getChildAt(i); 

      if(i == 0)child.layout(0,0,800,800); 
      if(i == 1)child.layout(10,10, 200, 200); 
     } 
    } 

} 

// -------------- MyView -------

package com.example.mylayout; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class MyView extends View{ 

    MyButton objbutton; 

    public MyView(Context context) { 
     // TODO Auto-generated constructor stub 
     super(context); 

     objbutton = new MyButton(context); 
    } 

    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     objbutton = new MyButton(context, attrs); 
     // TODO Auto-generated constructor stu 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     System.out.println("I am from MyView: dispatchTouchEvent"); 
     objbutton.dispatchTouchEvent(event); 

     return false; 
    } 

}

// ----- --MyButton ----

package com.example.mylayout; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.Button; 

public class MyButton extends Button{ 

    public MyButton(Context context) { 
     // TODO Auto-generated constructor stub 
     super(context); 

    } 

    public MyButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // TODO Auto-generated constructor stu 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     System.out.println("I am from MyButton: dispatchTouchEvent"); 
     requestLayout(); 
     return super.dispatchTouchEvent(event); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     System.out.println("I am from MyButton: dispatchTouchEvent"); 
     requestLayout(); 
     return true; 
    } 

    void printme(){ 
     System.out.println("I am from MyButton: printme .."); 
    } 

}

+0

Wäre es nicht einfach sein, nur ein paar Klick Zuhörer zu setzen und rufen Sie dann 'Perform()', oder was? – razzledazzle

+0

Einfach versucht, es funktioniert. Hast du versucht Logging oder Debugging? – razzledazzle

+0

Hey @razzledazzle danke für die Antwort. U bedeuten Klickhörer in Knopf? Oder dachten Sie, dass Sie Listeners in View klicken? Ich vermute, ich meinte in der Taste. – pokche

Antwort

1

Aus den Kommentaren:

Entsprechend Ihrer Einfügung scheint es, als würden Sie eine komplette neue Instanz von MyButton innerhalb von MyView erstellen. Es ist nicht bekannt, , die Sie im Layout XML enthalten haben. Erstellen Sie stattdessen einen Setzer in MyView und übergeben Sie ihn von MainActivity über findViewById().

So:

package com.example.mylayout; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class MyView extends View { 

    private MyButton objbutton; 

    public MyView(Context context) { 
     // TODO Auto-generated constructor stub 
     super(context); 
    } 

    public void setMyButton(MyButton myButton) { 
     objbutton = myButton; 
    } 

    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     System.out.println("I am from MyView: dispatchTouchEvent"); 
     if(objbutton != null) 
      objbutton.dispatchTouchEvent(event); 
     return false; 
    } 

} 
+0

Ich war nur neugierig, warum MyView nicht über den MyButton wissen kann, da ich bereits seine Instanz erstellt habe, indem Sie MyButton in MyView tun. – pokche

+1

Es werden keine Annahmen gemacht. Denken Sie daran, wenn das Layout mehr als eine Schaltfläche hat, auf welche sollte sich die Ansicht beziehen? – razzledazzle

+1

Ja, es würde nicht wissen, weil es mehrere Instanzen von MyButton hätte und würde verwirrt werden. Hast du das gemeint? – pokche

Verwandte Themen