在此示例中,我创建了一个类 MainActivity.java,它的布局从 Button 打开自定义对话框,如下所示:
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button openDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
openDialog = findViewById(R.id.open_dialog);
openDialog.setOnClickListener(v -> {
Log.d(TAG, "onClick: opening dialog.");
MyCustomDialog dialog = new MyCustomDialog();
dialog.show(getSupportFragmentManager(), "MyCustomDialog");
});
}
}
Layout 与 Button activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="MainActivity">
<Button
android:id="@+id/open_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="20sp"
android:text="open dialog" />
</RelativeLayout>
MyCustomDialog.java 类扩展了DialogFragment 以拥有一个自定义视图来存储DatePicker 和其他Widgets。 (例如TextView):
public class MyCustomDialog extends DialogFragment {
private static final String TAG = "MyCustomDialog";
private TextView mActionOk, mActionCancel;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog_my_custom, container, false);
mActionCancel = view.findViewById(R.id.action_cancel);
mActionOk = view.findViewById(R.id.action_ok);
mActionCancel.setOnClickListener(v -> {
Log.d(TAG, "onClick: closing dialog");
getDialog().dismiss();
});
mActionOk.setOnClickListener(v -> {
Log.d(TAG, "onClick: capturing input");
getDialog().dismiss();
});
return view;
}
}
最后但同样重要的是XML 文件dialog_my_custom.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="550dp"
android:padding="10dp">
<TextView
android:id="@+id/heading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="This is your custom View with DatePicker"
android:textAlignment="center"
android:textColor="#000"
android:textSize="18sp" />
<DatePicker
android:id="@+id/date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/heading"
android:layout_centerHorizontal="true" />
<RelativeLayout
android:id="@+id/frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/date_picker">
<TextView
android:id="@+id/action_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="20dp"
android:text="OK"
android:textColor="#33bbff"
android:textSize="18sp" />
<TextView
android:id="@+id/action_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="20dp"
android:text="CANCEL"
android:textColor="#33bbff"
android:textSize="18sp" />
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
不要忘记添加支持库的dependency:
implementation "com.android.support:appcompat-v7:$supportLibVersion"
结果: