Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีใช้ Singleton Alert Dialog ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตการใช้ Singleton เพื่อจัดการ Alert Dialog แบบรวมศูนย์ (Centralized) ลดโค้ดซ้ำเมื่อต้องแสดง Dialog แบบเดียวกันหลายจุดในแอป

ขั้นตอนการสร้าง

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project → กรอกรายละเอียด

ขั้นตอนที่ 2: จัดรูปแบบหน้าจอ (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/show"
        android:text="Alert Dialog จาก Singleton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

ขั้นตอนที่ 3: เขียนโค้ด MainActivity (src/MainActivity.java)

package com.example.andy.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    Button show;
    SingleTonExample singletonExample;

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

        show = findViewById(R.id.show);
        singletonExample = SingleTonExample.getInstance();
        singletonExample.init(getApplicationContext());

        show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                singletonExample.showAlertDialog(MainActivity.this);
            }
        });
    }
}

ขั้นตอนที่ 4: สร้างคลาส Singleton (SingleTonExample.java)

package com.example.andy.myapplication;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.Toast;

public class SingleTonExample {
    private static SingleTonExample ourInstance = new SingleTonExample();
    private Context appContext;

    private SingleTonExample() { }

    public static Context get() {
        return getInstance().getContext();
    }

    public static synchronized SingleTonExample getInstance() {
        return ourInstance;
    }

    public void init(Context context) {
        if (appContext == null) {
            this.appContext = context;
        }
    }

    private Context getContext() {
        return appContext;
    }

    public void showAlertDialog(final MainActivity activity) {
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setMessage("คุณแน่ใจหรือไม่ ที่ต้องการตัดสินใจนี้?");
        builder.setPositiveButton("ใช่", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(activity, "คุณกดปุ่ม ใช่", Toast.LENGTH_LONG).show();
            }
        });
        builder.setNegativeButton("ไม่", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                activity.finish();
            }
        });
        builder.create().show();
    }
}

การทดสอบ

รันแอปพลิเคชัน หน้าจอเริ่มต้นแสดงตามภาพ

วิธีใช้ Singleton Alert Dialog ใน Android

คลิกปุ่ม จะแสดง Alert Dialog จาก Singleton Class

วิธีใช้ Singleton Alert Dialog ใน Android

การปรับปรุงสำหรับการใช้งานจริง (Production Ready)

1. ทำให้ Dialog แบบ Generic/Reusable

public class DialogManager {
    private static DialogManager instance = new DialogManager();
    
    public static DialogManager getInstance() { return instance; }
    private DialogManager() {}
    
    public void showConfirmDialog(Context context, 
                                  String title, 
                                  String message, 
                                  String positiveText, 
                                  String negativeText,
                                  OnDialogActionListener listener) {
        
        new AlertDialog.Builder(context)
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(positiveText, (d, w) -> listener.onPositive())
            .setNegativeButton(negativeText, (d, w) -> listener.onNegative())
            .setCancelable(false)
            .show();
    }
    
    public interface OnDialogActionListener {
        void onPositive();
        void onNegative();
    }
}

// Usage
DialogManager.getInstance().showConfirmDialog(
    this, "ยืนยัน", "ลบข้อมูลนี้หรือไม่?", "ลบ", "ยกเลิก",
    new DialogManager.OnDialogActionListener() {
        @Override public void onPositive() { deleteData(); }
        @Override public void onNegative() { /* do nothing */ }
    }
);

2. ใช้ DialogFragment (แนะนำ)

public class ConfirmDialogFragment extends DialogFragment {
    public static ConfirmDialogFragment newInstance(String title, String message) {
        ConfirmDialogFragment fragment = new ConfirmDialogFragment();
        Bundle args = new Bundle();
        args.putString("title", title);
        args.putString("message", message);
        fragment.setArguments(args);
        return fragment;
    }
    
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(requireActivity())
            .setTitle(getArguments().getString("title"))
            .setMessage(getArguments().getString("message"))
            .setPositiveButton("ใช่", (d, w) -> 
                ((OnConfirmListener)requireActivity()).onConfirm(true))
            .setNegativeButton("ไม่", (d, w) -> 
                ((OnConfirmListener)requireActivity()).onConfirm(false))
            .create();
    }
    
    public interface OnConfirmListener {
        void onConfirm(boolean confirmed);
    }
}

ข้อดีของ DialogFragment

  • จัดการ Lifecycle เอง รอดชีวิต Configuration Change
  • ไม่ Leak Context
  • รองรับ Back Stack การนำทาง
  • ทดสอบได้ง่ายกว่า

สรุป

Singleton Alert Dialog เหมาะสำหรับ Dialog เรียบง่ายที่ใช้บ่อยและไม่ซับซ้อน สำหรับแอปพลิเคชันขนาดใหญ่ ควรใช้ DialogFragment หรือ Jetpack Compose Dialog แทน