IT박스

스낵바가 자동으로 닫 혔을 때 어떻게 알림을받을 수 있습니까?

itboxs 2020. 11. 19. 07:59
반응형

스낵바가 자동으로 닫 혔을 때 어떻게 알림을받을 수 있습니까?


com.android.support:design:22.2.0도서관 에서 스낵바를 사용하고 있습니다. 삭제를 취소하는 데 사용하고 있습니다. 내 삶을 더 쉽게 만들기 위해 UI를 데이터 소스에서 실제로 삭제 된 것처럼 보이게 만들고 스낵바의 실행 취소 버튼을 누르지 않으면 실제로 데이터 소스에서 삭제를 수행합니다. 따라서 Snackbar가 더 이상 표시되지 않는시기를 알고 싶으므로 항목을 삭제하는 것이 안전합니다.

Snackbar에서 getView ()를 호출 할 수 있지만 어떤 리스너를 사용해야하는지 잘 모르겠습니다. 시도 setOnSystemUiVisibilityChangeListener()했지만 작동하지 않았습니다. 시스템 상태 표시 줄에만 해당한다고 생각합니다.

또한 Snackbar에는 개인 생성자가 있으므로 확장 할 수 없습니다.


Google 디자인 라이브러리는 버전 23에서 Snackbar 콜백을 지원합니다. Snackbar 문서콜백 문서를 참조하세요 . 그런 다음 스낵바가 닫힐 때 (및 표시 될 때) 알림을 받게되며, 이것이 유용한 경우 닫힘 유형도 알려줍니다.

snackbar.addCallback(new Snackbar.Callback() {

    @Override
    public void onDismissed(Snackbar snackbar, int event) {
      //see Snackbar.Callback docs for event details
      ...  
    }

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

    snackbar.setCallback(new Snackbar.Callback() {

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
                // Snackbar closed on its own
            }
        }

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

최근에 스크롤하고 Snackback을 표시 할 때이 문제를 직접 발견했습니다. 첫 번째 항목이 사라지기도 전에 너무 많이 표시되었습니다. 앱이 스낵바를 설치해야하는지 알 수있는 방법을 찾아야했습니다.

개인적으로이 해결책을 찾았습니다.

사실 Snackbar 자체는 상태 / 가시성에 대한 리스너를 제공하지 않지만 여전히 Snackbar (getView ();)에서 View Object를 가져올 수 있습니다. View Object에서 다양한 메서드를 사용하여 리스너를 추가 할 수 있습니다.

이를 구현하려면 리스너를 추가하면 void를 반환하므로 일반적인 "일체형"Toast / Snackbar 사용에서 벗어나야합니다 .

개인적으로 OnAttachStateChangeListener를 찾았습니다.

유용 할 경우를 대비하여 내 코드와 함께 스니퍼를 떨어 뜨립니다.

Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG);

snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
    @Override
        public void onViewAttachedToWindow(View v) {
            canDisplaySnackbar = false;
        }

    @Override
    public void onViewDetachedFromWindow(View v) {

        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            @Override
            public void run() {
                canDisplaySnackbar = true;

                }
        }, 1000);
    }
});
snack.show();

이것은 내 문제에 대한 내 구현 일뿐입니다 .postDelayed Runnable이있는 Handler는 귀하의 경우에도 적합하지 않을 수 있습니다. 내가 이미 소유 한 스 니펫을 사용하여 제안한 구현에 대한 일반적인 아이디어를 제공하기위한 것입니다.


스낵바가 표시되거나 닫 혔을 때 알림을 받으려면 setCallback (Callback)을 통해 Snackbar.Callback을 제공 할 수 있습니다.


Kotlin의 Snackbar.addCallback

val snackBar = Snackbar
                .make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
                .addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
                    override fun onShown(transientBottomBar: Snackbar?) {
                        super.onShown(transientBottomBar)
                    }

                    override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
                        super.onDismissed(transientBottomBar, event)
                    }
                })

        val snackBarView = snackBar.view
        snackBarView.setBackgroundColor(Color.RED)
        snackBar.show()

onDismissed는 액션 텍스트가 클릭 될 때도 호출됩니다.

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT

이제 새 코드는 다음과 같습니다.

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG);

snackbar.addCallback(new Snackbar.Callback() {

@Override
public void onDismissed(Snackbar snackbar, int event) {
 if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
        // Snackbar closed on its own
    }  
}

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

setCallback is now deprecated and addCallback should be used

https://developer.android.com/reference/android/support/design/widget/BaseTransientBottomBar.html#addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback)


There is currently no way to get notification when the Snackbar has finished displaying.

In this thread a workaround is discussed based on a timer for the duration of the Snackbar display. Snackbar in Support Library doesn't include OnDismissListener()?

One issue to consider with this workaround is it is possible that the Snackbar duration is restarted. The material design specification for Snackbar says this will happen if an unrelated dialog or popup is displayed.


Currently you can't achieve it.

There isn't a listener called when the snackbar is dimissed.

The easiest way to do that is to temporarily save the record elsewhere (even a local variable), then re-insert it if they happen to hit the undo button.


    snackbar.addCallback(new Snackbar.Callback() {
        public void onShown(Snackbar snackbar) {
           //  on show  
        }
 public void onDismissed(Snackbar snackbar, int event) {
          //  on dismiss  
        }
      });

참고URL : https://stackoverflow.com/questions/30926380/how-can-i-be-notified-when-a-snackbar-has-dismissed-itself

반응형