Nice programing

자체 작업 버튼을 사용하여 스낵바를 닫는 방법은 무엇입니까?

nicepro 2020. 10. 13. 19:20
반응형

자체 작업 버튼을 사용하여 스낵바를 닫는 방법은 무엇입니까?


Android 디자인 지원 라이브러리에는 이제 Snackbar에 대한 지원이 포함됩니다.

다음 코드를 사용하여 하나를 만들었습니다.

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

            }
        }).show();

스낵바는 스 와이프하여 닫을 수 있습니다. 그러나 자체 작업 버튼 (setAction 함수를 사용하여 생성됨)을 사용하여 해제하고 싶습니다.

그러나이를 수행 할 수있는 기능이없는 것 같습니다.


자바의 경우

.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();

Kotlin의 경우

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

클릭 동작을 구현하고 비워 둡니다. 빈 클릭 동작을 클릭하면 스낵바가 닫힙니다.

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

사용시 해제 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

이것은 오래된 질문이지만 Snackbar의 유사한 기능에 대한 내 경험을 공유하고 싶습니다. 그래서 우리는 앱에 대한 디자인을 얻었습니다. 그 스낵바는 무기한 표시되어야하고 사용자는 그것을 닫을 수 있어야합니다.하지만 그 안에 DISMISS 버튼이 있어서는 안됩니다 (Google은 스낵바 내부에서 Dismiss 또는 Cancel 작업을 권장하지 않습니다). 우리의 스낵바는 그것을 두드려서 닫아야 만했습니다.

우리를 위해 일한 유일한 해결책은 결국 (여기서 retrolambda를 사용하고 있지만 표준 View.OnClickListener도 사용할 수 있습니다) :

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

의 getView () 중간에 전화를.


나는 같은 문제가 있었다. .dismiss ()를 사용했을 때 애니메이션이 다르게 보였고 두 가지 문제가있었습니다.

  1. FAB가 다시 다운되지 않습니다.
  2. SnackBar 자체는 클릭 할 때처럼 아래로 미끄러지지 않습니다.

Looking into the original Android Source Code for Snackbar I found the following solution:

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

Then, I would call the .performClick on the snackBarActionButton

snackBarActionButton.performClick();

Link to the Android Source Code for Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java


Snackbar (from 'com.android.support:design:23.2.1') support many types of dismiss action. You can create a simple filter by using event, such as in this example:

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();

Snackbar's dismiss types:

/** 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;

P.S. In sample code used lambda expressions (by RetroLambda)

참고URL : https://stackoverflow.com/questions/30729312/how-to-dismiss-a-snackbar-using-its-own-action-button

반응형