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

由于在项目中很多地方会用到提示框,它给用户提供些提示信息,由于它仅仅只是起提示的作用,所以可以单独地定义一个包,在包中定义MyAlertDialogFrag类,此类继承DialogFragment。在下面的例子中,在 MiMaXiuGaiFragment类 中创建了 MyAlertDialogFrag对象,并在 MiMaXiuGaiFragment  中实现了提示框的调用。

MyAlertDialogFrag包的结构如下图:
在Fragment 中调用DialogFragmet的继承类MyAlertDialogFrag对象,实现提示框的复用。_第1张图片
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;
	}

	/**
	 * 密码校验提示框
	 */
	@Override
	public 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;
	

	@Override
	public 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;
	}

	@Override
	public void onPause() {
		super.onPause();
	}

	@Override
	public 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()一样,所以一直爆空指针异常。主要是自己不够仔细的愿意吧,这个困扰了自己很久。借此机会分享下吧,最后附几张图:
在Fragment 中调用DialogFragmet的继承类MyAlertDialogFrag对象,实现提示框的复用。_第2张图片


你可能感兴趣的:(android,DialogFragment)