অ্যান্ড্রয়েড মাল্টলাইন স্নাকবার


87

Snackbarমাল্টিলাইন স্নাকবারটি প্রদর্শন করতে আমি অ্যান্ড্রয়েড ডিজাইন সমর্থন লাইব্রেরি থেকে নতুন উপার্জনের চেষ্টা করছি , যেমনটি http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars-toasts-specs এ দেখানো হয়েছে :

import android.support.design.widget.Snackbar;

final String snack = "First line\nSecond line\nThird line";
Snackbar.make(mView, snack, Snackbar.LENGTH_LONG).show();

এটি কেবলমাত্র First line...আমার নেক্সাসে প্রদর্শিত হয় it এটি কীভাবে সমস্ত লাইনে প্রদর্শিত হয়?

PS: আমি চেষ্টা করেছি Toastএবং এটি সমস্ত লাইন প্রদর্শন করেছে।


আফাইক, স্নাকবারগুলি দ্রুত ব্যবহারকারী সতর্কতা / প্রতিক্রিয়ার জন্য বোঝানো হয় এবং এটি সমর্থন করার জন্য ডিজাইন করা হয়েছে যেমন "সিঙ্গল লাইন"। যদি আপনি কোনও সতর্কতা / প্রতিক্রিয়া দেখাতে চান যাতে মাল্টিলিন থাকে তবে আমি একটি ডায়ালগ দেখানোর পরামর্শ দিচ্ছি কারণ ব্যবহারকারী আপনার বার্তাটি পড়ার পরে ব্যবস্থা নিতে পারে।
মুডিট

4
@ মুডিট আন্তর্জাতিকীকরণ সম্পর্কে ভাবেন। এমনকি যদি ইংলিশ স্ট্রিংটি একক লাইনে মাপসই করতে পারে তবে জার্মান নাও পারে। এছাড়াও গুগল মাল্টলাইন স্নাকবারের জন্য মেটেরিয়াল ডিজাইনের প্রস্তাব সরবরাহ করেছে (আমি এটিকে প্রশ্নের সাথে যুক্ত করেছি) - কেন এড়ানো উচিত?
দিমা করনিলভ

উত্তর:


228

maxLinesস্নাকবার বার্তা দর্শনের বৈশিষ্ট্যটি কেবল সেট করুন

View snackbarView = snackbar.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setMaxLines(5);  // show multiple line

যদি আপনি আরও সাম্প্রতিক "com.google.android.material:material:1.0.0"নির্ভরতা ব্যবহার করেন তবে আপনি এটি ব্যবহার করবেন: com.google.android.material.R.id.snackbar_textস্নাকবারের টেক্সটভিউতে অ্যাক্সেস করতে।

আপনি এমনকি ব্যবহার করতে পারেন R.id.snackbar_text। এটা আমার জন্য কাজ


প্রয়োজনীয় লাইনের প্রকৃত সংখ্যা গণনা করার কোনও উপায় আছে, বা আমাদের কী অনুমান করতে হবে?
ক্রিস

@ ক্রিস অ্যান্ড্রয়েড থাকতে পারে তবে আপনি যদি পাঠ্য ছোট দৈর্ঘ্যের হয় তবে এটি স্বয়ংক্রিয়ভাবে সঙ্কুচিত হয়ে যাবে ম্যাক্সলাইন নির্দিষ্ট করতে পারবেন ...
নীলেশ সেন্টা

22
সর্বশেষতম অ্যান্ড্রয়েডক্সের জন্য কমপ্লেক্স.অ্যান্ড্রয়েড.ম্যাটরিয়াল.আর.আইডি.স্ন্যাকবার_টেক্সট হওয়া উচিত। তবে আইএমএইচও ভবিষ্যতে আইডি পরিবর্তন হতে পারে তাই এই অনুশীলনটি এড়ানো উচিত।
mtsahakis

4
যেহেতু এটি টেক্সটভিউ আইডির উপর নির্ভর করে যা সমর্থন লাইবের প্রতিটি সংস্করণ দিয়ে পরিবর্তন করতে পারে, এই উত্তরটি আসলেই স্থায়ী সমাধান নয়, তবে একটি হ্যাক। এটি কাজ করতে পারে তবে এটি এলোমেলোভাবে উত্পাদনেও ভেঙে যেতে পারে।
চ্যাপজ

