我想知道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只是一个接口 - 而不是类定义 那是我的困惑!!!
答案 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);
//调用意图或做你想做的事情
现在做你想做的事。