最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

自定义Listener监听器_Android OnClickListener点击事件的原理分析

Android 太平洋学习网 浏览 评论

Listener监听器运用的就是观察者模式编写,在Android setOnClickListener按钮点击事件中,我们点击Button按钮之后,会进入到内部的“onClick”回调方法中,然后做一些事情,那么为什么会进入“onClick”回调方法中呢?下面小编会自定义Listener监听器事件,让大家了解Android OnClickListener点击事件的原理。

先看一下我们的Android Button按钮点击事件这一部分的代码:

Button btnExample = (Button) findViewById(R.id.btnExample);
btnExample.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do something here    
    }
});

下面我们开始来自定义Listener监听器,让各位了解OnClickListener事件为什么会有这样惊奇的效果,下面是实现步骤。

1.定义一个Listener接口类

首先定义一个Listener接口类,定义这个接口类就是为了模仿“View”这个类里面的“OnClickListener”接口,里面自定义两个接口方法,代码如下:

public class MyCustomObject {
  // 步骤一: MyCustomObject在类内部定义这个接口类
  public interface MyCustomObjectListener {

      // 初始化
      public void onObjectReady(String title);
      // 加载数据
      public void onDataLoaded(SomeData data);
  }
}

2.创建Listener监听器的Setter方法,采用Setter回调

首先在MyCustomObject这个类的内部,MyCustomObjectListener接口的外部,添加“MyCustomObjectListener”的成员变量,代码如下:

public class MyCustomObject {
    // 步骤一:...

    // 步骤二:添加成员变量
    private MyCustomObjectListener listener;
}

添加一个setter方法,模仿Button按钮的“setOnClickListener”方法,代码如下:

public class MyCustomObject {

    // 步骤一:...

    // 步骤二:...
    
    // 步骤三:添加匿名构造函数与setter方法
    public MyCustomObject() {
        // 将listener置空是因为我们不采用构造器回调
        this.listener = null; 
    }
	
    // Setter方法回调,步骤三
    public void setCustomObjectListener(MyCustomObjectListener listener) {
        this.listener = listener;
    }
}

3.实现Listener监听器回调事件,模拟Button按钮点击事件

在此处,我们开始实现最上方的类似的Button setOnClickListener点击事件,代码如下所示:

public class MyParentActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	// ...
    	// 模式button按钮类
    	MyCustomObject object = new MyCustomObject();
    	// 步骤四:在Activity中使用类似的点击事件
    	object.setCustomObjectListener(new MyCustomObject.MyCustomObjectListener() {
    		@Override
    		public void onObjectReady(String title) {
    		    // Code to handle object ready
    		}
    		
    		@Override
    		public void onDataLoaded(SomeData data) {
    		    // 从网络中加载的数据在此处使用,SomeData表示回调的数据
    		    // 思考,为什么SomeData此时会有数据过来?
    		}
    	});
    }
}

4.完整代码,思考?

我们需要思考,为什么在Activity中使用了setCustomObjectListener这个Setter方法之后,就会将上方的“SomeData”值回调过来了呢?这是因为我们在new MyCustomObject()这个类的时候,我们在构造函数中实现了自定义的“loadDataAsync()”方法,我们都知道,构造函数是随着类的加载而加载的,所以在初始化的时候,就可以给“SomeData”赋值了,代码如下:

public class MyCustomObject {
   // Listener defined earlier
   public interface MyCustomObjectListener {
      public void onObjectReady(String title);
      public void onDataLoaded(SomeData data);
   }
   
   // Member variable was defined earlier
   private MyCustomObjectListener listener;

    // new对象时会调用此构造函数
    public MyCustomObject() {
        // set null or default listener or accept as argument to constructor
        this.listener = null; 
        loadDataAsync();
    }
  
    // Setter方法回调
    public void setCustomObjectListener(MyCustomObjectListener listener) {
        this.listener = listener;
    }

    public void loadDataAsync() {
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("https://mycustomapi.com/data/get.json", new JsonHttpResponseHandler() {         
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // 解析网络中加载过来的数据
                SomeData data = SomeData.processData(response.get("data"));
                // Do some other stuff as needed....
                // Now let's trigger the event
                if (listener != null)
                  listener.onDataLoaded(data); // <---- 调用方法并传值(SomeData)
            }
        });
    }
}

从上方的代码我们就可以看出“SomeData”为什么在实现setCustomObjectListener()回调函数时就有值了,这就是很多回调函数的原理了。

来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/android/2019/0322/920.html

    与本文相关的文章

    发表我的评论
    取消评论

    表情

    您的回复是我们的动力!

    • 昵称 (必填)

    网友最新评论