Android自定义提醒对话框
在本教程中,我们将在Android应用程序中讨论和实现自定义提醒对话框。
我们已经在此处讨论了Android警报对话框。
警报对话框
默认情况下,"警报对话框"用于创建包含文本消息和按钮操作的对话框。
以下是我们在上一教程中已经讨论过的setter方法。
- setTitle
- setMessage
- setPositiveButton
- setNegativeButton
- setNeutralButton
- setPositiveButtonIcon/setNegativeButtonIcon/setNeutralButtonIcon
- setCancelable
- setIcon
- setOnDismissListener
- setItems –在警报对话框内以列表形式显示项目数组
- setMultiChoiceItems –设置要在警报对话框中选择的项目列表
- setView –用于在警报对话框内设置自定义布局视图。
- show()
- setShowListener()–在屏幕上显示警报对话框时触发。
我们可以在这里进行任何动态更改
ProgressDialog是带有ProgressBar小部件的AlertDialog。
在以下部分中,我们将创建不同类型的自定义提醒对话框:
- 带项目列表
- 使用EditText
- 使用ImageView
- 与SeekBar
- 有RatingBar
代码
下面给出了activity_main.xml布局文件的代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/btnSimpleAlert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="simpleAlert" android:text="SIMPLE ALERT DIALOG" <Button android:id="@+id/btnAlertWithItems" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="withItems" android:text="WITH ITEMS" <Button android:id="@+id/btnAlertWithMultiChoiceItems" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="withMultiChoiceItems" android:text="WITH MULTI CHOICE ITEMS" <Button android:id="@+id/btnAlertWithEditText" android:layout_width="wrap_content" android:onClick="withEditText" android:layout_height="wrap_content" android:text="WITH EDIT TEXT" <Button android:id="@+id/btnAlertWithImageView" android:layout_width="wrap_content" android:onClick="withImageView" android:layout_height="wrap_content" android:text="WITH IMAGE VIEW" <Button android:id="@+id/btnAlertWithSeekBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="withSeekBar" android:text="WITH SEEK BAR" <Button android:id="@+id/btnAlertWithRatingBar" android:layout_width="wrap_content" android:onClick="withRatingBar" android:layout_height="wrap_content" android:text="WITH RATING BAR" </LinearLayout>
每个按钮都会创建一个AlertDialog。
我们为每个方法都设置了onClick方法,该方法将在MainActivity.java类中定义。
简单警报对话框
将以下方法添加到您的MainActivity.java中:
public void simpleAlert(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Simple Alert"); builder.setMessage("We have a message"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(), "OK was clicked", Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(), android.R.string.no, Toast.LENGTH_SHORT).show(); } }); builder.setCancelable(false); builder.show(); }
这是AlertDialog的最简单形式。
让我们来看看更有趣的内容。
AlertDialog.Builder用于构建AlertDialog。
要显示AlertDialog,我们也可以使用以下代码:
AlertDialog alertDialog = builder.create(); alertDialog.show();
AlertDialog显示项目列表
public void withItems(View view) { final String[] items = {"Apple", "Banana", "Orange", "Grapes"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("List of Items") .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(), items[which] + " is clicked", Toast.LENGTH_SHORT).show(); } }); builder.setPositiveButton("OK", null); builder.setNegativeButton("CANCEL", null); builder.setNeutralButton("NEUTRAL", null); builder.setPositiveButtonIcon(getResources().getDrawable(android.R.drawable.ic_menu_call, getTheme())); builder.setIcon(getResources().getDrawable(R.drawable.jd, getTheme())); AlertDialog alertDialog = builder.create(); alertDialog.show(); Button button = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); button.setBackgroundColor(Color.BLACK); button.setPadding(0, 0, 20, 0); button.setTextColor(Color.WHITE); }
在setItems
方法中,我们传递要显示的字符串数组。
其中哪个参数包含被单击列表项的索引。
我们可以通过在alertDialog实例上检索Button实例并设置文本颜色等来自定义Button文本和样式。
默认情况下,按钮的颜色是从styles.xml中定义的colorAccent值设置的
具有多个选择列表的AlertDialog
public void withMultiChoiceItems(View view) { final String[] items = {"Apple", "Banana", "Orange", "Grapes"}; final ArrayList<Integer> selectedList = new ArrayList<>(); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("This is list choice dialog box"); builder.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { if (isChecked) { selectedList.add(which); } else if (selectedList.contains(which)) { selectedList.remove(which); } } }); builder.setPositiveButton("DONE", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { ArrayList<String> selectedStrings = new ArrayList<>(); for (int j = 0; j < selectedList.size(); j++) { selectedStrings.add(items[selectedList.get(j)]); } Toast.makeText(getApplicationContext(), "Items selected are: " + Arrays.toString(selectedStrings.toArray()), Toast.LENGTH_SHORT).show(); } }); builder.show(); }
这是我们之前看到的简单项目列表的更好版本。
列表中的每个项目旁边都有一个CheckBox。
isChecked布尔值返回checkBox当前状态。
单击"按钮"后,我们通过将填充的selectedItems转换为ArrayList来显示所选项目的列表。
具有EditText的AlertDialog
使用setView属性,我们可以从布局中设置自定义视图,也可以通过编程方式进行。
在下面的函数中,我们以编程方式完成了此操作。
public void withEditText(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("With Edit Text"); final EditText input = new EditText(MainActivity.this); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); input.setLayoutParams(lp); builder.setView(input); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(getApplicationContext(), "Text entered is " + input.getText().toString(), Toast.LENGTH_SHORT).show(); } }); builder.show(); }
使用ImageView的警报对话框
其中我们将在我们的setView
方法中添加自定义布局。
以下是将在AlertDialog中显示的布局:
alert_dialog_with_imageview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="350dp" android:scaleType="centerCrop" android:adjustViewBounds="true" android:src="@drawable/sample" </LinearLayout>
在MainActivity.java类中添加以下函数:
public void withImageView(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = getLayoutInflater(); View dialogLayout = inflater.inflate(R.layout.alert_dialog_with_imageview, null); builder.setPositiveButton("OK", null); builder.setView(dialogLayout); builder.show(); }
带搜索列的警报对话框
public void withSeekBar(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("With SeekBar"); final SeekBar seekBar = new SeekBar(MainActivity.this); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); seekBar.setLayoutParams(lp); builder.setView(seekBar); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(getApplicationContext(), "Progress is " + seekBar.getProgress(), Toast.LENGTH_SHORT).show(); } }); builder.show(); }
单击按钮后,我们将显示SeekBar的进度值。
带等级列的警报对话框
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RatingBar android:id="@+id/ratingBar" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="5" android:stepSize="0.5" </LinearLayout>
public void withRatingBar(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = getLayoutInflater(); builder.setTitle("With RatingBar"); View dialogLayout = inflater.inflate(R.layout.alert_dialog_with_ratingbar, null); final RatingBar ratingBar = dialogLayout.findViewById(R.id.ratingBar); builder.setView(dialogLayout); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(getApplicationContext(), "Rating is " + ratingBar.getRating(), Toast.LENGTH_SHORT).show(); } }); builder.show(); }
在MainActivity.java类中添加了上述所有方法之后,就可以构建并运行我们的应用程序。