8

setAction onclickでAndroid Snackbarが消えるのを防ぐ方法、ありがとう

Snackbar.make(rootlayout, "Hello SnackBar!", Snackbar.LENGTH_INDEFINITE)
   .setAction("Undo", new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           // Snackbar should not dismiss
       }
   })
   .show();
4

3 に答える 3

9

これは、リフレクションを必要としない、これを達成するためのややクリーンなソリューションです。これは、Snackbar 内のボタンのビュー ID を知っていることに基づいています。これはサポート ライブラリのバージョン 27.1.1 で動作しますが、ビュー ID が変更されると、将来のバージョンでは動作しなくなる可能性があります。

まず、空の OnClickListener を使用してスナックバー アクションを設定します。

snackbar.setAction("Save", new View.OnClickListener() {
    @Override
    public void onClick(View v) {}
});

その後、スナックバーにコールバックを追加します (表示する前に)。onShown 関数をオーバーライドし、使用しているボタンを見つけてR.id.snackbar_action、独自の OnClickListener をそれに追加します。スナックバーは、手動で を呼び出したときsnackbar.dismiss()、またはスナックバーが CoordinatorLayout にアタッチされている場合はスワイプによってのみ閉じられます (スワイプを無効にする方法は別の SO の質問です)。

snackbar.addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {
    @Override
    public void onShown(Snackbar transientBottomBar) {
        super.onShown(transientBottomBar);

        transientBottomBar.getView().findViewById(R.id.snackbar_action).setOnClickListener(new View.OnClickListener() {
            // your code here
        }
于 2018-07-02T13:42:06.103 に答える
-1

遅くなったほうがいい - これが私がやった方法です。

private fun showSnackbar() {
        if(snackbar == null) {
            //init snackbar
            snackbar = Snackbar.make(mainCoordinator, R.string.snackbar_no_network, Snackbar.LENGTH_INDEFINITE)
                    .setAction(R.string.snackbar_no_network_action) {
                        checkConnection()
                    } // action text on the right side
                    .setActionTextColor(ContextCompat.getColor(context, R.color.snack_green))
            //set background color
            snackbar!!.view.setBackgroundColor(ContextCompat.getColor(context, R.color.main_dark_gray))
        }
        //show
        snackbar!!.show()
    }

private val handler = Handler()
private fun checkConnection() {
    handler.postDelayed(checkConnectionRunnable, 500)
}

private val checkConnectionRunnable = Runnable {
    if (!NetworkUtil.isOnline(context)){
        showSnackbar()
    }
}
于 2017-04-11T11:58:07.337 に答える