AlertDialog常用创建方法
在开发中有时侯需要提示用户一些信息,或者选择设置一些东西,这个时候就需要提示框组件了,好在Android有原生的AlertDialog,用起来非常方便,下面是我整理的常用的各种提示框常用方法。
先来一张动图镇场子:
基础方法:
public Builder setTitle(@StringRes int titleId)
public Builder setTitle(CharSequence title)
设置对话框标题,第一个方法传String资源id,第二个直接传字符串
public Builder setCustomTitle(View customTitleView)
设置自定义对话框标题,需要传入一个View对象
public Builder setMessage(@StringRes int messageId)
public Builder setMessage(CharSequence message)
设置对话框消息内容,第一个传String资源id,第二个直接传字符串
public Builder setIcon(@DrawableRes int iconId)
public Builder setIcon(Drawable icon)
public Builder setIconAttribute(@AttrRes int attrId)
前两个方法时设置对话框图标的,第一个传Drawable资源id,第二个传Drawable对象
最后一个方法时设置对框框图标样式的,传style资源id
public Builder setCancelable(boolean cancelable)
设置外部是否可点击,默认为true,点击外部对话框会取消
public Builder setOnCancelListener(OnCancelListener onCancelListener)
设置取消监听
public Builder setOnDismissListener(OnDismissListener onDismissListener)
设置消失监听,这块有一点需要注意,在源码中说setOnCancelListener是针对取消的监听,而如果你想对对话框消失的所有情况进行处理请setOnDismissListener,也就是说无论什么原因导致对话框消失都会触发OnDismissListener方法
普通列表:
public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener)
public Builder setPositiveButton(CharSequence text, final OnClickListener listener)
public Builder setNegativeButton(@StringRes int textId, final OnClickListener listener)
public Builder setNegativeButton(CharSequence text, final OnClickListener listener)
public Builder setNeutralButton(@StringRes int textId, final OnClickListener listener)
public Builder setNeutralButton(CharSequence text, final OnClickListener listener)
这6个方法分别是设置三种按钮的,从上到下,两个一组分别是设置左边的,右边的和中间的按钮的方法。
传的参数大体相似,第一个参数传字符串资源id或者字符串,第一个参数传点击事件,通常用匿名内部类实现。
private void initButtonSet() {
builder = new AlertDialog.Builder(this)
.setTitle("按钮设置")
.setIcon(R.mipmap.ic_launcher)
.setMessage("我美不美")
.setPositiveButton("美", new DialogInterface.OnClickListener() {// 积极
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "恭喜你答对了", Toast.LENGTH_SHORT)
.show();
}
})
.setNegativeButton("不美", new DialogInterface.OnClickListener() {// 消极
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "一点也不老实", Toast.LENGTH_SHORT)
.show();
}
})
.setNeutralButton("不知道", new DialogInterface.OnClickListener() {// 中间级
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "快睁开眼瞅瞅", Toast.LENGTH_SHORT)
.show();
}
})
.create();
builder.show();
}
普通列表:
public Builder setItems(@ArrayRes int itemsId, final OnClickListener listener)
public Builder setItems(CharSequence[] items, final OnClickListener listener)
设置列表有两种方法,一种是传集合资源id,另一种是传字符串数组,然后加一个点击监听
private void initListSet() {
builder = new AlertDialog.Builder(this)
.setIcon(R.mipmap.ic_launcher)
.setTitle("普通列表")
.setItems(province, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, province[which],
Toast.LENGTH_SHORT).show();
}
})
.create();
builder.show();
}
单选列表:
public Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem, final OnClickListener listener)
public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)
public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener)
public Builder setOnItemSelectedListener(final AdapterView.OnItemSelectedListener listener)
前两种方法:第一个参数集合资源id或者字符串数组,第二个参数预选下标,第三个是点击监听
最后两种方法可以设置自定义的适配器,更自由一些,展示的内容可以自己定制,设置适配器内项目的点击监听
private void initSigleChoice(){
builder=new AlertDialog.Builder(this)
.setIcon(R.mipmap.ic_launcher)
.setTitle("单选列表")
.setSingleChoiceItems(province, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, province[which],
Toast.LENGTH_SHORT).show();
}
})
.create();
builder.show();
}
多选列表:
public Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
两个方法设置多选列表,第一个参数传集合资源id或者字符串数组,第一个参数传初始每个item的选择情况,最后是多选监听
private void initMultiChoiceItems() {
builder = new AlertDialog.Builder(this)
.setTitle("多选列表")
.setMultiChoiceItems(province,
new boolean[]{false, false, false, false, false, false, false, false},
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which, boolean isChecked) {
// TODO Auto-generated method stub
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, int which) {
// 扫描所有的列表项,如果当前列表项被选中,将列表项的文本追加到selectStr变量中。
for (int i = 0; i < province.length; i++) {
if (listView.getCheckedItemPositions().get(i)) {
selectStr += listView.getAdapter().getItem(i) + " ";
}
}
// 用户至少选择了一个列表项
if (listView.getCheckedItemPositions().size() > 0) {
dialogs = new AlertDialog.Builder(MainActivity.this)
.setMessage(selectStr)
.show();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
dialogs.dismiss();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
}
// 用户未选择任何列表项
else if (listView.getCheckedItemPositions().size() <= 0) {
new AlertDialog.Builder(MainActivity.this)
.setMessage("您未选择任何省份").show();
}
}
})
.setNegativeButton("取消", null)
.create();
listView = builder.getListView();
builder.show();
}
适配器设置:
public Builder setAdapter(final ListAdapter adapter, final OnClickListener listener)
第一个参数是适配器,第二个参数是item点击监听
TestAdapter.java
package com.example.alertdialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.Random;
public class TestAdapter extends BaseAdapter {
private String[] mList;
private Context mContext;
public TestAdapter(Context context, String[] list){
mContext = context;
mList = list;
}
@Override
public int getCount() {
return mList.length;
}
@Override
public Object getItem(int i) {
return mList[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int postion, View view, ViewGroup viewGroup) {
final viewHolder viewHolder;
if (view == null){
viewHolder = new viewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.layout_test_adapter,null);
view.setTag(viewHolder);
viewHolder.text1 = view.findViewById(R.id.text1);
viewHolder.text2=view.findViewById(R.id.text2) ;
}else {
viewHolder = (viewHolder) view.getTag();
}
viewHolder.text1.setText(mList[new Random().nextInt(mList.length)]);
viewHolder.text2.setText(mList[new Random().nextInt(mList.length)]);
return view;
}
static class viewHolder{
public TextView text1;
public TextView text2;
}
}
layout_test_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/text1"
android:text="第一个"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/text2"
android:text="第二个"/>
</LinearLayout>
private void initAdapterSet(){
builder=new AlertDialog.Builder(this)
.setTitle("适配器设置")
.setIcon(R.mipmap.ic_launcher)
.setAdapter(
new TestAdapter(MainActivity.this,province),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, province[which],
Toast.LENGTH_SHORT).show();
}
}).create();
builder.show();
}
自定义视图:
public Builder setView(int layoutResId)
public Builder setView(View view)
public Builder setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom)
自定义视图是所有样式中最自由的
第一个方法传布局id,但是无法添加监听
第二个方法传view对象,可以预先添加监听
第三个方法不但可以传view对象,后面四个参数还分别对应左上右下边距。
private void initCustomSet(){
View view=View.inflate(MainActivity.this,R.layout.layout_test_adapter,null);
final TextView textView1=view.findViewById(R.id.text1);
final TextView textView2=view.findViewById(R.id.text2);
textView1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView1.setText("点击了视图1");
}
});
textView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView2.setText("点击了视图2");
}
});
builder=new AlertDialog.Builder(this)
.setTitle("自定义视图")
.setIcon(R.mipmap.ic_launcher)
.setView(view)
.create();
builder.show();
}