Android的setOnCLickListener()如何工作?

时间:2015-10-01 09:58:36

标签: java android

我想知道Android OnClik Listener是如何工作的?这是什么模式?观察者?

我无法想象如何在我的应用程序中实现它!它需要是一个自定义实现,因为我想用我的对象而不是视图。

那么如何实现调用obj.setOnClickListener(new Class(){});

在我的代码中?

我的意思是,我可以在我的基类中使用一个方法,派生类可以从中实现,然后只需要一个静态的ArrayList。但是如何在运行时向此List添加新类?

这个类OnClickListener(){}的定义很奇怪。

如何定义现有类并重写方法?

我的Java从来没有做过这么好......

编辑:这个问题不是如何使用ONCLICKLISTENER。我知道如何使用...

我想要的是什么:

我想要一个Super Class,它有一个像这样的方法的实现:

public void setMyOnclickListener(MyOnClickListener myListener)
{
    //magic code
}

现在我想要一个这个类的Object让我们调用它

Subclass obj;

现在我想这样做:

obj.setMyOnClickLister(new MyOnClickListener()
    {
        //defined method at runtime
        public void aDefinedMethod()
        {
            //here goes in some code
        }
    });

如何将一个类作为一个只作为匿名类存在的参数的方法?

EDIT2:

好吧我知道它OnClickListener只是一个接口 - 而不是类定义 那是我的困惑!!!

4 个答案:

答案 0 :(得分:5)

每个视图都包含ListenerInfo静态类,它实际上包含回调,OnClickListener

它是如何工作的?

系统始终保留屏幕上的所有视图。 当用户点击屏幕时,我们有一个递归的foreach循环:

switch(event) {
    ...
    case ON_CLICK:
    process(ViewRoot);
}

void process(View view) {

    for(View view : view.getChilds()) {
        if(view instanceOf ViewGroup && ((ViewGroup)view).getChildCount() > 0) {
             process(view);
        }
        if(view.getListenerInfo().mOnClickListener != null)
             view.getListenerInfo().mOnClickListener.onClick(view)
    }
}

当你致电setOnClickListener时,你实际上说“嘿Android!在这里回调。当用户点击时,请使用它。”

View.class 还有getListenerInfo方法,该方法返回ListenerInfo个对象。

系统使用此方法分派事件。

这里没有Observer模式。它只是简单地检查现有的回调。

答案 1 :(得分:-1)

您需要先初始化对象(按钮)

public class SomeActivity {
  ...
  private Button subButton1, subButton2;
  ...

  protected void onCreate(Bundle savedInstanceState) {
    ...
    init();
  }

  private void init() {
        subButton1 = (Subclass) findViewById(R.id.home_button1);
        subButton2 = (Subclass) findViewById(R.id.home_button2);
  }

// next是onClickListener

  private void init() {
    ...
        subButton1.setOnClickListener(new MyOnClickListener() {
            @Override
            public void myOnClick(View v) {
                System.out.println("Your own on click 1");
                Toast.makeText(HomeActivity.this, "Your own on click 1", Toast.LENGTH_SHORT).show();
            }
        });
        subButton2.setOnClickListener(new MyOnClickListener() {
            @Override
            public void myOnClick(View v) {
                System.out.println("Your own on click 2");
                Toast.makeText(HomeActivity.this, "Your own on click 2", Toast.LENGTH_SHORT).show();
            }
        });
  }

  private void methodCall() {
    // some more code...
  }

//子类

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

/**
 * Created by roelsuntjens on 01-10-15.
 */
public class Subclass extends Button {
    public Subclass(Context context) {
        super(context);
    }

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

    public Subclass(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public Subclass(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public void setOnClickListener(MyOnClickListener l) {
        super.setOnClickListener(l);
    }

    @Override
    public void setOnClickListener(OnClickListener l) {
        super.setOnClickListener(l);
    }
}

// MyOnClickListener

import android.view.View;

/**
 * Created by roelsuntjens on 01-10-15.
 */
public abstract class MyOnClickListener implements View.OnClickListener {
    public MyOnClickListener() {
    }

    public abstract void myOnClick(View v);

    @Override
    public void onClick(View v) {
        myOnClick(v);
    }
}

//在XML中我使用了这个:

        <View3D.Subclass
            android:id="@+id/home_button1"
            android:layout_width="match_parent"
            android:text="Button1"
            android:layout_height="wrap_content" />
        <View3D.Subclass
            android:id="@+id/home_button2"
            android:layout_width="match_parent"
            android:text="Button2"
            android:layout_height="wrap_content" />

答案 2 :(得分:-1)

您可以通过实现接口OnClickListener来实现像that这样的onClickListener。 在您的活动中设置为setOnClickListner(this)上的按钮将在onClick方法上侦听click事件。

您还可以通过声明类似的私有OnClickListener来创建您的侦听器:

private OnClickListener listener = new OnClickListener() {
    @Override
    public void onClick(View view) {
        // Click occurs, do something
    }
};

然后设置button.setOnClickListener(listener);

答案 3 :(得分:-1)

这很简单......只需在您的activity_main.xml布局中创建一个按钮即可 像这样

          <Button
    android:id="@+id/btnTake"
    android:layout_width="wrap_content"
//  android:onClick="onClick" (It will automatically create the method if u use onclic)//
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
     />

现在只需调用带有id的按钮(如果你没有写android:onClick =&#34; onClick&#34;)

现在在主要活动中执行此操作

      protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     btnTack = (Button) findViewById(R.id.btnTakePic);
     btnTack.setOnClickListener(this);

//调用意图或做你想做的事情

现在做你想做的事。