4
এর জন্য কি কোনও প্রস্তাবিত এপিআই রয়েছে? আমি সম্মত হই যে এই পদ্ধতিটি হ্যাক, তবে যদি এর জন্য কোনও এপিআই উন্মুক্ত না হয়, তবে বিকল্প নেই।
fobemaster

32

অ্যাপ্লিকেশনটির মান .xML এ এর ​​জন্য ব্যবহৃত পূর্বনির্ধারিত মানটিকে ওভাররাইড করতে পারে

<integer name="design_snackbar_text_max_lines">5</integer>

এই মানটি স্নাকবার দ্বারা ডিফল্টরূপে ব্যবহৃত হয়।


18
এই অনুশীলনটি এড়ানো উচিত, যেহেতু এটি একটি ব্যক্তিগত পূর্ণসংখ্যা ডিজাইন লাইব্রেরি দ্বারা সংজ্ঞায়িত করা হয়েছে, যা আপনার অ্যাপ্লিকেশনটিতে কোনও সংকলন বা রানটাইম ত্রুটি তৈরি না করেই নাম পরিবর্তন বা মুছে ফেলা হতে পারে।
ওসিস ফেং

4
হ্যাঁ, তবে আমি মনে করি এটি পরিষ্কার করা উচিত যে এটি ওএসের ব্যক্তিগত সংস্থান অ্যাক্সেস থেকে খুব আলাদা। এটি যতক্ষণ কাজ করবেন আপনি ডিজাইন লাইব্রেরির একই সংস্করণে স্থির থাকবেন ততক্ষণ কাজ করবে। আপনি যদি নতুন সংস্করণে আপডেট হন তবে আপনাকে নিজের অ্যাপ্লিকেশনটি পুরোপুরি পরীক্ষা করতে হবে, কেবল এটি আপনার চেকলিস্টে রাখুন।
ডিভকনসোল

কেবল আপনাকে জানাতেই যে এটি আগুনের ডিভাইসগুলিতে কাজ করে না যা কেবল 1 লাইন দেখায় বলে মনে হচ্ছে। @ নীলেশ উত্তরটি কাজ করেছে।
নবীন দিশানায়াকে

4
চেকলিস্টটি দীর্ঘতর হওয়ার ধারণাটি আমার পছন্দ না হওয়ায় হ্রাস পেয়েছে।
-এ জিও-ইঞ্জিনিয়ারিং নিষিদ্ধ করুন

