একটি স্নাকবারের নিজস্ব ক্রিয়া বোতামটি ব্যবহার করে কীভাবে বরখাস্ত করবেন?


94

অ্যান্ড্রয়েড ডিজাইন সমর্থন লাইব্রেরিতে এখন স্নাকবারের জন্য সমর্থন অন্তর্ভুক্ত।

আমি একটি তৈরি করতে নিম্নলিখিত কোড ব্যবহার করেছি:

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG)
        .setAction("Dismiss", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();

স্নাকবারটি সোয়াইপ করে খারিজ করা যায়। তবে, আমি এটির নিজস্ব অ্যাকশন বোতামটি ব্যবহার করে (সেটঅ্যাকশন ফাংশনটি ব্যবহার করে তৈরি করা হয়েছে) খারিজ করতে চাই।

তবে এমন কোনও ফাংশন উপলব্ধ রয়েছে যা এটি করতে পারে।


4
এখানে আগত লোকদের কাছে একটি নোট হিসাবে, এতে "খারিজ" পদক্ষেপ নেওয়া গুগল মেটালিয়াল ডিজাইনের গাইডলাইনগুলিরSnackbar বিরুদ্ধে ।
লয়ালার

উত্তর:


147

জাভার জন্য,

.makeপদ্ধতি ফেরৎ Snackbarঅবজেক্ট। এটি তৈরি করে সেই অবজেক্টের একটি উদাহরণ সংরক্ষণ করুন final। তারপরে, onClick()কলটিতে .dismiss:

final Snackbar snackBar = Snackbar.make(findViewById(android.R.id.content), "Snackbar Message", Snackbar.LENGTH_LONG);

        snackBar.setAction("Action Message", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Call your action method here
                snackBar.dismiss();
            }
        });
        snackBar.show();

কোটলিনের জন্য,

        Snackbar.make(
            findViewById(android.R.id.content),
            "Snackbar Message",
            Snackbar.LENGTH_INDEFINITE
        ).setAction("Action Message") {
            // Call action functions here
        }.show()

4
যদি আমি এটি একটি ফ্লোটিংএকশনবাটন সহ একটি সমন্বয়কারী বিন্যাসে করি তবে ফ্লোটিংএ্যাকশনবটনটি নেমে আসবে না।
বিনয় ডাব্লু

61
অ্যাকশনে ক্লিক করার সময় একটি স্নাকবার ডিফল্টরূপে বরখাস্ত হয়। সুস্পষ্টভাবে বরখাস্ত পদ্ধতিটি কল করা অপ্রয়োজনীয়।
বুয়েকিমা

9
@ মার্কবুকাইমা এই বৈশিষ্ট্যটি পরে যুক্ত করা হয়েছিল। প্রশ্নের সময় যে স্ন্যাকবারের বধির আচরণ ছিল না।
EE66

JFYI, অ্যাকশন যদি দেখানো হবে না OnClickListenerহয়null
crgarridos

আজকের হিসাবে, এই কোডটি বিভিন্ন ইভেন্টের মান দিয়ে দু'বার বরখাস্ত কল করবে, একটি ক্রিয়ায় ক্লিক করার জন্য এবং অন্যটি প্রগ্রেটিকভাবে dissmiss () কল করার জন্য।
জুয়ান

53

একটি ক্লিক ক্রিয়া প্রয়োগ করুন এবং এটি খালি দিন। খালি ক্লিক অ্যাকশনে ক্লিক করা স্নাকবারকে বরখাস্ত করবে।

Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
    .setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    })
    .show();

আপনি nullশ্রোতার জন্য পাস করতে পারেন , প্রকৃত উদাহরণ তৈরি করার দরকার নেই
সিসিপিজ্জা

11

আপনি যখন ব্যবহার Snackbar.LENGTH_LONGকরবেন তখন বরখাস্তের জন্য আপনাকে অ্যাকশন বোতামের প্রয়োজন হবে না, দ্বিতীয়ত স্বয়ংক্রিয়ভাবে বরখাস্ত করার পরে। আপনার এই কোডটি ব্যবহার করা উচিত:

 Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE);
            snackbar.setAction("dismiss", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });

            snackbar.show();

এই রেখাটি সাবধান :

Snackbar.LENGTH_INDEFINITE

6

এটি একটি পুরানো প্রশ্ন, তবে আমি স্নাকবারে একই বৈশিষ্ট্যের চারপাশে আমার নিজের অভিজ্ঞতাটি ভাগ করতে চাই। সুতরাং আমরা আমাদের অ্যাপ্লিকেশনটির জন্য একটি নকশা পেয়েছি, সেই স্নাকবারটি অনির্দিষ্টকালের জন্য প্রদর্শিত হওয়া উচিত এবং ব্যবহারকারীরা এটি খারিজ করতে সক্ষম হবেন .. তবে এর অভ্যন্তরে ডিসআইএসআইএস বোতাম থাকা উচিত নয় (গুগল যেভাবেই স্নাকবারগুলির মধ্যে ক্রিয়া বাতিল বা বাতিল করার পরামর্শ দিচ্ছে না)। আমাদের স্নাকবারটিকে কেবল এটিতে টোকা দিয়ে বরখাস্ত করতে হয়েছিল।

