android DialogFragment简单使用
- 历史:
在android 3.0
时被引入。
在DialogFragment
产生之前,我们创建对话框:一般采用AlertDialog和Dialog
。官方不推荐直接使用Dialog创建对话框 - 用法:
DialogFragment
至少需要实现onCreateView
或者onCreateDIalog
方法- 方式一:重写
onCreateView()
,跟fragment
一样。不过实例化,跟fragment
之间传递不同。public void showEditDialog(View view){ EditNameDialogFragment editNameDialog = new EditNameDialogFragment(); editNameDialog.show(getFragmentManager(), "EditNameDialog"); }
- 方式二:重写
onCreateDialog
. 一般可以使用AlertDialog
或者Dialog
创建对话框。首先脑补下AlertDialog
的用法,AlertDialog
的构造方法都是Protected
,所以不能直接通过不能直接通过new一个AlertDialog来创建出一个AlertDialog。要创建一个AlertDialog
,就要用到AlertDialog.Builder
中的create()
方法。接着,必须了解AlertDialog.Builder
的几个用法。(关于AlertDialog的详解,查看Android AlertDialog 详解 )
接下来是正式的重写代码:setTitle :为对话框设置标题 setIcon :为对话框设置图标 setMessage:为对话框设置内容 setView : 给对话框设置自定义样式 setItems :设置对话框要显示的一个list,一般用于显示几个命令时 setMultiChoiceItems :用来设置对话框显示一系列的复选框 setNeutralButton :普通按钮 setPositiveButton :给对话框添加"Yes"按钮 setNegativeButton :对话框添加"No"按钮 create : 创建对话框 show :显示对话框
public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_login_dialog, null); // Inflate and set the layout for the dialog // Pass null as the parent view because its going in the dialog layout builder.setView(view) // Add action buttons .setPositiveButton("Sign in", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { } }).setNegativeButton("Cancel", null); return builder.create(); }
- 方式一:重写
-
数据传递,与Activity的通信-->这个才是重点。使用“fragment interface pattern”的方式,对这个方式的解释,只找到了官方文档:Communicating with Other Fragments,涉及到了“设计模式”的应用。
最重要的代码:LoginInputListener listener = (LoginInputListener) getActivity();
-
首先在其内部声明一个接口。
public class LoginDialogFragment extends DialogFragment {
public interface LoginInputListener {
void onLoginInputComplete(String username, String password);
}
} -
然后在相应的方法是执行这一段:
LoginInputListener listener = (LoginInputListener) getActivity();
listener.onLoginInputComplete(mUsername.getText().toString(), mPassword .getText().toString()); - 最后在
MainActivity
中需要实现我们的接口LoginInputListener
,实现我们的方法。public class MainActivity extends Activity
implements LoginInputListener
{
@Override
public void onLoginInputComplete(String username, String password) {
Toast.makeText(this, "帐号:" + username + ", 密码 :" + password,Toast.LENGTH_SHORT).show();
}
}
参考资料:
Android 官方推荐 : DialogFragment 创建对话框
从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-6.对话框)
-
- 注意:这种只能在fragment与Activity之间的数据传递,而且Activity必须实现相应的接口,这里为(
LoginInputListener
),否则会抛出ClassCastException can not...
意思是不能执行相应的转化。我试想在fragment上实现接口,结果就失败了。因为这句LoginInputListener listener = (LoginInputListener) getActivity();
是得到Activity
的共享数据,所以一定要指定Activity
去实现接口。 -
那么问题就来了,如何实现
fragment
之间的通信呢?
其实也很简单,只要在实例化的时候,通过函数,传递相应的共享数据给DialogFragment
就行了。- 首先在
LoginDialogFragment
中增加一个初始化函数和成员private onEdTextListener edTextListener=null; public void initDialog(onEdTextListener listener) { edTextListener = listener; }
-
接着在实例化
LoginDialogFragment
的时候,并执行初始化函数。public void showEditDialog() { EditNewThingDialog editThingDialog = new EditNewThingDialog(); editThingDialog.initDialog(CloudTagsFragment.this);//这句很重要,进行初始化listener监听器 editThingDialog.show(getFragmentManager(), "EditNameDialog"); }
此时,
edTextListener
就可以用了,可以在相应的地方,用他的方法,进行传递数据。例如:@Override public void onClick(DialogInterface arg0, int arg1) { if (edNewThing != null && edTextListener!=null) { edTextListener.updateNewThing(edNewThing.getText().toString()); } }
或许讲解的不够明白,贴下完整的代码:
类:CloudTagsFragment
package com.dacer.simplepomodoro; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; import com.dacer.simplepomodoro.EditNewThingDialog.onEdTextListener; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView.OnEditorActionListener; import dacer.views.FlowLayout; /** * @author TryIT */ public class CloudTagsFragment extends Fragment implements onEdTextListener { ImageButton imbtnAddCloudTag; Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what==1){ addCloudView(); //初始化标签云 Log.d("handler", "addCloudView"); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity=getActivity(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView=inflater.inflate(R.layout.fragment_cloud_tags, container,false); imbtnAddCloudTag=(ImageButton)rootView.findViewById(R.id.tagcloudcontent); imbtnAddCloudTag.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { showEditDialog(); } }); return rootView; } public void showEditDialog() { EditNewThingDialog editThingDialog = new EditNewThingDialog(); editThingDialog.initDialog(CloudTagsFragment.this); editThingDialog.show(getFragmentManager(), "EditNameDialog"); } @Override public void onDestroy() { layout.stop(); super.onDestroy(); } @Override public void updateNewThing(String newThing) { List<String> lists=queue.poll(); lists.add(newThing); queue.add(lists); mHandler.sendEmptyMessage(1); //更新UI } }
类:
EditNewThingFragment
package com.dacer.simplepomodoro; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.View; import android.widget.EditText; public class EditNewThingDialog extends DialogFragment { private EditText edNewThing; private onEdTextListener edTextListener=null; public void initDialog(onEdTextListener listener) {//这里接受传递的共享数据,很关键 edTextListener = listener; } public interface onEdTextListener { //内部接口,进行传递数据。 public void updateNewThing(String newThing); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); View dialogView = getActivity().getLayoutInflater().inflate( R.layout.dialog_edit_task_fragment, null); edNewThing = (EditText) dialogView.findViewById(R.id.title); builder.setView(dialogView) .setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { if (edNewThing != null && edTextListener!=null) { edTextListener.updateNewThing(edNewThing.getText().toString()); } } }).setNegativeButton("取消", null); return builder.create(); } }
- 首先在