Pro Android学习笔记(四七):Dialog(4):一些补充和思考

时间:2022-12-26 13:14:04

编程思想:封装接口

在小例子中,fragment会调用activity的onDialogDone()来显示Toast等信息。在真正项目中,fragment的编写并不需要了解activity的各类方法,好的编程风格是将fragment所涉及的方法以接口的方式封装起来,如下:

public interface OnMyDialogClickListener {
    public void onDialogDone(String tag, boolean cancelled, CharSequence message);
}

在activity中,增加接口的实现,如下:

public class MainActivity extends Activity implements OnMyDialogClickListener{
    ......     
    public void onDialogDone(String tag, boolean cancelled, CharSequence message) {
        String s = tag + " responds with: " + message;
        if(cancelled)
            s = tag + " was cancelled by the user";
        Toast.makeText(this, s, Toast.LENGTH_LONG).show();
        showInfo(s);

    }
}

相应地,在fragment中,对该方法的调用,可以写为:

OnMyDialogClickListener act = (OnMyDialogClickListener)getActivity();
act.onDialogDone(……);

对于一些大型项目,如果我们无法确定activity是否真的实现了接口,可以在fragment的早期,即刚关联activity的阶段进行检测,如下:

@Override
public void onAttach(Activity activity) {
    //onAttach()是合适的早期阶段进行检查MyActivity是否真的实现了接口。
    //采用接口的方式,dialog无需详细了解MyActivity,只需了解其所需的接口函数,这是真正项目中应采用的方式。

    try{
        OnMyDialogClickListener act = (OnMyDialogClickListener)activity;
    }catch(ClassCastException e){
        …... activity并不真正支持接口的异常处理......
    }
    super.onAttach(activity);
}

fragment和activity以其他fragment之间的通信

小例子演示了通过getActivity()获取接口对象或者直接获取activity的对象,实现两者之间的通信。此外fragment也可以通过fragment管理器,通过tag,获取其他fragment实例,从而进行fragment之间的通信。当然从编程思想的角度看,fragment之间的过多进行交叉调用,不利于程序的管控。

本博文涉及的例子代码,可以在Pro Android学习:Dialog小例子中下载。

相关链接: 我的Android开发相关文章