Snackbar क्या है?
Snackbar Material Design का एक घटक है जो स्क्रीन के नीचे एक संक्षिप्त संदेश दिखाता है, वैकल्पिक रूप से एक एक्शन बटन के साथ। यह Toast से भिन्न है क्योंकि:
- एक्शन बटन सपोर्ट करता है
- स्वाइप करके डिसमिस किया जा सकता है
- एनिमेशन के साथ स्लाइड इन/आउट होता है
- CoordinatorLayout के साथ इंटरैक्ट करता है (FAB मूव, आदि)
निर्भरता
// build.gradle (Module: app)
dependencies {
implementation 'com.google.android.material:material:1.11.0'
// इसमें com.google.android.material.snackbar.Snackbar शामिल है
}
बुनियादी उपयोग
XML लेआउट (CoordinatorLayout आवश्यक)
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- मुख्य कंटेंट -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Button
android:id="@+id/btnShowSnackbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Snackbar दिखाएं"
android:layout_gravity="center" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- FAB (ऑप्शनल - Snackbar के साथ एनिमेट होता है) -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_add" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
MainActivity.java
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.snackbar.Snackbar;
public class MainActivity extends AppCompatActivity {
private CoordinatorLayout coordinatorLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = findViewById(R.id.coordinatorLayout);
Button btnShow = findViewById(R.id.btnShowSnackbar);
btnShow.setOnClickListener(v -> showSnackbarWithAction());
}
private void showSnackbarWithAction() {
Snackbar snackbar = Snackbar.make(coordinatorLayout,
"इंटरनेट कनेक्शन नहीं है", Snackbar.LENGTH_INDEFINITE)
.setAction("पुनः प्रयास", view -> {
// पुनः प्रयास लॉजिक
Toast.makeText(this, "पुनः प्रयास क्लिक किया गया", Toast.LENGTH_SHORT).show();
})
.setActionTextColor(Color.YELLOW) // एक्शन टेक्स्ट रंग
.setBackgroundTint(Color.parseColor("#333333")) // बैकग्राउंड रंग
.setTextColor(Color.WHITE); // मैसेज टेक्स्ट रंग
// कस्टम व्यू एक्सेस (वैकल्पिक)
View snackbarView = snackbar.getView();
TextView textView = snackbarView.findViewById(com.google.android.material.R.id.snackbar_text);
if (textView != null) {
textView.setMaxLines(3);
textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
}
snackbar.show();
}
}
Snackbar अवधि (Duration)
| कॉन्स्टेंट | अवधि | उपयोग केस |
| LENGTH_SHORT | ~1500ms | सरल सूचनाएं |
| LENGTH_LONG | ~2750ms | अधिक टेक्स्ट |
| LENGTH_INDEFINITE | मैन्युअल डिसमिस तक | क्रिटिकल एक्शन, नेटवर्क एरर |
उन्नत फीचर्स
कॉलबैक्स
snackbar.addCallback(new Snackbar.Callback() {
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
// पूरी तरह दिखाया गया
}
@Override
public void onDismissed(Snackbar sb, int event) {
super.onDismissed(sb, event);
// event: DISMISS_EVENT_SWIPE, DISMISS_EVENT_ACTION,
// DISMISS_EVENT_TIMEOUT, DISMISS_EVENT_MANUAL, DISMISS_EVENT_CONSECUTIVE
}
});
कस्टम लेआउट (BaseTransientBottomBar)
// कस्टम Snackbar क्लास बनाने के लिए BaseTransientBottomBar एक्सटेंड करें
public class CustomSnackbar extends BaseTransientBottomBar {
// ... इंप्लीमेंटेशन
}
// या सरल: Snackbar में कस्टम व्यू जोड़ें (सीमित)
Snackbar snackbar = Snackbar.make(view, "", Snackbar.LENGTH_LONG);
View customView = getLayoutInflater().inflate(R.layout.custom_snackbar, null);
Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
layout.removeAllViews(); // डिफ़ॉल्ट व्यू हटाएं
layout.addView(customView, 0);
snackbar.show();
एक साथ एकाधिक Snackbar (क्यू)
// Snackbar स्वचालित रूप से क्यू करता है
showSnackbar("पहला संदेश");
showSnackbar("दूसरा संदेश"); // पहले के बाद दिखेगा
// तुरंत दिखाने के लिए (क्यू बायपास)
snackbar.setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_SLIDE);
सामान्य समस्याएं और समाधान
| समस्या | समाधान |
| Snackbar नहीं दिखता | पेरेंट CoordinatorLayout होना चाहिए, या Snackbar.make(view, ...) में ऐसा व्यू पास करें जो CoordinatorLayout का वंशज हो |
| FAB के पीछे छुप जाता है | CoordinatorLayout + FAB + Snackbar स्वचालित हैंडल करता है |
| लैंडस्केप में कट जाता है | setMaxInlineActionWidth() या कस्टम लेआउट उपयोग करें |
| डार्क मोड में रंग गलत | setBackgroundTint() और setTextColor() स्पष्ट रूप से सेट करें |
| एक्शन बटन काम नहीं करता | सुनिश्चित करें setAction() में नॉन-नल लिस्टनर है |
Snackbar vs Toast vs Dialog
| विशेषता | Toast | Snackbar | Dialog |
| इंटरैक्शन | नहीं | हाँ (एक्शन) | हाँ (फुल UI) |
| पोजिशन | कहीं भी | नीचे (फिक्स्ड) | केंद्र/कस्टम |
| डिसमिस | ऑटो | ऑटो/स्वाइप/एक्शन | मैन्युअल/बटन |
| मोडल | नहीं | नहीं | हाँ |
| उपयोग केस | निष्क्रिय सूचना | एक्शन योग्य फीडबैक | निर्णय/इनपुट |
Jetpack Compose में Snackbar
// Compose (Material 3)
val snackbarHostState = rememberSnackbarHostState()
SnackbarHost(snackbarHostState)
// दिखाने के लिए
LaunchedEffect(key) {
snackbarHostState.showSnackbar(
message = "संदेश सहेजा गया",
actionLabel = "पूर्ववत करें",
duration = SnackbarDuration.Indefinite
) { /* एक्शन क्लिक */ }
}
सर्वोत्तम अभ्यास
- हमेशा
CoordinatorLayout रूट के रूप में उपयोग करें
- संदेश संक्षिप्त रखें (1-2 लाइनें)
- एक्शन लेबल स्पष्ट रखें: "पूर्ववत करें", "पुनः प्रयास", "सेटिंग्स"
LENGTH_INDEFINITE केवल क्रिटिकल एक्शन के लिए उपयोग करें
- एक्सेसिबिलिटी: कंटेंट डिस्क्रिप्शन जोड़ें, टॉकबैक टेस्ट करें
- थीमिंग:
Widget.MaterialComponents.Snackbar स्टाइल कस्टमाइज़ करें