Android自定义提醒对话框

时间:2020-02-23 14:28:51  来源:igfitidea点击:

在本教程中,我们将在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类中添加了上述所有方法之后,就可以构建并运行我们的应用程序。