android - स्नैकबार के लेआउट को कैसे अनुकूलित करें?




android-layout android-custom-view (6)

XML तरीका:

मूल लेआउट xml फ़ाइल जो Snackbar लिए उपयोग की जाती है, वह यह फ़ाइल है:

design_layout_snackbar_include.xml :

<?xml version="1.0" encoding="utf-8"?>        
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
            android:id="@+id/snackbar_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
              ...
            android:ellipsize="end"/>

    <Button
            android:id="@+id/snackbar_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
              ...
            android:textColor="?attr/colorAccent"
            style="?attr/borderlessButtonStyle"/>

</merge>

तो इस लेआउट को ओवरराइड करने के लिए आपको उसी android:id साथ अपना खुद का लेआउट लिखना चाहिए android:id s जैसा कि इस एक में और आपके refs.xml फ़ाइल में आपको यह लाइन जोड़ना चाहिए:

<resources xmlns:tools="http://schemas.android.com/tools">
   ....   
    <item name="design_layout_snackbar_include" tools:override="true" type="layout">
        @layout/my_layout_snackbar
    </item>
   ....
</resources>

क्या स्नैकबार के लेआउट को कस्टम दृश्य में बदलने की कोई विधि है?

अब यह काला आता है और हम पृष्ठभूमि का रंग बदल सकते हैं। लेकिन मुझे नए लेआउट को बढ़ाने और स्नैकबार्स पृष्ठभूमि के रूप में बनाने का सही तरीका नहीं पता है?

धन्यवाद...


आप इस लाइब्रेरी को आज़मा सकते हैं। यह एंड्रॉइड डिफ़ॉल्ट स्नैकबार के लिए एक आवरण है। https://github.com/ChathuraHettiarachchi/CSnackBar

Snackbar.with(this,null)
    .type(Type.SUCCESS)
    .message("Profile updated successfully!")
    .duration(Duration.SHORT)
    .show();

या आप अपने स्वयं के दृश्य का उपयोग भी कर सकते हैं,

View view = getLayoutInflater().inflate(R.layout.custom_view, null);

Snackbar.with(this,null)
        .type(Type.UPDATE)
        .contentView(view, 76)
        .duration(Duration.SHORT)
        .show();

वर्तमान में केवल कस्टम लेआउट के साथ समस्या है, हमें इनपुट के रूप में dp में व्यू हाइट पास करनी होगी


निम्नलिखित कोड का प्रयास करें।

Snackbar snackbar = Snackbar.make(container, "No Internet Connection", Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary));
snackbar.show();

ध्यान दें:

कंटेनर - लेआउट का मूल दृश्य।


मैने इसे आजमाया और इसने कार्य किया!

View custom = LayoutInflater.from(this).inflate(R.layout.custom_view, null);
snackbar.getView().setPadding(0,0,0,0);
((ViewGroup) snackbar.getView()).removeAllViews();
((ViewGroup) snackbar.getView()).addView(custom);
TextView textView = custom.findViewById(R.id.text);
View button = custom.findViewById(R.id.button);
textView.setText("Your text here");
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       // do something
    }
});

याकिव मोस्पैन के जवाब में जोड़ने के लिए, अपने कस्टम BaseTransientBottomBar शो को BaseTransientBottomBar तरह नीचे से बनाने के लिए, इस विधि को Snackbar वर्ग से कॉपी करें ताकि BaseTransientBottomBar कंस्ट्रक्टर के लिए उपयुक्त माता-पिता की BaseTransientBottomBar की जा BaseTransientBottomBar

private static ViewGroup findSuitableParent(View view) {
    ViewGroup fallback = null;
    do {
        if (view instanceof CoordinatorLayout) {
            // We've found a CoordinatorLayout, use it
            return (ViewGroup) view;
        } else if (view instanceof FrameLayout) {
            if (view.getId() == android.R.id.content) {
                // If we've hit the decor content view, then we didn't find a CoL in the
                // hierarchy, so use it.
                return (ViewGroup) view;
            } else {
                // It's not the content view but we'll use it as our fallback
                fallback = (ViewGroup) view;
            }
        }

        if (view != null) {
            // Else, we will loop and crawl up the view hierarchy and try to find a parent
            final ViewParent parent = view.getParent();
            view = parent instanceof View ? (View) parent : null;
        }
    } while (view != null);

    // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
    return fallback;
}

स्नैकबार आपको एक कस्टम लेआउट सेट करने की अनुमति नहीं देता है। हालाँकि, जैसा कि Primoz990 ने सुझाव दिया है कि आप स्नैकबार का दृश्य देख सकते हैं। GetView फ़ंक्शन Snackbar.SnackbarLayout को लौटाता है, जो एक क्षैतिज LinearLayout ऑब्जेक्ट है, जिसके बच्चे एक TextView और एक बटन हैं। स्नैकबार में अपना स्वयं का दृश्य जोड़ने के लिए, आपको बस TextView को छिपाने की आवश्यकता है, और स्नैकबार में अपना दृश्य जोड़ें। SackackbarLayout।

// Create the Snackbar
Snackbar snackbar = Snackbar.make(containerLayout, "", Snackbar.LENGTH_LONG);
// Get the Snackbar's layout view
Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
// Hide the text
TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
textView.setVisibility(View.INVISIBLE);

// Inflate our custom view
View snackView = mInflater.inflate(R.layout.my_snackbar, null);
// Configure the view
ImageView imageView = (ImageView) snackView.findViewById(R.id.image);
imageView.setImageBitmap(image);
TextView textViewTop = (TextView) snackView.findViewById(R.id.text);
textViewTop.setText(text);
textViewTop.setTextColor(Color.WHITE);

//If the view is not covering the whole snackbar layout, add this line
layout.setPadding(0,0,0,0);

// Add the view to the Snackbar's layout
layout.addView(snackView, 0);
// Show the Snackbar
snackbar.show();





snackbar