Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में डायलॉग को बटन क्लिक पर बंद होने से कैसे रोकें?

एंड्रॉइड में AlertDialog को बटन क्लिक पर ऑटो-डिसमिस होने से रोकना

डिफ़ॉल्ट रूप से, AlertDialog के किसी भी बटन (पॉजिटिव, नेगेटिव, न्यूट्रल) पर क्लिक करने से डायलॉग **अपने आप बंद (dismiss)** हो जाता है। कई बार हमें वैलिडेशन के बाद ही बंद करना होता है (उदाहरण: खाली फील्ड चेक)। इसके लिए बटन का OnClickListener **डायलॉग show() होने के बाद** ओवरराइड करना पड़ता है।

चरण 1: नया प्रोजेक्ट बनाएं

Android Studio → File → New → New Project → "Empty Activity" → Finish।

चरण 2: Layout (activity_main.xml) — ट्रिगर बटन

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="24dp"
    android:gravity="center">

    <Button
        android:id="@+id/btnShowDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="डायलॉग दिखाएं"
        android:padding="12dp 24dp" />

</LinearLayout>

चरण 3: MainActivity.java — कस्टम बटन लिस्टनर के साथ डायलॉग

package com.example.dialogpreventdismiss;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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

        Button btnShowDialog = findViewById(R.id.btnShowDialog);
        btnShowDialog.setOnClickListener(v -> showCustomDialog());
    }

    private void showCustomDialog() {
        // डायलॉग बिल्डर
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("लॉगिन आवश्यक");
        builder.setMessage("कृपया अपना नाम दर्ज करें");

        // कस्टम व्यू: EditText
        EditText etName = new EditText(this);
        etName.setHint("आपका नाम");
        etName.setPadding(32, 16, 32, 16);
        builder.setView(etName);

        // बटन सेट करें (लिस्टनर null रखें — बाद में ओवरराइड करेंगे)
        builder.setPositiveButton("सबमिट", null); // null = डिफ़ॉल्ट डिसमिस व्यवहार अस्थायी रूप से
        builder.setNegativeButton("रद्द करें", (dialog, which) -> dialog.dismiss()); // यह तुरंत बंद होगा

        // डायलॉग बनाएं और दिखाएं
        AlertDialog dialog = builder.create();
        dialog.show();

        // 🔑 महत्वपूर्ण: show() के बाद बटन का OnClickListener ओवरराइड करें
        Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
        positiveButton.setOnClickListener(v -> {
            String name = etName.getText().toString().trim();

            if (name.isEmpty()) {
                // वैलिडेशन फेल — डायलॉग खुला रखें
                Toast.makeText(this, "नाम खाली नहीं हो सकता", Toast.LENGTH_SHORT).show();
                etName.setError("आवश्यक");
                return; // dismiss() न कॉल करें
            }

            // वैलिडेशन पास — मैन्युअली डिसमिस करें
            dialog.dismiss();
            Toast.makeText(this, "स्वागत है, " + name + "!", Toast.LENGTH_LONG).show();
        });
    }
}

चरण 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.dialogpreventdismiss">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.DialogPreventDismiss">

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

चलाएं और टेस्ट करें

  1. "डायलॉग दिखाएं" दबाएं — डायलॉग खुलेगा।
  2. खाली छोड़कर "सबमिट" दबाएं — टोस्ट दिखेगा, **डायलॉग खुला रहेगा**, EditText पर एरर दिखेगा।
  3. नाम टाइप करके "सबमिट" दबाएं — डायलॉग बंद होगा, स्वागत टोस्ट दिखेगा।
  4. "रद्द करें" दबाएं — तुरंत बंद होगा (डिफ़ॉल्ट व्यवहार)।

🔑 मुख्य तकनीक: show() के बाद getButton()

AlertDialog dialog = builder.create();
dialog.show(); // 👈 पहले show() करें

