安卓簡單開發-幾種dialog創建和使用

博主話不多,我們直接代碼:  代碼中註釋會寫的很清楚

MainActivity.java  

public class MainActivity extends Activity  implements CustomDialogFragment.Callback {

    private String[] items;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        items = getResources().getStringArray(R.array.skills);
    }

    public void showAlertDialog(View v) {

        // Builder 模式:建造者模式
        // AlertDialog 的構造方法【受保護】,使用 Builder 創建對話框
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // builder.setIcon()
        builder.setTitle("標題");
        builder.setMessage("對話框的文本內容");

        // 不可取消【默認 true】
        builder.setCancelable(false);

        // 設置按鈕:確定、取消、中立【顯示的位置固定】
        builder.setPositiveButton(R.string.button_ok, dialogListener);
        builder.setNegativeButton(R.string.button_cancel, dialogListener);
        builder.setNeutralButton(R.string.button_neutral, dialogListener);

        // 創建對話框
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    OnClickListener dialogListener = new DialogInterface.OnClickListener() {

        /**
         * 對話框中按鈕的點擊事件
         * @param dialog    事件源所在的對話框
         * @param which     事件源(按鈕)
         */
        @Override
        public void onClick(DialogInterface dialog, int which) {

            switch (which) {
                case DialogInterface.BUTTON_POSITIVE:
                    // 確定
                    break;

                case DialogInterface.BUTTON_NEGATIVE:
                    // 取消
                    break;

                case DialogInterface.BUTTON_NEUTRAL:
                    // 中立
                    break;
            }
        }
    };

    public void showListAlertDialog(View v) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("列表對話框");

        // 參數一:列表中的數據集
        // 參數二:監聽器
        builder.setItems(items, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // which 是列表中選中項的位置【索引】
                showToast(items[which]);
            }
        });

        // 設置取消按鈕【不需要確定按鈕,選中即確定】
        builder.setNegativeButton(R.string.button_cancel, null);
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    public void showSingleListAlertDialog(View v) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("單選列表對話框");

        // 參數一:列表中的數據集
        // 參數二:默認選中的位置,-1 無默認選中項
        builder.setSingleChoiceItems(items, -1, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // which 是列表中選中項的位置【索引】
                showToast(items[which]);
            }
        });

        builder.setNegativeButton(R.string.button_cancel, null);
        builder.setPositiveButton(R.string.button_ok, null);
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    public void showMultiListAlertDialog(View v) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("多選列表對話框");
        builder.setCancelable(false);

        final boolean[] checkedItems = new boolean[items.length];

        // 參數一:列表中的數據集
        // 參數二:列表中各項的狀態(true 爲選中、false 爲未選中)
        // 參數三:多選監聽器 DialogInterface.OnMultiChoiceClickListener
        builder.setMultiChoiceItems(items,
                checkedItems,
                new DialogInterface.OnMultiChoiceClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        checkedItems[which] = isChecked;
                    }
                });

        builder.setNegativeButton(R.string.button_cancel, null);
        builder.setPositiveButton(R.string.button_ok, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast(Arrays.toString(checkedItems));
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    public void showMyDialog(View v) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("自定義對話框");

        // 加載自定義視圖
        // 方案一
        // builder.setView(R.layout.dialog_demo);

        // 方案二
        View view = getLayoutInflater().inflate(R.layout.dialog_demo, null);
        // EditText editTextName = (EditText) view.findViewById(R.id.editText_name);

        builder.setView(view);

        builder.setPositiveButton(R.string.button_ok, null);
        builder.setNegativeButton(R.string.button_cancel, null);

        AlertDialog dialog = builder.create();
        dialog.show();
    }


    public void showDateDialog(View v) {

        // 獲得當前日期
        Calendar now = Calendar.getInstance();
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH);
        int day = now.get(Calendar.DAY_OF_MONTH);

        // 參數一:上下文
        // 參數二:主題【可選】
        // 參數三:監聽器 DatePickerDialog.OnDateSetListener
        DatePickerDialog dialog = new DatePickerDialog(
                this,
                android.R.style.Theme_DeviceDefault_Light_Dialog,
                dateListener,
                year,
                month,
                day);

        dialog.show();
    }

    DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

        }
    };


    public void showTimeDialog(View v) {

        // 獲得當前時間
        Calendar now = Calendar.getInstance();
        int hourOfDay = now.get(Calendar.HOUR_OF_DAY);
        int minute = now.get(Calendar.MINUTE);
        boolean is24Hour = true;

        // 參數一:上下文
        // 參數二:監聽器 TimePickerDialog.OnTimeSetListener
        // 參數三:小時
        // 參數四:分鐘
        // 參數五:是否以 24 小時方式顯示時間
        TimePickerDialog dialog = new TimePickerDialog(
                this,
                timeListener,
                hourOfDay,
                minute,
                is24Hour);

        dialog.show();
    }

    TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        }
    };

    public void showFragmentDialog(View v) {
        MyDialogFragment dialogFragment = new MyDialogFragment();
        dialogFragment.show(getFragmentManager(), "fg");
    }

    public void showCustomFragmentDialog(View v) {
        FragmentManager fm = getFragmentManager();
        CustomDialogFragment dialog = CustomDialogFragment.getInstance("自定義對話框");
        dialog.show(fm, "dialog_tag");
    }

    @Override
    public void doOk() {

    }
    @Override
    public void doCancel() {
    }
    private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
}

CustomDialogFragment.java  
/**
 * 自定義對話框
 */
