在开发中有时侯需要提示用户一些信息,或者选择设置一些东西,这个时候就需要提示框组件了,好在Android有原生的AlertDialog,用起来非常方便,下面是我整理的常用的各种提示框常用方法。

先来一张动图镇场子:

AlertDialog常用创建方法-LMLPHP

基础方法:

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();
    }

 

 

10-04 15:53