【Android】28.0 UI開發(fā)(十)——Android對(duì)話框合集

1.0 Android對(duì)話框哄辣,因?yàn)樾枨蟮牟煌瑫?huì)有很多種请梢。如下:
2019-03-22_142509.png
2.0 本篇的內(nèi)容主要有:
  • 1.確定取消對(duì)話框
  • 2.單選對(duì)話框
  • 3.多選對(duì)話框
  • 4.進(jìn)度對(duì)話框
  • 5.有具體進(jìn)度的對(duì)話框
3.0 新建一個(gè)項(xiàng)目Dialogs,目錄如下:
2019-03-22_171314.png
4.0 先簡(jiǎn)單寫好布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click01"
        android:text="確定取消對(duì)話框"/>

    <Button
        android:id="@+id/button5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click02"
        android:text="單選對(duì)話框"/>

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click03"
        android:text="多選對(duì)話框"/>

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click04"
        android:text="進(jìn)度對(duì)話框"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click05"
        android:text="有具體進(jìn)度的對(duì)話框"/>
</LinearLayout>
2019-03-22_144243.png
5.0 確定取消對(duì)話框
    /**
     * 彈出確定取消對(duì)話框
     *
     * @param view
     */
    public void click01(View view) {
        // 工廠設(shè)計(jì)模式,得到創(chuàng)建對(duì)話框的工廠
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("警告");
        builder.setMessage("若練此功力穗,必先自宮毅弧,是否繼續(xù)?");
        builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "即便自宮当窗,也不一定能成功够坐!", Toast.LENGTH_SHORT).show();
            }
        });
        builder.setNegativeButton("否", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "如不自宮,一定不成功", Toast.LENGTH_SHORT).show();
            }
        });
        //千萬(wàn)別忘了這一步
        builder.show();
        //以前寫的格式是:
        //builder.creste();
        //builder.show();
        //但我們查看show()源代碼
        //會(huì)發(fā)現(xiàn)這個(gè)方法里面已經(jīng)調(diào)用了create()方法
    }

demo完整的代碼放最后崖面,先解釋下原理元咙。

