【个人向】Android回调接口的实现方法

来源:互联网 发布:ws小世界网络模型特点 编辑:程序博客网 时间:2024/04/25 22:13

今天稍微整理下Android中关于回调接口的实现方法,相信初学的朋友们还是有人不了太了解具体的实现方法,今天就一起重温一遍吧。

假设有以下情景:

现在的需求是单击activity中的Button能够改变textview的值,怎么做?


其实我们只需要把activity中的Button的单击事件暴露给Fragment,那样我们就可以在Fragment中响应Activity里Button的单击事件。

   以下是Activity中的代码:

public class MainActivity extends Activity {    private static ButtonClick buttonClick;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.btn);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (null != buttonClick){                    buttonClick.click();                }            }        });    }    public static void setButtonClickListener(ButtonClick buttonClickListener){        buttonClick = buttonClickListener;    }    interface ButtonClick{        void click();    }}
   首先在Activity中创建一个interface ButtonClick ,里面有一个click()方法,然后在声明一个接口的全局对象,

 private static ButtonClick buttonClick;
之后需要对外提供一个注册接口的函数 

  public static void setButtonClickListener(ButtonClick buttonClickListener){        buttonClick = buttonClickListener;    }
外部调用了这个方法就必须实现ButtonClick接口,并把对象传入该方法,通过该方法对buttonClick对象进行赋值。

然后就是关键的一步了,在Button的单击事件中,调用该对象的click()方法,这样就完成了!不过需要对buttonClick进行判断,即有人调用了注册方法实现了接口的情况下才可以调用该方法。

之后我们就开始使用它吧,实现回调有两种方法,第一种是Fragment本身实现ButtonClick接口,并调用注册函数注册即可:

public class MyFragment extends Fragment implements MainActivity.ButtonClick{    /**     * 省略了一些代码,大家自行脑补     */    TextView textView;    @Override    public void onViewCreated(View view, Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);        //注册回调函数,并传入对象        MainActivity.setButtonClickListener(this);    }    @Override    public void click() {        //textView控件获取代码未给出        textView.setText("我是内容");    }}
第二种:

public class MyFragment extends Fragment{     /**     * 省略了一些代码,大家自行脑补     */    TextView textView;    @Override    public void onViewCreated(View view, Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);                MainActivity.setButtonClickListener(new MainActivity.ButtonClick() {            @Override            public void click() {                //textView控件获取代码未给出                textView.setText("我是内容");            }        });    }}

那如果你要想从通过回调接口传值只要在接口中定义一个带参函数就可以了,比如还是这个场景,不过在单击Button的时候把Fragment中的Textview文本改成Button上的文字,就只要这么做

public class MainActivity extends ActionBarActivity {    private static ButtonClick buttonClick;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.btn);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (null != buttonClick){                    //和刚才不同的地方就是调用的时候把button上的值给传进了方法里。                    buttonClick.click(button.getText().toString());                }            }        });    }    public static void setButtonClickListener(ButtonClick buttonClickListener){        buttonClick = buttonClickListener;    }    interface ButtonClick{        //写个带参的函数        void click(String str);    }}
这样就搞定了!在Fragment中回调的方法就会多个参数,只要引用这个参数就可以了

public class MyFragment extends Fragment{     /**     * 省略了一些代码,大家自行脑补     */    TextView textView;    @Override    public void onViewCreated(View view, Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);        MainActivity.setButtonClickListener(new MainActivity.ButtonClick() {            @Override            public void click(String str) {                //textView控件获取代码未给出                textView.setText(str);            }        });    }}
那么关于回调接口的实现方法就总结到这,由于我也只是菜鸟,所以我说的有什么不足的地方,请指出来,大家一起进步 (~ ̄▽ ̄)~

0 0
原创粉丝点击