1. 程式人生 > >安卓自定義列表dialog

安卓自定義列表dialog

前言


這個形式也是最常用的,不過最近需要用到列表資訊Dialog,原生的不光樣式不能滿足需求,而且是開發電視端的APP,需要對焦點進行特殊處理,所以就需要自定義Dialog

我們先來看一下系統自帶的列表Dialog。

系統自帶列表Dialog

第一種:純列表

我們先來看第一種:

最簡單的一種,沒有當前狀態,只有列表,選中之後彈框就會消失(非手動呼叫dialog.dismiss()



程式碼如下:

AlertDialog alertDialog = new AlertDialog
    .Builder(MainActivity.this)
    .setItems(new
String[]{"科目一", "科目二", "科目三"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this,"選擇了第"+which+"個",Toast.LENGTH_SHORT).show(); } }).create(); alertDialog.show();

第二種:單選列表

這種列表會有checked提示,setSingleChoiceItems()中第二個引數就是控制第幾個被選中,而且點選之後不會自動消失,需要手動呼叫dialog.dismiss(),有時會配合setNegativeButton()、setPositiveButton等一起使用。



程式碼如下:

AlertDialog alertDialog = new AlertDialog
    .Builder(MainActivity.this)
    .setSingleChoiceItems(new String[]{"科目一", "科目二", "科目三"}, 0, new DialogInterface.OnClickListener() {
        @Override
public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this,"選擇了第"+which+"個",Toast.LENGTH_SHORT).show(); } }).create(); alertDialog.show();

第三種:多選列表

這種列表也會有checked提示,而且是多選框,setSingleChoiceItems()的第二個引數是boolean陣列,控制哪些被選中。而且點選之後也不會自動消失,需要手動呼叫dialog.dismiss(),有時會配合setNegativeButton()、setPositiveButton()等一起使用。



程式碼如下:

AlertDialog alertDialog = new AlertDialog
    .Builder(MainActivity.this)
    .setMultiChoiceItems(new String[]{"科目一", "科目二", "科目三"}, new boolean[]{true, false, true}, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            Toast.makeText(MainActivity.this,"選擇了第"+which+"個",Toast.LENGTH_SHORT).show();
        }
    }).create();
alertDialog.show();

自定義Dialog

看了系統自帶的效果你會發現不能滿足UI的效果,那麼接下來進行我們的自定義。

第一步:自定義item的佈局檔案

item佈局檔案dialog_item.xml程式碼

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/contentConstraintLayout"
    android:layout_width="@dimen/dp_450"
    android:layout_height="@dimen/dp_85">

    <TextView
        android:id="@+id/typeTextview"
        android:textSize="@dimen/sp_30"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:text="256Kbps"
        android:textColor="@color/color_212121"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/stateImageView"
        android:layout_width="@dimen/dp_65"
        android:layout_height="@dimen/dp_65"
        android:layout_marginEnd="17dp"
        android:background="@drawable/diglog_sel"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

圖片選中效果diglog_sel.xml程式碼

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/selected" android:state_selected="true" />
    <item android:drawable="@android:color/transparent" />
</selector>

第二步:自定義adapter

我這裡只是傳遞一些簡單的資料到adapter,具體看實際業務傳遞不同的資料,控制不同的效果。

public class DialogItemAdapter extends BaseAdapter {
    //這裡可以傳遞個物件,用來控制不同的item的效果
    //比如每個item的背景資源,選中樣式等
    public List<String> list;
    LayoutInflater inflater;

    public DialogItemAdapter(Context context, List<String> list) {
        this.list = list;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public String getItem(int i) {
        if (i == getCount() || list == null) {
            return null;
        }
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.dialog_item, null);
            holder.typeTextview = (TextView) convertView.findViewById(R.id.typeTextview);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.typeTextview.setText(getItem(position));
        return convertView;
    }

    public static class ViewHolder {
        public TextView typeTextview;
    }
}

第三步:使用

DialogItemAdapter adapter = new DialogItemAdapter(MainActivity.this, iniDatas());

AlertDialog alertDialog = new AlertDialog
     .Builder(MainActivity.this)
    .setSingleChoiceItems(adapter, 0, new DialogInterface.OnClickListener() {
        @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
        }
    }).create();
alertDialog.show();
public List<String> iniDatas() {
    List<String> list = new ArrayList<String>();

    list.add("科目一");
    list.add("科目二");
    list.add("科目三");

    return list;
}


博主這個dialog要在TV上使用,所以可以看到通過上下鍵控制選中的時候右邊會有一個選中箭頭,然後在點選的時候dismiss

更多效果等待你可自行打造你的專屬Dialog。

相關推薦

定義列表dialog

前言 這個形式也是最常用的,不過最近需要用到列表資訊Dialog,原生的不光樣式不能滿足需求,而且是開發電視端的APP,需要對焦點進行特殊處理,所以就需要自定義Dialog 我們先來看一下系統自帶的列表Dialog。 系統自帶列表Dialog

去除定義Dialog黑色背景,設置無邊框,透明

isf window bsp 希望 nbsp tle -name rep lan 我們在自定義Dialog的時候,往往會希望除去安卓系統定義背景和標題,以便於更好的顯示我們自己想要的效果。 其實我們只需要註意幾個地方就行了。 1.在Style文件的中定義Dialog的主題

定義dialog

