एंड्रॉइड में 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>
चलाएं और टेस्ट करें
- "डायलॉग दिखाएं" दबाएं — डायलॉग खुलेगा।
- खाली छोड़कर "सबमिट" दबाएं — टोस्ट दिखेगा, **डायलॉग खुला रहेगा**, EditText पर एरर दिखेगा।
- नाम टाइप करके "सबमिट" दबाएं — डायलॉग बंद होगा, स्वागत टोस्ट दिखेगा।
- "रद्द करें" दबाएं — तुरंत बंद होगा (डिफ़ॉल्ट व्यवहार)।
🔑 मुख्य तकनीक: 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, अधिक लचीलापन।