If you have read Android Alert Dialog Example, you must know how to create and use AlertDialog basically. This article will show you two advanced examples about how to add custom list items and custom view objects in android Alert Dialog.
1. Example Overview.
activity_alert_dialog_custom_view.xml
This is the example layout xml file. Saved in app / res / layout folder.
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/alertDialogCustomAdapterButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Simple Adapter Alert Dialog" /> <Button android:id="@+id/alertDialogCustomViewButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Custom View Alert Dialog" /> <TextView android:id="@+id/alertDialogTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20dp"/> </LinearLayout>
AlertDialogCustomViewActivity.java
package com.dev2qa.example; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.SimpleAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class AlertDialogCustomViewActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alert_dialog_custom_view); setTitle("dev2qa.com --- Custom View Alert Dialog"); TextView textView = (TextView)findViewById(R.id.alertDialogTextView); this.showSimpleAdapterAlertDialog(textView); this.showCustomViewAlertDialog(textView); } }
2. Use SimpleAdapter To Custom List Items In Alert Dialog.
- Create a SimpleAdapter object.
- Call AlertDialog.Builder’s setAdapter() method to set the data adapter.
// Show how to use SimpleAdapter to customize list item in android alert dialog. private void showSimpleAdapterAlertDialog(TextView textView) { final TextView textViewTmp = textView; Button alertDialogButton = (Button)findViewById(R.id.alertDialogCustomAdapterButton); alertDialogButton.setOnClickListener(new View.OnClickListener() { // Each image in array will be displayed at each item beginning. private int[] imageIdArr = {R.drawable.if_candy_cane, R.drawable.if_present, R.drawable.if_snowman}; // Each item text. private String[] listItemArr = {"Candy Cane", "Present", "Snow Man"}; // Image and text item data's key. private final String CUSTOM_ADAPTER_IMAGE = "image"; private final String CUSTOM_ADAPTER_TEXT = "text"; @Override public void onClick(View view) { // Create a alert dialog builder. AlertDialog.Builder builder = new AlertDialog.Builder(AlertDialogCustomViewActivity.this); // Set icon value. builder.setIcon(R.mipmap.ic_launcher); // Set title value. builder.setTitle("Simple Adapter Alert Dialog"); // Create SimpleAdapter list data. List<Map<String, Object>> dialogItemList = new ArrayList<Map<String, Object>>(); int listItemLen = listItemArr.length; for(int i=0;i<listItemLen;i++) { Map<String, Object> itemMap = new HashMap<String, Object>(); itemMap.put(CUSTOM_ADAPTER_IMAGE, imageIdArr[i]); itemMap.put(CUSTOM_ADAPTER_TEXT, listItemArr[i]); dialogItemList.add(itemMap); } // Create SimpleAdapter object. SimpleAdapter simpleAdapter = new SimpleAdapter(AlertDialogCustomViewActivity.this, dialogItemList, R.layout.activity_alert_dialog_simple_adapter_row, new String[]{CUSTOM_ADAPTER_IMAGE, CUSTOM_ADAPTER_TEXT}, new int[]{R.id.alertDialogItemImageView,R.id.alertDialogItemTextView}); // Set the data adapter. builder.setAdapter(simpleAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int itemIndex) { textViewTmp.setText("You choose item " + listItemArr[itemIndex]); } }); builder.setCancelable(false); builder.create(); builder.show(); } }); }
activity_alert_dialog_simple_adapter_row.xml
This layout xml file is used to represent one list item. It is used by SimpleAdapter. It is saved in app / res / layout folder.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/alertDialogItemImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/alertDialogItemTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="50dp"/> </LinearLayout>
3. Custom View In Alert Dialog.
- Define a custom view object use layout xml file.
- Call LayoutInflater().inflate() method to get the custom view in java code.
- Call AlertDialog.Builder’s setView() method to set above custom view.
activity_alert_dialog_custom_view_login_form.xml
This is the custom view layout file. It is saved in app / res / layout folder.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TableLayout android:id="@+id/alertDialogLoginForm" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="35dp"> <!-- User name row. --> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="User Name:" /> <EditText android:id="@+id/loginFormUserName" android:lines="1" android:maxLines="1" android:maxLength="25" /> </TableRow> <!-- Password row. --> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Password:"/> <EditText android:id="@+id/loginFormPassword" android:password="true" android:lines="1" android:maxLines="1" android:maxLength="15"/> </TableRow> <!-- Phone number row. --> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Phone Number:"/> <EditText android:id="@+id/loginFormPhoneNumber" android:phoneNumber="true" android:lines="1" android:maxLines="1" android:maxLength="18"/> </TableRow> <!-- Buttons row. --> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/loginFormRegisterButton" android:text="Register"/> <Button android:id="@+id/loginFormLoginButton" android:text="Login"/> <Button android:id="@+id/loginFormResetButton" android:text="Reset"/> </TableRow> </TableLayout> </LinearLayout>
Below is java code that implement custom view in alert dialog.
// Show how to add custom view in android alert dialog. private void showCustomViewAlertDialog(TextView textView) { final TextView textViewTmp = textView; Button alertDialogButton = (Button)findViewById(R.id.alertDialogCustomViewButton); alertDialogButton.setOnClickListener(new View.OnClickListener() { // Store the created AlertDialog instance. // Because only AlertDialog has cancel method. private AlertDialog alertDialog = null; @Override public void onClick(View view) { // Create a alert dialog builder. final AlertDialog.Builder builder = new AlertDialog.Builder(AlertDialogCustomViewActivity.this); // Set icon value. builder.setIcon(R.mipmap.ic_launcher); // Set title value. builder.setTitle("Custom View Alert Dialog"); // Get custom login form view. final View loginFormView = getLayoutInflater().inflate(R.layout.activity_alert_dialog_custom_view_login_form, null); // Set above view in alert dialog. builder.setView(loginFormView); // Register button click listener. Button registerButton = (Button)loginFormView.findViewById(R.id.loginFormRegisterButton); registerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { // Close Alert Dialog. alertDialog.cancel(); textViewTmp.setText("Register success."); }catch(Exception ex) { ex.printStackTrace(); } } }); // Login button click listener. Button loginButton = (Button)loginFormView.findViewById(R.id.loginFormLoginButton); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { // Close Alert Dialog. alertDialog.cancel(); textViewTmp.setText("Login success."); }catch(Exception ex) { ex.printStackTrace(); } } }); // Reset button click listener. Button resetButton = (Button)loginFormView.findViewById(R.id.loginFormResetButton); resetButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { EditText loginUserName = (EditText)loginFormView.findViewById(R.id.loginFormUserName); EditText loginPassword = (EditText)loginFormView.findViewById(R.id.loginFormPassword); EditText loginPhoneNumber = (EditText)loginFormView.findViewById(R.id.loginFormPhoneNumber); loginUserName.setText(""); loginPassword.setText(""); loginPhoneNumber.setText(""); }catch(Exception ex) { ex.printStackTrace(); } } }); builder.setCancelable(true); alertDialog = builder.create(); alertDialog.show(); } }); }