13
Snackbar snackbar =  Snackbar.make(view, "Text",Snackbar.LENGTH_LONG).setDuration(Snackbar.LENGTH_LONG);
View snackbarView = snackbar.getView();
TextView tv= (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
tv.setMaxLines(3); 
snackbar.show();

11

এখানে আমার সন্ধান এই:

অ্যান্ড্রয়েড মাল্টলাইন স্নাকবারগুলি সমর্থন করে তবে এর সর্বোচ্চ সীমা 2 লাইন রয়েছে যা ডিজাইনের গাইডলাইনটির সাথে মেলে যেখানে বলা হয়েছে যে মাল্টলাইন স্ন্যাক বারের উচ্চতা 80 ডিপি হওয়া উচিত (প্রায় 2 লাইন)

এটি যাচাই করতে, আমি চিজস্কয়ার অ্যান্ড্রয়েড নমুনা প্রকল্পটি ব্যবহার করেছি। যদি আমি নিম্নলিখিত স্ট্রিং ব্যবহার করি:

Snackbar.make(view, "Random Text \n When a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

এই ক্ষেত্রে আমি ২ য় লাইনের পাঠ্য সহ মাল্টলাইন স্ন্যাক বারটি দেখতে পাচ্ছি, যেমন "যখন দ্বিতীয় স্নাকবারটি ট্রিগার করা হয়" তবে আমি যদি এই কোডটি নিম্নলিখিত প্রয়োগের ক্ষেত্রে পরিবর্তন করি:

Snackbar.make(view, "Random Text \n When \n a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

আমি কেবল "এলোমেলো পাঠ্য \ n যখন ... " দেখতে পাই । এর অর্থ হ'ল ডিজাইন গ্রন্থাগারটি ইচ্ছাকৃতভাবে পাঠ্যদর্শনটি সর্বাধিক 2 লাইনের হতে বাধ্য করছে।


4
আমি এই উত্তরটি গ্রহণ করেছি তবে উপাদান চশমাগুলি 112 ডিপি সহ স্নাকবারের উল্লেখ করেছে: i.imgur.com/1ACCoQb.png
ডিমা

আপনি মাত্রায় মাল্টিলাইন স্ন্যাক বারের উচ্চতার নামকরণ করতে পারেন?
alp


4
আপনি যদি সেই গাইডলাইনটি গ্রহণ করতে না চান তবে কোনও গাইডলাইন অনুসরণ করবেন না। গুগল যদি তার গাইডলাইন এবং সরঞ্জামে এতটা সঠিক হয় তবে গ্রেড বিল্ড সিস্টেম বিকাশকারীর জন্য মাথা ব্যথা কেন?
জিগার

@ দিমাকর্নিলভ 112 ডিপি সেট করা হবে যদি কেবলমাত্র আপনার কাছে সম্পূর্ণ 2 লাইনের দীর্ঘ টেক্সট থাকে এবং আপনি কোনও ক্রিয়া সরবরাহ করেন। সেক্ষেত্রে এই ক্রিয়াটি স্নাকবারকে 112 ডিপি-তে প্রসারিত করবে।
ক্রিস্টোফার রুকিনস্কি

5

উপাদান নকশা জন্য, রেফারেন্স হয় com.google.android.material.R.id.snackbar_text

val snack = Snackbar.make(myView, R.string.myLongText, Snackbar.LENGTH_INDEFINITE).apply {
                view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text).maxLines = 10
            }
            snack.show()

3

স্নাকবারের অন্তর্ভুক্ত টেক্সটভিউয়ের জন্য রিসোর্স আইডি হার্ডকোডিং সম্পর্কিত পরামর্শগুলির একটি বিকল্প হ'ল টেক্সটভিউ সন্ধানের জন্য পুনরাবৃত্তি করা। এটি নিরাপদ দীর্ঘমেয়াদী এবং আইডি পরিবর্তনের নূন্যতম ভয়ে সমর্থন লাইব্রেরি আপডেট করতে দেয়।

উদাহরণ:

 public static Snackbar getSnackbar(View rootView, String message, int duration) {
    Snackbar snackbar = Snackbar.make(rootView, message, duration);
    ViewGroup snackbarLayout = (ViewGroup) snackbar.getView();

    TextView text = null;

    for (int i = 0; i < snackbarLayout.getChildCount(); i++) {
        View child = snackbarLayout.getChildAt(i);

        // Since action is a button, and Button extends TextView,
        // Need to make sure this is the message TextView, not the 
        // action Button view.
        if(child instanceof TextView && !(child instanceof Button)) {
            text = (TextView) child;
        }
    }

    if (text != null) {
        text.setMaxLines(3);
    }
    return snackbar;
}

পাঠ্য কোনওরকম সর্বদা নাল
স্ট্যানুমগুলি

আপনার কোডটি ডাবল চেক করুন। স্নাকবারের বিন্যাসের জন্য এখানে এওএসপি উত্স কোডটি আপনি লক্ষ্য করবেন যে সেখানে একটি টেক্সটভিউ অবজেক্ট রয়েছে, সুতরাং পাঠ্যটি বাতিল হওয়া সম্ভব নয়।
চ্যান্টেল ওসেজো

findViewsWithTextআপনি আরও ইতিমধ্যে পাঠ্যটি জানেন যেহেতু ব্যবহার করা আরও ভাল হতে পারে । এই সমাধানটি কয়েকটি পরিস্থিতিতে ভেঙে যেতে পারে (উদাঃ যদি আমাদের পাঠ্য দর্শন স্নাকবার বিন্যাসের কোনও সন্তানের সন্তান হয়ে ওঠে)।
নটারিও

এটি আমার পক্ষে কাজ করবে না। SnackbarLayout এর ভিতরে অন্য ভিউ রয়েছে। সুতরাং snackbarLayout.getChildAt()কখনই ফিরে আসবে না TextView
ভিজিটর হুগো শোয়াব

2

সেটম্যাক্সলাইন ব্যবহার করার পরিবর্তে আমি পাঠ্যদর্শনটি এর সামগ্রীতে মোড়ানো করতে সেটসিংলাইন ব্যবহার করি।

String yourText = "First line\nSecond line\nThird line";
Snackbar snackbar = Snackbar.make(mView, yourText, Snackbar.LENGTH_SHORT);
    TextView textView =
        (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
    textView.setSingleLine(false);
snackbar.show();

2

এটা আমার জন্য কাজ করে

Snackbar snackbar =  Snackbar.make(mView, "Your text string", Snackbar.LENGTH_INDEFINITE);
((TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text)).setSingleLine(false);
snackbar.show();

2

দেরীতে, তবে কারও পক্ষে সহায়ক হতে পারে:

public void showSnackBar(String txt, View view){
    final Snackbar snackbar = Snackbar.make(view,txt,Snackbar.LENGTH_INDEFINITE)
        .setAction("OK", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //do something
            }
        });
    View view = snackbar.getView();
    TextView textView = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
    textView.setMaxLines(5);
    snackbar.show();
}

ওয়াট? আপনি কেবলমাত্র চূড়ান্ত পরিবর্তনশীলকে নাল বরাদ্দ করেছেন এবং শ্রোতাদের মধ্যে এটি বলেছেন? আপনি 100% এনপিই চান?
osipxd

@ ওসিপএক্সডিডি তার জন্য স্থির করে রেখেছেন :)
অ্যান্ড্রয়েড বিকাশকারী