আমাদের জন্য কাজ করার একমাত্র সমাধানটি শেষ ছিল (আমি এখানে রেট্রোলাম্বদা ব্যবহার করছি, তবে মানক দর্শন nঅনলিক্লিকলিস্টারও ব্যবহার করা যেতে পারে):

final Snackbar snack = ... /* create proper snackbar as alway */
snack.getView().setOnClickListener(v -> snack.dismiss());

মাঝখানে getView () কলটি নোট করুন ।


আপনি কোথায় পড়েন যে "গুগল স্নাকবারগুলির মধ্যে বরখাস্ত বা বাতিল করার প্রস্তাব দিচ্ছে না"? আমি কারণটি পড়তে চাই ....
জোসেফ

@ জোসেএফ দয়া করে প্রশ্নের নীচে প্রথমে মন্তব্যটি পরীক্ষা করুন;) এটি মেটেরিয়াল ডিজাইনের নির্দেশিকাতে রয়েছে: উপাদান.
io/guidlines/compferences/…

এই উত্তরটি অনন্য যে এটি 'LENGTH_INDEFINITE' সেট করা স্নাকবারকে খারিজ করার একটি উপায় দেয় (যাতে ব্যবহারকারী এটি পড়ার সময় করতে পারে) অ্যাকশন বোতামটি যে কোনও ক্রিয়া শুরু না করেই শুরু করে। আমি আমার খেলোয়াড়দের একটি আপডেট ডাউনলোড হয়ে গেছে এবং এটি প্রয়োগ করা চাইলে পুনরায় চালু করতে সে সম্পর্কে অবহিত করতে একটি স্নাকবার ব্যবহার করি। যদি তারা পুনরায় চালু করতে প্রস্তুত না হয় তবে আমি অ্যাকশন বোতামটি আঘাত না করে এটিকে বরখাস্ত করার উপায় চেয়েছিলাম। আমার পরীক্ষার ডিভাইসে স্নাকবারগুলি সোয়াইপ দিয়ে বরখাস্ত করবে না। এই কোডটি এটিকে অ্যাকশন বোতামের বাইরের স্পর্শের সাথে বরখাস্ত করে, যা আমার মতে ডিফল্ট আচরণ হওয়া উচিত
Androidcoder

3

স্নাকবার ( 'com.android.support:design:23.2.1' থেকে ) বহু ধরণের বরখাস্ত ক্রিয়াকে সমর্থন করে। আপনি ইভেন্ট ব্যবহার করে একটি সাধারণ ফিল্টার তৈরি করতে পারেন , যেমন এই উদাহরণে:

Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary))
    .setCallback(new Snackbar.Callback() {
        @Override
        public void onShown(Snackbar snackbar) {
            super.onShown(snackbar);
        // when snackbar is showing
        }

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            super.onDismissed(snackbar, event);
            if (event != DISMISS_EVENT_ACTION) {
               //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe
            }
        }
    })
    .setAction("Undo, view1 -> {
        // if user click on Action button
}).show();

স্নাকবারের বরখাস্ত প্রকারগুলি:

/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE = 0;
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final int DISMISS_EVENT_ACTION = 1;
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final int DISMISS_EVENT_TIMEOUT = 2;
/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
public static final int DISMISS_EVENT_MANUAL = 3;
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final int DISMISS_EVENT_CONSECUTIVE = 4;

PS নমুনা কোডে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করেছেন (রেট্রোলেম্বা দ্বারা)


প্রশ্নটি একজন বরখাস্ত হ্যান্ডলার সম্পর্কে নয়। প্রশ্নটি কীভাবে বোতাম ক্লিকে খারিজ করা যায়।
অবিশ্বাস্য জানুয়ারী

2

আমারও একই সমস্যা ছিল। যখন আমি .dismiss () ব্যবহার করতাম তখন অ্যানিমেশনগুলি দেখতে অন্যরকম দেখায় এবং দুটি সমস্যা ছিল:

  1. এফএবি আবার নেমে যায় না
  2. স্নাকবার নিজেই কোনও ক্লিকের মতো স্লাইড হয় না

স্নাকবারের জন্য মূল অ্যান্ড্রয়েড উত্স কোডটি অনুসন্ধান করে আমি নিম্নলিখিত সমাধানটি পেয়েছি:

View snackbarView = snackbar.getView();
Button snackbarActionButton = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
//snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user

তারপরে, আমি স্ন্যাপবার্যাকশনবাটনে .perforClC কল করব

snackBarActionButton.performClick();

স্নাকবারের জন্য অ্যান্ড্রয়েড সোর্স কোডের লিঙ্ক: https ://android.googles स्रोत.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/ Snackbar.java


আমার কাছে কোনও অর্থ বোধ করে না। আপনি যদি আসলে একটি বোতাম টিপেন তবে কেন আপনি পারফরম্যান্স ক্লিক করুন ()? এটি বাজে বলে মনে হচ্ছে।
অবিশ্বাস্য জানুয়ারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.