web-dev-qa-db-ja.com

スナックバービューにマージンを追加する

スナックバーを使用するように現在のアプリを更新しています。Googleの仕様では、スナックバーのさまざまな使用方法が示されています http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars- toasts-specs

例A:

Snackbar with margin

例B:

Snackbar pinned to layout

これが私のコードATMです:

Snackbar snackbar = Snackbar.make(mParentLayout, displayMessage,     
    Snackbar.LENGTH_LONG);
    snackbar.setAction(actionMessage, mClickListener);
    snackbar.show();

例Bの結果が得られます。

マージンを追加するにはどうすればよいですか?

10

Saeidの回答に加えて、デフォルトのSnackBarレイアウトパラメータを取得して、必要に応じて変更できます。

public static void displaySnackBarWithBottomMargin(Snackbar snackbar, int sideMargin, int marginBottom) {
    final View snackBarView = snackbar.getView();
    final CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) snackBarView.getLayoutParams();

    params.setMargins(params.leftMargin + sideMargin,
                params.topMargin,
                params.rightMargin + sideMargin,
                params.bottomMargin + marginBottom);

    snackBarView.setLayoutParams(params);
    snackbar.show();
}
24
BamsBamx

@BamsMamxソリューションが機能しなかったため、ソリューションを追加するだけです。getChildAt(0)を追加する必要があります。

  public static void displaySnackBarWithBottomMargin(BaseActivity activity, View main) {
   Snackbar snackbar = Snackbar.make(main, R.string.register_contacts_snackbar, Snackbar.LENGTH_SHORT);
    final FrameLayout snackBarView = (FrameLayout) snackbar.getView();

    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) snackBarView.getChildAt(0).getLayoutParams();
    params.setMargins(params.leftMargin,
                params.topMargin,
                params.rightMargin,
                params.bottomMargin + 100;
    snackBarView.getChildAt(0).setLayoutParams(params);
    snackbar.show();
}
4
Vodet

スナックバーの表示を制御するための鍵は、Android.support.design.widget.CoordinatorLayoutレイアウトを使用することです。これがないと、スナックバーは常に小さなデバイスの下部と大きなデバイスの左下に塗りつぶされて表示されます。注:CoordinatorLayoutをレイアウトのルートViewGroupとして、またはレイアウトツリー構造の任意の場所で使用できます。

追加した後、Snackbar.make()コマンドの最初の引数としてCoordinatorLayout(または子)を渡していることを確認してください。

CoordinatorLayoutにパディングまたはマージンを追加することで、位置を制御し、画面の下部からスナックバーを移動できます。

マテリアルデザインガイドラインでは、スナックバーの最小幅と最大幅を指定しています。小さなデバイスでは、画面の幅全体に表示されますが、タブレットでは、スナックバーが最大幅に達し、画面の幅全体に表示されません。

3
BrentM

これを試して:

Snackbar snackbar = Snackbar.make(findViewById(Android.R.id.content), "message", Snackbar.LENGTH_LONG);

View snackBarView = snackbar.getView();
            LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,      
LayoutParams.WRAP_CONTENT);

params.setMargins(left, top, right, bottom);

snackBarView.setLayoutParams(params);

snackbar.show();
3
Saeid

上記の解決策はどれも私にはうまくいきませんでした。

しかし、私は翻訳の助けを借りて使用できる1つのトリックを手に入れました。

Snackbar snackbar = Snackbar.make(mActivity.getWindow().getDecorView().getRootView(), message, Snackbar.LENGTH_SHORT);
View snackBarView = snackbar.getView();
snackBarView.setTranslationY(-(convertDpToPixel(48, mActivity)));
snackbar.show();

あなたはconvertDpToPixelメソッドを見つけることができます ここ

3
M.Usman

特定の側にのみマージンを適用したい場合は、以下のようにも達成する必要があります。たとえば、下マージンのみを適用するには、

 Snackbar.make(yourContainerView, getString(R.string.your_snackbar_message), Snackbar.LENGTH_LONG_orWhateverYouWant).apply {
    val params = view.layoutParams as CoordinatorLayout.LayoutParams
    params.anchorId = R.id.your_anchor_id
    params.anchorGravity = Gravity.TOP_orWhateverYouWant
    params.gravity = Gravity.TOP_orWhateverYouWant
    params.bottomMargin = 20 // in pixels
    view.layoutParams = params
    show()
}
1
Shivanand Darur

テーマに追加するだけです。

<item name="snackbarStyle">@style/SnackbarMessageStyle</item>

そして、スタイルを追加します。

<style name="SnackbarMessageStyle" parent="@style/Widget.MaterialComponents.Snackbar">
    <item name="Android:layout_margin">@dimen/snackbarMessageMargin</item>
</style>
1
Frank

Kotlin開発者にとって、私が使用する便利な拡張機能は、

inline fun View.snack(message:String, left:Int = 10, top:Int = 10, right:Int = 10, bottom:Int = 10, duration:Int = Snackbar.LENGTH_SHORT){
 Snackbar.make(this, message, duration).apply {

     val params = CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT )
     params.setMargins(left, top, right, bottom)
     params.gravity = Gravity.BOTTOM
     params.anchorGravity = Gravity.BOTTOM

     view.layoutParams = params
     show()
 }
}


inline fun View.longSnack(message:String){
   snack(message, duration = Snackbar.LENGTH_LONG)
}
1
Aziz

Kotlin拡張機能での私の解決策:

 fun showSnackBarWithConfirmation(text:String、view:View、action:()-> Unit)= 
 Snackbar.make(view、text、Snackbar.LENGTH_LONG).apply {
 this.view.findViewById(R.id.snackbar_text)
 .setTextColor(view.context.color(R.color.colorBackgroundLight))
 this.view.setBackgroundResource(view.context.color( R.color.colorBackgroundLight))
 
         setAction(view.context.getString(R.string.common_ok)) { action.invoke() }

        (this.view.layoutParams as ViewGroup.MarginLayoutParams)
            .apply { setMargins(56,0,56,300) }

        show()
    }
0
Dima DEF

マージンを設定するには:

View viewInSnk = snkbr.getView();
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) snkbr.getView().getLayoutParams();
params.setMargins(5, 5, 5, 5);
snkbr.getView().setLayoutParams(params);

と丸い角を設定するには:

viewInSnk.setBackgroundDrawable(getResources().getDrawable(R.drawable.snackbar_shape));

と形のために:

<shape Android:shape="rectangle"
    xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#313131"/>
    <corners Android:radius="4dp"/>
</shape>
0
M.Namjo

これは私のために働きます
containerは親タグですCoordinatorLayout
R.id.bottom_barは、上記のスナックバーを表示するビューです。

    Snackbar.make(container, getString(R.string.copied), Snackbar.LENGTH_LONG).apply {
        val params = view.layoutParams as CoordinatorLayout.LayoutParams
        params.anchorId = R.id.bottom_bar
        params.anchorGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
        params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
        view.layoutParams = params
        show()
    }

追加のマージンが必要な場合は、R.id.bottom_barにパディングを追加するだけです。これは機能するだけです

0
Vlad