利用Android回调机制对Dialog进行简单封装
ChristinaQf
8年前
<p>写作原因:Android回调机制是Android开发者绕不开的一个点,对于它的掌握学习十分重要。本文由于作者水平有限可能存在纰漏,对于回调机制的学习掌握仍在途中,以后会推出更多的相关文章。</p> <h2>简介</h2> <p>接口回调是Android中一种常用的机制,如Button点击事件就是接口回调的具体实现。Fragment与Activity之间的通信机制也是基于接口回调实现,感兴趣的可以阅读博主上篇关于Fragment通信的文章(基于Google官方文档):Fragment间的通信。对于接口回调,作为初学者,个人有一下的一点认识:我们可以把接口看作是一个呼叫端口,是在某个功能类(发送方)完成自身功能过程中触发某些动作时通过接口中的某一个方法呼叫接口,然后接口将这种呼叫传至实现该接口的类(接收处理方)中,该类通过实现回调方法对该呼叫作出反馈。下面是Wikipedia上面关于回调机制的定义,有兴趣可以看看。</p> <p>In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable.</p> <h2>实现</h2> <p>实现代码是最好的学习方式,下面博主通过封装一个简单的Dialog来讲解接口回调的具体用法。平常使用Dialog时如果按照标准写法来有时会显得很繁琐,博主因为特定需要将其封装成一个只有message和“确定”,“取消”按钮点击事件的工具。下面我将按照步骤一步步实现:</p> <h3>定义接口</h3> <p>在简介中已经说过,接口是一个呼叫端口,是通信的中介。内部的方法类比为不同请求。的本例中的接口是在我们点击Positive Button和Negative Button时被呼叫的。所以定义一下的接口:</p> <pre> <code class="language-java">public interface onButtonClick{ public void OnPositive(); public void OnNegative(); } </code></pre> <p>上面的接口中有两个方法,分别在点击Positive Button和Negative Button时回调</p> <h3>实现接口</h3> <p>这包括两个部分,一个是在功能类(发送方)向接口发出呼叫时实现回调:<br> 先创建回调对象mCallBack:<br> private onButtonClick mButtonClickCallBack;<br> 然后在触发某个动作时(当点击Dialog上的按钮时)发出回调(呼叫接口):</p> <pre> <code class="language-java">builderSec.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mButtonClickCallBack.OnPositive(); } }); builderSec.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mButtonClickCallBack.OnNegative(); } }); </code></pre> <p>在另一个类(接收处理方)中实现回调方法对该呼叫作出反馈:<br> 先实现该接口,可以在功能类中定义以下方法:</p> <pre> <code class="language-java">public void setOnButtonClick(onButtonClick mNegativeCallBack) { this.mButtonClickCallBack = mNegativeCallBack; } </code></pre> <pre> <code class="language-java">MyDialog deleteDialog = new MyDialog(getActivity(),"RTGBrowser","是否删除当前历史记录?"); deleteDialog.setOnButtonClick(new MyDialog.onButtonClick() { @Override public void OnPositive() { //TODO:在这里实现点击Positive按钮的逻辑; } @Override public void OnNegative() { //TODO:在这里实现点击Negative按钮的逻辑; } }); </code></pre> <p>这样就通过接口回调实现对一个Dialog进行封装,下面贴出完整的代码:</p> <h2>源码</h2> <p>MyDialog.class</p> <pre> <code class="language-java">package com.example.vincebarry.exam.function; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; /** * Created by VinceBarry on 2016/5/2. * 那现在一起来总结一下基本的回调是如何实现的,首先创建一个接口,这个接口用于你在某个情景下执行相应的操作。 * 接着创建一个功能类,比如这个类可以显示一个对话框、可以滑动菜单、可以下载数据等等。 * 然后,在这个类里面声明回调接口的对象,之后在这个类里面创建在某个情景下需要执行的方法,而且在这个方法里面为声明的接口对象赋值。 * 最后在其他的类中使用这个功能类就可以了。所以说,最少也是需要三个类共同来完成这个回调机制。 */ public class MyDialog { private onButtonClick mButtonClickCallBack; private Context context; private String title; private String message; AlertDialog.Builder builderSec; public interface onButtonClick{ public void OnPositive(); public void OnNegative(); } public MyDialog(Context context,String title,String message){ this.context = context; this.title = title; this.message = message; builderSec = new AlertDialog.Builder(context); builderSec.setTitle(title); builderSec.setMessage(message); builderSec.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mButtonClickCallBack.OnPositive(); } }); builderSec.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mButtonClickCallBack.OnNegative(); } }); AlertDialog dialogSec = builderSec.show(); } public void setOnButtonClick(onButtonClick mNegativeCallBack) { this.mButtonClickCallBack = mNegativeCallBack; } } </code></pre> <p>MainActivity.class</p> <pre> <code class="language-java">MyDialog deleteDialog = new MyDialog(getActivity(),"RTGBrowser","是否删除当前历史记录?"); deleteDialog.setOnButtonClick(new MyDialog.onButtonClick() { @Override public void OnPositive() { DataSupport.delete(TableHistoryLocal.class,positionInDb); queryAndTrans(); roadData(); } @Override public void OnNegative() { //donothing. } }); </code></pre> <p>水平不足,存在纰漏或错误请指教!!</p> <p> </p> <p><a href="/misc/goto?guid=4959675479794264249">阅读原文</a></p> <p> </p>