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 ..");
}
}
Wäre es nicht einfach sein, nur ein paar Klick Zuhörer zu setzen und rufen Sie dann 'Perform()', oder was? – razzledazzle
Einfach versucht, es funktioniert. Hast du versucht Logging oder Debugging? – razzledazzle
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