2

মেটেরিয়াল কম্পোনেন্টস লাইব্রেরির মাধ্যমে আপনি snackbarTextViewStyleঅ্যাপ থিমের বৈশিষ্ট্যটি ব্যবহার করে এটি নির্ধারণ করতে পারেন :

<style name="AppTheme" parent="Theme.MaterialComponents.*">
  ...
  <item name="snackbarTextViewStyle">@style/snackbar_text</item>
</style>

<style name="snackbar_text" parent="@style/Widget.MaterialComponents.Snackbar.TextView">
    ...
    <item name="android:maxLines">5</item>
</style>

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য : এটির জন্য গ্রন্থাগারের 1.2.0 সংস্করণ প্রয়োজন ।


4
ভাল কথা, তবে গ্রন্থাগারটি এখনও আলফা অবস্থায় রয়েছে (মে 2020) :)
অ্যান্টন মালিশেভ

2

কোটলিনে আপনি এক্সটেনশনগুলি ব্যবহার করতে পারেন।

// SnackbarExtensions.kt

fun Snackbar.allowInfiniteLines(): Snackbar {
    return apply { (view.findViewById<View?>(R.id.snackbar_text) as? TextView?)?.isSingleLine = false }
}

ব্যবহার:

Snackbar.make(view, message, Snackbar.LENGTH_LONG)
                        .allowInfiniteLines()
                        .show()

2

কোটলিনে, আপনি ঠিক করতে পারেন

Snackbar.make(root_view, "Yo\nYo\nYo!", Snackbar.LENGTH_SHORT).apply {
    view.snackbar_text.setSingleLine(false)
    show()
}

আপনি setSingleLine(false)সঙ্গে প্রতিস্থাপন করতে পারে maxLines = 3

অ্যান্ড্রয়েড স্টুডিও আপনাকে যুক্ত করার অনুরোধ জানানো উচিত

import kotlinx.android.synthetic.main.design_layout_snackbar_include.view.*

সম্পাদনা

আমি এটি আবার কাজ করতে সক্ষম হইনি, সুতরাং আমি কেবল কিছু ভাগ করে নেব কোটলিনে লেখার সবচেয়ে পরিষ্কার উপায় যা অন্য কয়েকজন ইতিমধ্যে ভাগ করেছেন:

import com.google.android.material.R as MaterialR

Snackbar.make(root_view, "Yo\nYo\nYo!", Snackbar.LENGTH_SHORT).apply {
    val textView = view.findViewById<TextView>(MaterialR.id.snackbar_text)
    textView.setSingleLine(false)
    show()
}


এটি ব্যবহার / আমদানির প্রস্তাব দেয় না snackbar_text
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আমি আবার এটি কাজ করতে পারি না, তাই আমি উত্তর আপডেট করেছি।
গম্বি দ্য গ্রিন