public class CustomDialogFragment extends DialogFragment implements View.OnClickListener {

    /**
     * 對話框標題
     */
    public static final String EXTRA_TITLE = "title";

    private Callback callback;

    private EditText editTextName;
    private EditText editTextPassword;
    private Button buttonOk;
    private Button buttonCancel;

    private static final String TAG = "CustomDialogFragment";

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d(TAG, "onAttach");

        if (activity instanceof Callback) {
            callback = (Callback) activity;
        }
    }

    /**
     * 創建示例
     *
     * @param title 對話框標題
     * @return 對話框示例
     */
    public static CustomDialogFragment getInstance(String title) {
        CustomDialogFragment fragment = new CustomDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putString(EXTRA_TITLE, title);
        fragment.setArguments(bundle);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        String title = getArguments().getString(EXTRA_TITLE);
        // 設置標題
        getDialog().setTitle(title);

        View view = inflater.inflate(R.layout.dialog_custom, container);

        editTextName = (EditText) view.findViewById(R.id.editText_name);
        editTextPassword = (EditText) view.findViewById(R.id.editText_password);
        buttonOk = (Button) view.findViewById(R.id.button_ok);
        buttonCancel = (Button) view.findViewById(R.id.button_cancel);

        // 獲得焦點
        editTextName.requestFocus();

        // 顯示軟鍵盤
        getDialog().getWindow().setSoftInputMode
                (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

        buttonOk.setOnClickListener(this);
        buttonCancel.setOnClickListener(this);

        return view;
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_ok:
                callback.doOk();
                break;
            case R.id.button_cancel:
                callback.doCancel();
                break;
        }

        // 消失
        dismiss();
    }

    /**
     * CustomDialogFragment 的回調方法
     */
    interface Callback {

        void doOk();

        void doCancel();

    }
}

MyDialogFragment.java  
/**
 * 自定義對話框
 */
public class MyDialogFragment
        extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // 獲得當前日期
        Calendar now = Calendar.getInstance();
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH);
        int day = now.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog dialog = new DatePickerDialog(
                getActivity(),
                android.R.style.Theme_DeviceDefault_Light,
                this,
                year,
                month,
                day);

        return dialog;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    }
}


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<TextView android:text="提示對話框(AlertDialog)" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView_alert"
/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="對話框"
android:id="@+id/button"
android:layout_below="@id/textView_alert"
android:layout_alignParentStart="true"
android:onClick="showAlertDialog"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="列表對話框"
android:id="@+id/button2"
android:layout_alignBottom="@+id/button"
android:layout_toEndOf="@+id/button"
android:onClick="showListAlertDialog"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="單選列表對話框"
android:id="@+id/button3"
android:layout_alignTop="@+id/button2"
android:layout_toEndOf="@+id/button2"
android:onClick="showSingleListAlertDialog"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多選列表對話框"
android:id="@+id/button4"
android:layout_below="@+id/button"
android:layout_alignParentStart="true"
android:onClick="showMultiListAlertDialog"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定義對話框"
android:id="@+id/button5"
android:layout_alignBottom="@+id/button4"
android:layout_toEndOf="@+id/button4"
android:onClick="showMyDialog"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="日期、時間選擇對話框"
android:id="@+id/textView"
android:layout_below="@+id/button4"
android:layout_alignParentStart="true"
android:layout_marginTop="16dp"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="日期"
android:id="@+id/button6"
android:layout_below="@+id/textView"
android:layout_alignParentStart="true"
android:onClick="showDateDialog"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="時間"
android:id="@+id/button7"
android:layout_alignBottom="@+id/button6"
android:layout_alignStart="@+id/button2"
android:onClick="showTimeDialog"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DialogFragment 對話框"
android:id="@+id/textView2"
android:layout_below="@+id/button6"
android:layout_alignParentStart="true"
android:layout_marginTop="16dp"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="對話框"
android:id="@+id/button8"
android:layout_below="@+id/textView2"
android:layout_alignParentStart="true"
android:onClick="showFragmentDialog"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定義對話框"
android:id="@+id/button9"
android:layout_alignBottom="@+id/button8"
android:layout_alignStart="@+id/button7"
android:onClick="showCustomFragmentDialog"/>

</RelativeLayout>


dialog_custom.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"
android:padding="24dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="網絡名稱"
android:textSize="12sp" />

<EditText
android:id="@+id/editText_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="密碼"
android:textSize="12sp" />

<EditText
android:id="@+id/editText_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberPassword" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_ok"
android:id="@+id/button_ok"
android:layout_gravity="right"
android:layout_marginTop="24dp"
style="@android:style/Widget.DeviceDefault.Button.Borderless"
android:textColor="@android:color/holo_blue_dark"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_cancel"
android:id="@+id/button_cancel"
android:layout_gravity="right"
style="@android:style/Widget.DeviceDefault.Button.Borderless"
android:textColor="@android:color/holo_blue_dark"/>
</LinearLayout>


dialog_demo.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"
android:padding="24dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="網絡名稱"
android:textSize="12sp" />

<EditText
android:id="@+id/editText_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="密碼"
android:textSize="12sp" />

<EditText
android:id="@+id/editText_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberPassword" />
</LinearLayout>


當然博主還是希望觀看的同仁,還是仔細去研究一下代碼,而不是去全部複製下來去使用。

見笑了!                                                                                                                         

Just do it!!    lzl

如有不懂歡迎致件:[email protected]  或加羣 570381012




發佈了22 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章