📅  最后修改于: 2023-12-03 14:39:11.347000             🧑  作者: Mango
DialogFragment是Android中的一个重要类,它继承自Fragment,可以在应用程序中以对话框的形式显示内容,用来显示一些简单的提示、确认、输入等框框。在操作上与Dialog类似,常常与AlertDialog一起使用。
创建一个DialogFragment需要继承DialogFragment类,当然需要实现onCreateView() 或 onCreateDialog() 方法来定义Dialog的内容。其中onCreateView()方法返回的是一个View,即设置Dialog的内容布局,而onCreateDialog()方法则用于设置AlertDialog等,因此我们就可以在onCreateDialog()方法中定制我们的Dialog样式,通过AlertDialog.Builder来创建。
public class MyDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Title");
builder.setMessage("Message");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
});
return builder.create();
}
}
我们可以在Activity中直接通过调用DialogFragment.show()方法来显示Dialog。在DialogFragment.show()方法中可以传入FragmentManager, tag以及DialogFragment.TAG常量。
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getFragmentManager(), MyDialogFragment.TAG);
DialogFragment的样式和Dialog的样式类似,我们可以定制自己的DialogFragment样式,例如修改样式颜色、形状、字体大小等。 用自定义的XML文件获取Dialog(示例中的自定义XML文件为fragment_my_dialog),可以在样式中添加一些额外的布局样式或View,实现Dialog的样式修改。
public class MyDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_my_dialog, null);
// obtain layout element by view.findViewById()
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view)
.setTitle("Title")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
});
return builder.create();
}
}
在自定义XML文件中可以自定义Dialog的样式
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="18sp"
android:text="Content" />
<EditText
android:id="@+id/et_comment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
我们可以通过接口实现数据交互,在DialogFragment中定义一个回调接口OnSelectListener,Activity实现这个接口。从而在Activity中通过这个接口回调来获取到DialogFragment中的数据
public interface OnSelectListener{
void onSelect(String text);
}
public class MyDialogFragment extends DialogFragment {
private OnSelectListener mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (OnSelectListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + "must implement OnSelectListener");
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
...
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mListener.onSelect("something");
}
});
return builder.create();
}
}
public class MainActivity extend AppCompatActivity implements MyDialogFragment.OnSelectListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
}
@Override
public void onSelect(String text) {
//do something with text
}
}
综上,DialogFragment提供了一个方便、有效的方法来创建和管理Dialog,它比Dialog更加灵活,可扩展性更好,可使我们快速的创建复杂的对话框。我们可以根据自己的需求,自定义DialogFragment的样式、行为和交互。