Button positiveBtn = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
positiveButton.setOnClickListener(v -> {
    // वैलिडेशन लॉजिक
    if (valid) {
        dialog.dismiss(); // मैन्युअली बंद करें
    }
    // else: कुछ न करें = डायलॉग खुला रहता है
});
⚠️ **builder.setPositiveButton(..., listener)** में लिस्टनर देने पर वह **show() से पहले** सेट होता है और डायलॉग ऑटो-डिसमिस कर देता है। null पास करें और show() के बाद ओवरराइड करें।

💡 वैकल्पिक: पूरी तरह कस्टम डायलॉग (कोई ऑटो-डिसमिस नहीं)

अगर पूर्ण नियंत्रण चाहिए, तो Dialog सबक्लास या BottomSheetDialogFragment उपयोग करें:

// CustomDialog.java
public class CustomDialog extends Dialog {

    public CustomDialog(@NonNull Context context) {
        super(context);
        setContentView(R.layout.dialog_custom); // अपना लेआउट
        setCancelable(true); // बैक बटन से बंद हो

        Button btnSubmit = findViewById(R.id.btnSubmit);
        EditText etInput = findViewById(R.id.etInput);

        btnSubmit.setOnClickListener(v -> {
            if (validate(etInput)) {
                dismiss(); // पूर्ण नियंत्रण
            }
        });
    }
}

// उपयोग
new CustomDialog(this).show();

🚀 आधुनिक विकल्प: MaterialAlertDialogBuilder (Material Components)

// build.gradle
implementation 'com.google.android.material:material:1.12.0'

// उपयोग
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle("शीर्षक")
       .setView(customView)
       .setPositiveButton("OK", null) // null = बाद में ओवरराइड
       .setNegativeButton("रद्दें", (d, w) -> d.dismiss());

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

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
    // वैलिडेशन
    if (ok) dialog.dismiss();
});

सारांश

  • 🔑 **ट्रिक**: builder.setPositiveButton("OK", null) → dialog.show() → dialog.getButton(BUTTON_POSITIVE).setOnClickListener(...)
  • ✅ वैलिडेशन फेल होने पर return करें — dismiss() न कॉल करें।
  • ✅ वैलिडेशन पास होने पर dialog.dismiss() मैन्युअली कॉल करें।
  • 🚀 नए ऐप्स के लिए MaterialAlertDialogBuilder या BottomSheetDialogFragment उपयोग करें — बेहतर UI, अधिक लचीलापन।
  1. Android में URL से इमेज कैसे डाउनलोड करें Android में URL से इमेज कैसे डाउनलोड करें

    परिचयनेटवर्क ऑपरेशन मुख्य थ्रेड पर नहीं किए जा सकते। यह लेख `AsyncTask` का उपयोग करके पृष्ठभूमि में इमेज डाउनलोड करने और `ImageView` में दिखाने का तरीका दिखाता है (नोट: `AsyncTask` API 30 में पदावनत है; आधुनिक ऐप्स में Coroutines, RxJava, या Retrofit का उपयोग करें)।कार्यान्वयनचरण 1: लेआउट (activity_

  1. Android डिवाइस को स्लीप मोड में जाने से कैसे रोकें Android डिवाइस को स्लीप मोड में जाने से कैसे रोकें

    परिचयकुछ ऐप्स (जैसे नेविगेशन, वीडियो प्लेयर) के लिए स्क्रीन को चालू रखना आवश्यक होता है। `FLAG_KEEP_SCREEN_ON` विंडो फ्लैग का उपयोग करके इसे प्रोग्रामेटिक रूप से सक्षम किया जा सकता है।कार्यान्वयनचरण 1: लेआउट (activity_main.xml)<TextView android:id=@+id/textView android:text=Stay Awake Android! an

  1. एंड्रॉइड में एक्टिविटी से फ्रैगमेंट में वेरिएबल कैसे पास करें? एंड्रॉइड में एक्टिविटी से फ्रैगमेंट में वेरिएबल कैसे पास करें?

    Bundle और setArguments के साथ फ्रैगमेंट को डेटा पास करें यह उदाहरण दर्शाता है कि Bundle का उपयोग करके एक्टिविटी से फ्रैगमेंट में स्ट्रिंग डेटा कैसे पास करें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: लेआउट में कंटेनर और इनपुट res/layout/activity_main.xml: <?