在Fragment 中调用DialogFragmet的继承类MyAlertDialogFrag对象,实现提示框的复用。

来源:互联网 发布:如何java创建表格 编辑:程序博客网 时间:2024/04/29 18:53
由于在项目中很多地方会用到提示框,它给用户提供些提示信息,由于它仅仅只是起提示的作用,所以可以单独地定义一个包,在包中定义MyAlertDialogFrag类,此类继承DialogFragment。在下面的例子中,在MiMaXiuGaiFragment类中创建了MyAlertDialogFrag对象,并在MiMaXiuGaiFragment 中实现了提示框的调用。

MyAlertDialogFrag包的结构如下图:

MyAlertDialogFrag类的定义如下:
package com.example.dialogs;import com.example.mobileelectivesystem.R;import android.app.AlertDialog;import android.app.Dialog;import android.app.DialogFragment;import android.content.DialogInterface;import android.os.Bundle;/** *  * @ClassName: MyAlertDialog * @Description: 提示警告框 * @author zhuzhp * @date 2014年3月24日 下午11:12:43 */public class MyAlertDialogFrag extends DialogFragment {public MyAlertDialogFrag() {super();}/** *  * @Title: newInstance * @Description: 根据参数得到不同的消息提示框对象。这只会给出提示,不会在提示框中完成复杂的操作。 * @param @param title * @param @param message * @param @return * @return MyAlertDialog * @throws */public  MyAlertDialogFrag newInstance(int title, int message) {MyAlertDialogFrag frag = new MyAlertDialogFrag();Bundle args = new Bundle();// 将参数存入Bundle,以便在传递过程中取出。args.putInt("title", title);//title为提框的标题,args.putInt("message", message);//message为提框的内容,frag.setArguments(args);return frag;}/** * 密码校验提示框 */@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {int title = this.getArguments().getInt("title");int message = this.getArguments().getInt("message");AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle(title).setMessage(message).setPositiveButton(R.string.queren,new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {}});return builder.create();}}

注意:该类不是静态类,其中的方法newInstance( int title, int message)也是非静态的,在该类中定义了个无参构造函数。这和官方的文档中的例子是不一样的,官方文档中的类定义成了静态的,在创建对象时也要注意,可以和官方文档中的例子好好比较下,官方文档例子

下面就是要在实现在Fragment 调用继承了DialogFragment的类,在MiMaXiuGaiFragment 类中实现了OnClickListener 接口代码如下:
package com.example.mobileelectivesystem.gerenxinxiguanli;import com.example.dialogs.MyAlertDialogFrag;import com.example.mobileelectivesystem.R;import com.example.util.MyApplication;import com.example.util.WebServiceHelper;import android.app.DialogFragment;import android.app.Fragment;import android.app.FragmentManager;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;/** *  * @ClassName: MiMaXiuGaiFragment * @Description: 实现密码修改功能。 * @author zhuzhp * @date 2014年3月24日 下午2:15:30 */public class MiMaXiuGaiFragment extends Fragment implements OnClickListener {private EditText chuShiMiMaText;private EditText xinMiMaText;private EditText queRenXinMiMaText;private Button queRenBut;private FragmentManager fragmentManager;private WebServiceHelper webSerHep;private MyApplication myApp;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);webSerHep = new WebServiceHelper();fragmentManager = getFragmentManager();myApp = (MyApplication) getActivity().getApplication();}@Override/** *  *  container 参数是你的fragmentlayout将被插入的父ViewGroup(来自activity的layout). *  savedInstanceState 参数是一个Bundle, 如果fragment是被恢复的,它提供关于fragment的之前的实例的数据, */public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.grxxgl_mima_xiugai, container,false);chuShiMiMaText = (EditText) view.findViewById(R.id.chushi_mima);xinMiMaText = (EditText) view.findViewById(R.id.xin_mima);queRenXinMiMaText = (EditText) view.findViewById(R.id.queren_mima);queRenBut = (Button) view.findViewById(R.id.miMaXiuGai_querenButton);queRenBut.setOnClickListener(this);return view;}@Overridepublic void onPause() {super.onPause();}@Overridepublic void onClick(View v) {String xueHao = myApp.getXueHao();String chuShiMiMaStr = chuShiMiMaText.getText().toString();String xinMiMaStr = xinMiMaText.getText().toString();String queRenMiMaStr = queRenXinMiMaText.getText().toString();//判断新输入的密码和初始密码是否相同,以及确认密码是否和新密码不同。if (chuShiMiMaStr.equals(xinMiMaStr)) {DialogFragment dFrag = new MyAlertDialogFrag().newInstance(R.string.choice, R.string.mimaxiugai_tishi1);dFrag.show(fragmentManager, "dialog1");xinMiMaText.setText("");//清空输入的内容,在这是个偷懒的方法,本应该在提示框中的点击事件是实现的。} else if (!(xinMiMaStr.equals(queRenMiMaStr))) {DialogFragment dFrag = new MyAlertDialogFrag().newInstance(R.string.choice, R.string.mimaxiugai_tishi2);dFrag.show(fragmentManager, "dialog2");xinMiMaText.setText("");queRenXinMiMaText.setText("");} else {webSerHep.modifyPassWd(xueHao, queRenMiMaStr);//完成密码修改的操作}}}

在这个Fragment 中主要是完成密码修改的功能,在其中应注意MyAlertDialogFrag对象的创建与官方文档中创建的不同,当出没注意到,文档中的类是静态的创建MyAlertDialogFrag对象的时候,也和文档中的MyAlertDialogFragment.newInstance()一样,所以一直爆空指针异常。主要是自己不够仔细的愿意吧,这个困扰了自己很久。借此机会分享下吧,最后附几张图:



0 0
原创粉丝点击