web-dev-qa-db-ja.com

Android長さが不定のライブラリスナックバーをサポート

Snackbarは、画面上の表示の長さを決定するときに、LENGTH_LONGまたはLENGTH_SHORTのいずれかのみを取得することがわかります。

誰かが画面からそれをスワイプするまで表示したいと思います。これは、インターネットがなく、LENGTH_LONGを選択したときに2750ms後に画面から消えないようにユーザーに通知する場合など、永続的なエラーがある場合です。

もちろん、setDurationを途方もなく長いミリ秒の値に使用することもできますが、ユーザーが破棄するまで消えないように設定する方法はありませんか?

23
Simon

Android Support Library( 22.2.1 )の最新バージョンには、 LENGTH_INDEFINITE

以下は、却下されるか、別のスナックバーが表示されるまで、スナックバーを表示します。

Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE)
        .setAction("Your Action", null).show();
54
Dan

更新:前述のとおり、これはAndroidサポートライブラリ22.2.1のリリースで可能になりました。LENGTH_INDEFINITEフラグを使用してください

Android Design Supportライブラリからの公式実装を使用する場合、Snackbarの無期限の表示を設定することはできません。

これを行うと、スナックバーのマテリアルデザインの哲学に違反する可能性がありますが、これを許可するサードパーティのスナックバーの実装があります。次に例を示します。

https://github.com/nispok/snackbar

このプロジェクトでは、表示期間に次の値を使用できます。

LENGTH_SHORT: 2s
LENGTH_LONG: 3.5s (default)
LENGTH_INDEFINTE: Indefinite; ideal for persistent errors

公式のSnackbar実装のリリースにより、このプロジェクトはもはや開発されていないことに注意してください。

10
BrentM

com.Android.support:appcompat-v7:26.1.およびSnackbar.LENGTH_INDEFINITEは、あるべき姿で機能します。サンプルは次のようになります。

private HashMap<Long, Snackbar> mTokenSnackbarMap = new LinkedHashMap<>();

private void dropPoint(@NonNull Location location) {
    final Long token = SystemClock.elapsedRealtime();
    // <submitPoint> is the callback to be executed
    // at a time in the future, if the "cancel" button
    // of the Snackbar isn't clicked until that time.
    Runnable submitPoint = () -> {
        Snackbar bar = mTokenSnackbarMap.get(token);
        if (bar != null) {
            // "cancel" button of the Snackbar wasn't clicked,
            // but our time is up. Dismiss the Snackbar.
            bar.dismiss();
            mTokenSnackbarMap.remove(token);
            Log.i(TAG, "dropPoint: dismiss snackbar");
        }
        mDatabase.add(Point.Factory.create(uid, location));
        Log.i(TAG, "dropPoint: addPoint");
    };

    // The indefinite Snackbar allowing arbitrary cancellation.
    Snackbar snackbar = Snackbar.make(mMainView, R.string.point_pending, Snackbar.LENGTH_INDEFINITE)
        .setAction(R.string.cancel, (v) -> {
                    mTokenSnackbarMap.remove(token);
                    mUiHandler.removeCallbacks(submitPoint, token);
                    Log.i(TAG, "dropPoint: cancel snackbar");
                });
    mTokenSnackbarMap.put(token, snackbar);
    mUiHandler.postAtTime(submitPoint, token,
                SystemClock.uptimeMillis() + Constants.POINT_DELAY_MILLIS);
    Log.i(TAG, "dropPoint: postAtTime");
    snackbar.show();
}
2
felixy