スナックバーを使用するように現在のアプリを更新しています。Googleの仕様では、スナックバーのさまざまな使用方法が示されています http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars- toasts-specs
例A:
例B:
これが私のコードATMです:
Snackbar snackbar = Snackbar.make(mParentLayout, displayMessage,
Snackbar.LENGTH_LONG);
snackbar.setAction(actionMessage, mClickListener);
snackbar.show();
例Bの結果が得られます。
マージンを追加するにはどうすればよいですか?
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();
}
@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();
}
スナックバーの表示を制御するための鍵は、Android.support.design.widget.CoordinatorLayout
レイアウトを使用することです。これがないと、スナックバーは常に小さなデバイスの下部と大きなデバイスの左下に塗りつぶされて表示されます。注:CoordinatorLayout
をレイアウトのルートViewGroup
として、またはレイアウトツリー構造の任意の場所で使用できます。
追加した後、Snackbar.make()コマンドの最初の引数としてCoordinatorLayout
(または子)を渡していることを確認してください。
CoordinatorLayout
にパディングまたはマージンを追加することで、位置を制御し、画面の下部からスナックバーを移動できます。
マテリアルデザインガイドラインでは、スナックバーの最小幅と最大幅を指定しています。小さなデバイスでは、画面の幅全体に表示されますが、タブレットでは、スナックバーが最大幅に達し、画面の幅全体に表示されません。
これを試して:
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();
上記の解決策はどれも私にはうまくいきませんでした。
しかし、私は翻訳の助けを借りて使用できる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メソッドを見つけることができます ここ
特定の側にのみマージンを適用したい場合は、以下のようにも達成する必要があります。たとえば、下マージンのみを適用するには、
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()
}
テーマに追加するだけです。
<item name="snackbarStyle">@style/SnackbarMessageStyle</item>
そして、スタイルを追加します。
<style name="SnackbarMessageStyle" parent="@style/Widget.MaterialComponents.Snackbar">
<item name="Android:layout_margin">@dimen/snackbarMessageMargin</item>
</style>
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)
}
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()
}
マージンを設定するには:
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>
これは私のために働きますcontainer
は親タグですCoordinatorLayoutR.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
にパディングを追加するだけです。これは機能するだけです