Почему моя снэк-бар Android закрывается после нажатия на кнопку действия? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть снэк-бар, который я строю с длительностью, установленной на Snackbar.LENGTH_INDEFINITE

Снэк-бар отображается правильно, когда я звоню mySnackbar.show();

Но как только я нажимаю кнопку действияснэк-бар отклонен.

Кажется, что метод отклонения вызывается системой.

Кто-нибудь знает обходной путь?

Вот мой код для построения моей закусочной:

Snackbar mySnackbar = Snackbar.make(mParent, R.string.the_question, Snackbar.LENGTH_INDEFINITE)
                .setAction(R.string.yes, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //My code...
                    }
                })
                .addCallback(new Snackbar.Callback() {

                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                    }

                    @Override
                    public void onShown(Snackbar snackbar) {
                    }
               });

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Ответ на этот вопрос заключается в том, как Snackbar.setAction(CharSequence text, final View.OnClickListener listener) реализован

Если вы передаете этому методу непустой текст или ненулевой прослушиватель, TextView, отображающий текст действия, устанавливает OnClickListener, который вызывает BaseTransientBottomBar.dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION) когда действие выполнено.Это приводит к отклонению Snackbar.

Чтобы предотвратить это, нужно получить TextView для представления действия Snackbar и переопределить его OnClickListener с прослушивателем, который не вызывает dispatchDismiss ()

Вот код Snackbar.setAction() для справки

public Snackbar setAction(CharSequence text, final View.OnClickListener listener) {

        final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
        final TextView tv = contentLayout.getActionView();

        if (TextUtils.isEmpty(text) || listener == null) {
            tv.setVisibility(View.GONE);
            tv.setOnClickListener(null);
        } else {
            tv.setVisibility(View.VISIBLE);
            tv.setText(text);
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    listener.onClick(view);
                    // Now dismiss the Snackbar
                    dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION);
                }
            });
        }
        return this;
}
0 голосов
/ 19 февраля 2019

Ниже кода отображается диалоговое окно Alert «после», отображается снэк-бар.

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
                "This is Snackbar", Snackbar.LENGTH_INDEFINITE).
                setAction(R.string.yes, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }
                }).addCallback(new Snackbar.Callback() {

            @Override
            public void onDismissed(Snackbar transientBottomBar, int event) {
                super.onDismissed(transientBottomBar, event);

            }

            @Override
            public void onShown(Snackbar sb) {
                super.onShown(sb);

            }
        });
        snackbar.show();
        showAlertDialog(this, "Alert!!", "Alert Dialog", "Yes", "No");
    }

showAlertDialog - это простой статический метод для отображения диалогового окна

public static void showAlertDialog(Context context, String title, String message, String posBtnMsg, String negBtnMsg) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message);
        builder.setPositiveButton(posBtnMsg, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.setNegativeButton(negBtnMsg, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();

    }

Снимок экрана вывода для приведенного выше кода ниже,

enter image description here

...