5.1 Android提供了AlertDialog.Builder 類,注意導(dǎo)的包有兩個(gè)
  • import android.app.AlertDialog 這里我們導(dǎo)入默認(rèn)的就行了巫员。在 **`Android 5.0以下就是原始風(fēng)格庶香, 5.0 以上為 Material 風(fēng)格。
  • android.support.v7.app.AlertDialog 這個(gè)V7包中的AlertDialogAndroid2.1以上 可以提供兼容性的Material 風(fēng)格 Dialog简识。也就是說赶掖,使用這個(gè)包中的AlertDialog的話感猛,從2.1到7.0都是Material風(fēng)格Dialog

這兩AlertDialog具體什么差別奢赂,可以參考這篇文章:
Material風(fēng)格的Dialog(android.support.v7.app.AlertDialog)

具體Material風(fēng)格是什么樣子陪白,可以參考這篇文章:
Android Material Design風(fēng)格基本使用(實(shí)現(xiàn)簡(jiǎn)易新聞APP)

  • 這里Android提供了AlertDialog.Builder的寫法,大家可能會(huì)覺得怪異呈驶。
    2019-03-22_150203.png

    我們可以查看源代碼拷泽,發(fā)現(xiàn)BuilderAlertDialog類的內(nèi)部類,所以這里需要點(diǎn)一下袖瞻。
    2019-03-22_150501.png

運(yùn)行效果:


001.gif
6.0 單選對(duì)話框
 /**
     * 單選對(duì)話框
     *
     * @param view
     */
    public void click02(View view) {
        // 工廠設(shè)計(jì)模式司致,得到創(chuàng)建對(duì)話框的工廠
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("請(qǐng)選擇您的性別:");
        final String[] items = {"男", "女", "人妖"};
        //第一個(gè)參數(shù)傳入具體選項(xiàng);
        //第二個(gè)參數(shù)聋迎,默認(rèn)勾選脂矫;沒有勾選,傳入-1霉晕;
        //第三個(gè)參數(shù)傳入 點(diǎn)擊監(jiān)聽
        builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "您的性別為:" + items[which], Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });
        builder.show();
    }

我們?cè)诰帉懛椒ǖ臅r(shí)候庭再,可以發(fā)現(xiàn):


2019-03-22_151453.png
  • 1.從資源文件中裝載數(shù)據(jù):
public AlertDialog.Builder setSingleChoiceItems(int itemsId, int checkedItem, final OnClickListener listener)
  • 2.從數(shù)據(jù)集中裝載數(shù)據(jù)
public AlertDialog.Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn, final OnClickListener listener)
  • 3.從字符串?dāng)?shù)組中裝載數(shù)據(jù)
public AlertDialog.Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)
  • 4.從ListAdapter對(duì)象中裝載數(shù)據(jù)
public AlertDialog.Builder setSingleChoiceItems(ListAdapter adpater, int checkedItem, final OnClickListener listener)

這四種方法有時(shí)間再一一舉例,目前使用的時(shí)就用上面例子中的這種即可牺堰。

運(yùn)行效果:


002.gif
6.0 多選對(duì)話框
    /**
     * 多選對(duì)話框
     *
     * @param view
     */
    public void click03(View view) {
        // 工廠設(shè)計(jì)模式拄轻,得到創(chuàng)建對(duì)話框的工廠
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle("請(qǐng)選擇您愛吃的水果:");
        final String[] items = {"蘋果", "梨子", "香蕉", "菠蘿", "哈密瓜"};
        final boolean[] checkeds = {true, false, true, false, true};

        //第一個(gè)參數(shù)傳入具體選項(xiàng);
        //第二個(gè)參數(shù)伟葫,具體選項(xiàng)是否被選中的數(shù)組
        //第三個(gè)參數(shù)傳入 點(diǎn)擊監(jiān)聽
        builder.setMultiChoiceItems(items, checkeds, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                Toast.makeText(MainActivity.this, items[which] + isChecked, Toast.LENGTH_SHORT).show();
            }
        });
        builder.setPositiveButton("提交", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //這里簡(jiǎn)單處理下選中的內(nèi)容恨搓,便于后面輸出查看
                //遍歷checkeds,判斷真假
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < checkeds.length; i++) {
                    if (checkeds[i]) {
                        sb.append(items[i] + " ");
                    }
                }
                Toast.makeText(MainActivity.this, "您喜歡吃的水果是:" + sb.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        builder.show();
    }

和單選對(duì)話框類似筏养。

同樣斧抱,setMultiChoiceItems()方法有3種:

代碼中有解釋。

第一個(gè)參數(shù)變成了需要一個(gè)Cursor對(duì)象

從資源文件中裝載數(shù)據(jù)渐溶。

上面變藍(lán)色的字體可以點(diǎn)擊直接進(jìn)入Android SDK API文檔辉浦。

運(yùn)行效果:


003.gif
7.0 進(jìn)度對(duì)話框

進(jìn)度對(duì)話框所用的ProgressDialog 是AlertDialog的子類。
點(diǎn)擊可以查看API文檔:公共類 ProgressDialog

    /**
     * 進(jìn)度對(duì)話框
     *
     * @param view
     */
    public void click04(View view) {
        final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("請(qǐng)稍后:");
        pd.setMessage("正在拼命加載中...");
        pd.show();

        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //將進(jìn)度條關(guān)閉
                pd.dismiss();
            }
        }.start();
    }

運(yùn)行效果:


004.gif
8.0 帶具體進(jìn)度的對(duì)話框
    /**
     * 帶具體進(jìn)度的對(duì)話框
     *
     * @param view
     */
    public void click05(View view) {
        final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("請(qǐng)稍后:");
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage("正在拼命加載中...");
        // 設(shè)置進(jìn)度條的最大值
        pd.setMax(100);
        pd.show();

        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(300);
                        pd.setProgress(i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //將進(jìn)度條關(guān)閉
                pd.dismiss();
            }
        }.start();
    }

運(yùn)行效果:

005.gif

在java語(yǔ)言中實(shí)現(xiàn)復(fù)選框被選中可以這樣:
實(shí)例.setChecked(true);

我這里只是簡(jiǎn)單的實(shí)現(xiàn)茎辐,強(qiáng)調(diào)原理宪郊,下面這篇文章可以工程化的處理對(duì)話框:
Android Dialog使用詳解
里面還實(shí)現(xiàn)了自定義對(duì)話框用于實(shí)現(xiàn)如下效果:

2019-03-23_004726.png

9.0 附上MainActivity.java源碼
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 彈出確定取消對(duì)話框
     *
     * @param view
     */
    public void click01(View view) {
        // 工廠設(shè)計(jì)模式,得到創(chuàng)建對(duì)話框的工廠
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("警告");
        builder.setMessage("若練此功拖陆,必先自宮弛槐,是否繼續(xù)?");
        builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "啊...即便自宮慕蔚,也不一定能成功", Toast.LENGTH_SHORT).show();
            }
        });
        builder.setNegativeButton("否", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "如果不自宮丐黄,一定不成功", Toast.LENGTH_SHORT).show();
            }
        });
        builder.show();
    }

    /**
     * 單選對(duì)話框
     *
     * @param view
     */
    public void click02(View view) {
        // 工廠設(shè)計(jì)模式斋配,得到創(chuàng)建對(duì)話框的工廠
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("請(qǐng)選擇您的性別:");
        final String[] items = {"男", "女", "人妖"};
        builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "您的性別為:" + items[which], Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });
        builder.show();
    }

    /**
     * 多選對(duì)話框
     *
     * @param view
     */
    public void click03(View view) {
        // 工廠設(shè)計(jì)模式孔飒,得到創(chuàng)建對(duì)話框的工廠
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("請(qǐng)選擇您愛吃的水果:");
        final String[] items = {"蘋果", "梨子", "香蕉", "菠蘿", "哈密瓜"};
        final boolean[] checkeds = {true, false, true, false, true};
        builder.setMultiChoiceItems(items, checkeds, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                Toast.makeText(MainActivity.this, items[which] + isChecked, Toast.LENGTH_SHORT).show();
            }
        });
        builder.setPositiveButton("提交", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < checkeds.length; i++) {
                    if (checkeds[i]) {
                        sb.append(items[i] + " ");
                    }
                }
                Toast.makeText(MainActivity.this, "您喜歡吃的水果是:" + sb.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        builder.show();
    }

    /**
     * 進(jìn)度對(duì)話框
     *
     * @param view
     */
    public void click04(View view) {
        final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("請(qǐng)稍后:");
        pd.setMessage("正在拼命加載中...");
        pd.show();
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                pd.dismiss();
            }
        }.start();
    }

    /**
     * 帶具體進(jìn)度的對(duì)話框
     *
     * @param view
     */
    public void click05(View view) {
        final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("請(qǐng)稍后:");
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage("正在拼命加載中...");
        // 設(shè)置進(jìn)度條的最大值
        pd.setMax(100);
        pd.show();

        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(300);
                        pd.setProgress(i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                pd.dismiss();
            }
        }.start();
    }
}

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灌闺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坏瞄,更是在濱河造成了極大的恐慌桂对,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠匀,死亡現(xiàn)場(chǎng)離奇詭異蕉斜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缀棍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宅此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爬范,你說我怎么就攤上這事父腕。” “怎么了青瀑?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵璧亮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我斥难,道長(zhǎng)枝嘶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任哑诊,我火速辦了婚禮群扶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搭儒。我一直安慰自己穷当,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布淹禾。 她就那樣靜靜地躺著馁菜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃岔。 梳的紋絲不亂的頭發(fā)上汪疮,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音毁习,去河邊找鬼智嚷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纺且,可吹牛的內(nèi)容都是我干的盏道。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼载碌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼猜嘱!你這毒婦竟也來了衅枫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朗伶,失蹤者是張志新(化名)和其女友劉穎弦撩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论皆,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡益楼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了点晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片感凤。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粒督,靈堂內(nèi)的尸體忽然破棺而出俊扭,到底是詐尸還是另有隱情,我是刑警寧澤坠陈,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布萨惑,位于F島的核電站,受9級(jí)特大地震影響仇矾,放射性物質(zhì)發(fā)生泄漏庸蔼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一贮匕、第九天 我趴在偏房一處隱蔽的房頂上張望姐仅。 院中可真熱鬧,春花似錦刻盐、人聲如沸掏膏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馒疹。三九已至,卻和暖如春乙墙,著一層夾襖步出監(jiān)牢的瞬間颖变,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工听想, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腥刹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓汉买,卻偏偏與公主長(zhǎng)得像衔峰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容