MyDialog.java public class MyDialog extends Dialog { public MyDialog(@NonNull Context context) { super(context); se

解決定義Dialog不能水平填滿螢幕

問題描述: UI設計,需要展示一個底部充滿螢幕的彈出框,但是發現下面和左右都沒有充滿。 預期: 實際: 解決方案: 自定義的Dialog中呼叫父類建構函式時,需要設定style 完整自定義dialog程式碼如下: 1.CustDialog.java pa

定義彈框(Dialog

  1.在style檔案中建立一個style <style name="dialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</

定義Dialog之BaseDialog

專案裡用到的dialog越來越多,樣式也各式各樣,為了方便,所以就考慮寫一個BaseDialog。 新建BaseDialog繼承Dialog public class BaseDialog extends Dialog {

定義Dialog的實現

一、Dialog佈局檔案 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/andr

定義Dialog(一)

這個自定義Dialog主要是提醒使用者一些資訊:該環境沒有網,登入賬號是提示密碼錯誤.... 話不多說直接上程式碼: 一.實現功能的.java類 public static Dialog CreatDialog(Context context, String s,

定義:Toast 以及Toast的出場動畫 以及Toast上新增圖片 以及點選事件

安卓自定義Toast: 1.自定義一個類:CustomToast 繼承自:Toast 2.在CustomToast類中 新增一個靜態 mCustomToast 物件 private static CustomToast mCustomToast; 3.在CustomToast類中 新

定義switch樣式

榮耀手機鬧鐘開關的switch樣式,最近簡單的方法可以直接設定兩張圖片,根據按鈕狀態來進行切換。 這裡主要說另外一種方式 首先建立兩個track的資原始檔,也就是後面的背景 建立未開啟狀態下的track起名為track_bg_gray <?xml version="1.0

Android定義由底部彈出對話方塊

努力不一定立刻會有好的結果,但一定是朝著好的方向                           ——李尚龍 《你所謂的穩定,不過是在浪費生命》

定義View進階-手勢檢測(GestureDecetor)

Android 手勢檢測,主要是 GestureDetector 相關內容的用法和注意事項,本文依舊屬於事件處理這一體系,部分內容會涉及到之前文章提及過的知識點,如果你沒看過之前的文章,可以到 自定義 View 系列 來檢視這些內容。 在開發 Android 手機應用過程中,可

定義View進階-多點觸控詳解

Android 多點觸控詳解,在前面的幾篇文章中我們大致瞭解了 Android 中的事件處理流程和一些簡單的處理方案,本次帶大家瞭解 Android 多點觸控相關的一些知識。 多點觸控 ( Multitouch,也稱 Multi-touch ),即同時接受螢幕上多個點的人機互動

定義View進階-特殊控制元件的事件處理方案

本文帶大家瞭解 Android 特殊形狀控制元件的事件處理方式,主要是利用了 Region 和 Matrix 的一些方法,超級實用的事件處理方案,相信看完本篇之後,任何奇葩控制元件的事件處理都會變得十分簡單。 不得不說,Android 對事件體系封裝的非常棒,即便對事件體系不太

定義View進階-MotionEvent詳解

Android MotionEvent 詳解,之前用了兩篇文章 事件分發機制原理 和 事件分發機制詳解 來講解事件分發,而作為事件分發主角之一的 MotionEvent 並沒有過多的說明,本文就帶大家瞭解 MotionEvent 的相關內容,簡要介紹觸控事件,主要包括 單點觸控、多點

定義View進階-事件分發機制詳解

Android 事件分發機制詳解,在上一篇文章 事件分發機制原理 中簡要分析了一下事件分發機制的原理,原理是十分簡單的,一句話就能總結:責任鏈模式,事件層層傳遞,直到被消費。 雖然原理簡單,但是隨著 Android 不斷的發展,實際運用場景也越來越複雜,所以想要徹底玩轉事件分發機制還

定義View進階-Matrix Camera

本篇依舊屬於Matrix,主要講解Camera,Android下有很多相機應用,其中的美顏相機更是不少,不過今天這個Camera可不是我們平時拍照的那個相機,而是graphic包下的Camera,專業給View拍照的相機,不過既然是相機,作用都是類似的,主要是將3D的內容拍扁變成2D

定義View進階-Matrix詳解

這應該是目前最詳細的一篇講解Matrix的中文文章了,在上一篇文章Matrix原理中,我們對Matrix做了一個簡單的瞭解,偏向理論,在本文中則會詳細的講解Matrix的具體用法,以及與Matrix相關的一些實用技巧。 ⚠️ 警告:測試本文章示例之前請關閉硬體加速。

定義View進階-Matrix原理

本文內容偏向理論,和 畫布操作 有重疊的部分,本文會讓你更加深入的瞭解其中的原理。 本篇的主角Matrix,是一個一直在後臺默默工作的勞動模範,雖然我們所有看到View背後都有著Matrix的功勞,但我們卻很少見到它,本篇我們就看看它是何方神聖吧。 由於Goog

定義View進階-PathMeasure

可以看到,在經過 Path之基本操作 Path之貝塞爾曲線 和 Path之完結篇 後, Path中各類方法基本上都講完了,表格中還沒有講解到到方法就是矩陣變換了,難道本篇終於要講矩陣了? 非也,矩陣這一部分仍在後面單獨講解,本篇主要講解 PathMeasure 這個類與 Path 的