ক্র্যাশগুলি এখন: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setSingleLine(boolean)' on a null object reference
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আপনার কি এই নির্ভরতা রয়েছে: implementation 'com.google.android.material:material:1.1.0'এবং আপনার স্নাকবার কি এটি com.google.android.material.snackbar.Snackbar? যদি তা না android.support.design.R.id.snackbar_textহয় তবে রিসোর্স আইডি হিসাবে চেষ্টা করুন ।
গম্বি দ্য গ্রিন

আপনি একটি নতুন প্রকল্প তৈরি করার সময় আপনি যা পান তা হ'ল (এবং আমি করলাম) এবং এটি ক্র্যাশ হয়ে গেছে।
অ্যান্ড্রয়েড বিকাশকারী

1

লাইব্রেরির নতুন সংস্করণে জিনিসগুলি পরিবর্তিত হলে এটি ক্রাশ না হওয়ার একটি উপায়:

Snackbar.make(...).setAction(...) {
    ...
}.apply {
    (view.findViewById<View?>(R.id.snackbar_text) as? TextView?)?.setSingleLine(false)
}.show()

আইডি ব্যবহার না করে এটি করার একটি উপায়, স্নাকবারে সমস্ত টেক্সটভিউগুলিকে সীমাহীন মাল্টি-লাইনের জন্য সেট করে:

@UiThread
fun setAllTextViewsToHaveInfiniteLinesCount(view: View) {
    when (view) {
        is TextView -> view.setSingleLine(false)
        is ViewGroup -> for (child in view.children)
            setAllTextViewsToHaveInfiniteLinesCount(child)
    }
}

Snackbar.make(...).setAction(...) {
    ...
}.apply {
    setAllTextViewsToHaveInfiniteLinesCount(view)
}.show()

জাভা একই ফাংশন:

@UiThread
public static void setAllTextViewsToHaveInfiniteLines(@Nullable final View view) {
    if (view == null)
        return;
    if (view instanceof TextView)
        ((TextView) view).setSingleLine(false);
    else if (view instanceof ViewGroup)
        for (Iterator<View> iterator = ViewGroupKt.getChildren((ViewGroup) view).iterator(); iterator.hasNext(); )
            setAllTextViewsToHaveInfiniteLines(iterator.next());
}

0

কেবলমাত্র একটি তাত্পর্যপূর্ণ মন্তব্য, আপনি যদি com.google.android.material:materialউপসর্গ বা প্যাকেজটি ব্যবহার করেন তবে তা R.idহওয়া উচিতcom.google.android.material

val snackbarView = snackbar.view
val textView = snackbarView.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
textView.maxLines = 3

0

সুতরাং যেহেতু আমি গুগল থেকে সর্বশেষ com.google.android.material:material:1.1.0 মেটাল ডিজাইন লাইব্রেরি ব্যবহার করছি এবং স্নেকবারে আরও লাইনগুলিকে অনুমতি দেওয়ার জন্য আমি নীচে সাধারণ নীচের কোড স্নিপেট ব্যবহার করেছি আশা করি এটি নতুন বিকাশকারীদেরও সহায়তা করবে।

TextView messageView = snackbar.getView().findViewById(R.id.snackbar_text);
messageView.setMaxLines(5);

0

অন্যান্য উত্তরগুলির স্বচ্ছতা এড়াতে updateMaxLine, গুগল কোনও পাঠ্য দর্শনের আইডি পরিবর্তন করার সিদ্ধান্ত নিলে এই সমাধানটি কমতে পারে)

val snackBar = Snackbar.make(view, message, duration)
 snackBar.view.allViews.updateMaxLine(5)
 snackBar.show()

কেবলমাত্র নোট করুন, এই বিকল্পটি স্নাকবার ভিউতে সমস্ত পাঠ্য দর্শনগুলির জন্য সর্বাধিক লাইন আপডেট করবে (কোন টিবিএইচ আমি এটি বিবেচনা করি না)

এটি এক্সটেনশন হিসাবে যুক্ত করুন

private fun <T> Sequence<T>.updateMaxLine(maxLine : Int) {
    for (view in this) {
        if (view is TextView) {
            view.maxLines = maxLine
        }
    }
}

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.