安卓 Snackbar 文字居中对齐

33

在此输入图片描述

如何将 Snackbar 的文本居中对齐?下面的代码没有起作用。

Snackbar snack = Snackbar.make(findViewById(android.R.id.content), intent.getStringExtra(KEY_ERROR_MESSAGE), Snackbar.LENGTH_LONG);
View view = snack.getView();
TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(ContextCompat.getColor(LoginActivity.this, R.color.red_EC1C24));
tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
snack.show();
8个回答

43
tv.setGravity(Gravity.CENTER_HORIZONTAL);

编辑

Snackbar 的外观在 Support 库v23中有所更改,因此现在正确的答案是:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
} else {
    tv.setGravity(Gravity.CENTER_HORIZONTAL);
}

1
我无法仅通过setGravity(即没有setTextAlignment,这是针对API 17的)获得所需的效果。我正在使用支持库23.2.0... - Kevin Lee
2
@kevinze 我只使用了setTextAlignment而没有使用setGravity,在API 23上支持23.3.0。 - hata

36

试试这个:

// make snackbar
Snackbar mSnackbar = Snackbar.make(view, R.string.intro_snackbar, Snackbar.LENGTH_LONG);
// get snackbar view
View mView = mSnackbar.getView();
// get textview inside snackbar view
TextView mTextView = (TextView) mView.findViewById(android.support.design.R.id.snackbar_text);
// set text to center
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
    mTextView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
else
    mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
// show the snackbar
mSnackbar.show();

8
上述条件性的setTextAlignment() OR setGravity()解决方案对我没用。

要实现完美居中的文本:

  1. 始终使用setGravity()
  2. 对于API >= 17,使用setTextAlignment()

请注意,在AndroidX中支持库发生了变化。如果使用AndroidX,请通过com.google.android.material.R.id.snackbar_text查找TextView,而不是android.support.design.R.id.snackbar_text

代码:

TextView sbTextView = (TextView) findViewById(com.google.android.material.R.id.snackbar_text);

sbTextView.setGravity(Gravity.CENTER_HORIZONTAL);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    sbTextView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
}

7
下面的代码对我很有用:
```html

下面的代码对我很有用:

```
TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
if(tv!=null) {
   if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN)
       tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);

   tv.setGravity(Gravity.CENTER_HORIZONTAL);
}

4

另一种解决方案,使用XML:

  • 您的主题必须继承自Theme.MaterialComponents,并且必须声明自己的样式Snackbar和其TextView如下:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="snackbarStyle">@style/MySnackbar</item>
    <item name="snackbarTextViewStyle">@style/MySnackbarTextView</item>
</style>
  • Theme.MaterialComponents 会给 Snackbar 添加一个 margin,并且改变它的动画。如果你想使用 AppCompat 样式,请按照以下步骤进行:
<style name="MySnackbar" parent="@style/Widget.MaterialComponents.Snackbar">
    ...
    <item name="android:layout_margin">0dp</item>
    <item name="animationMode">slide</item>
</style>

最后,我们可以编辑我们的TextView
<style name="MySnackbarTextView" parent="@style/Widget.MaterialComponents.Snackbar.TextView">
    ...
    <item name="android:gravity">center_horizontal</item>
    <item name="android:textAlignment">center</item>
</style>

0

AndroidX的水平/垂直居中解决方案:

public class SnackBarCentered{
    private Snackbar snackbar;

    public void show(String message){
        if (snackbar != null)
            snackbar.dismiss();//Dismiss the previous snackbar if any
        snackbar = Snackbar.make(this.binding.getRoot(), message, Snackbar.LENGTH_SHORT);
        View view = snackbar.getView();
        FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
        params.gravity = Gravity.CENTER;
        params.width=FrameLayout.LayoutParams.WRAP_CONTENT;
        TextView tv = (TextView) view.findViewById(com.google.android.material.R.id.snackbar_text);
        //Replace with android.support.design.R.id.snackbar_text if you are not using androidX
        if(tv!=null) {
            tv.setGravity(Gravity.CENTER);
            tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
        }
        view.setLayoutParams(params);
        snackbar.show();
    }
}

结果:

enter image description here


0
请在Androidx迁移后使用“com.google.android.material”而不是“android.support.design.R”,因为后者已不再受支持。
    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar mSnackbar = Snackbar.make(view, R.string.copyright, Snackbar.LENGTH_SHORT);
            View mView = mSnackbar.getView();
            TextView mTextView = (TextView) mView.findViewById(com.google.android.material.R.id.snackbar_text);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
                mTextView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
            else
                mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
            mSnackbar.show();
        }
    });

-1

尝试以下代码,它可以将 Snackbar 文本设置在中心位置:

    Snackbar snackbar = Snackbar.make(main_layout, "This is snack", Snackbar.LENGTH_LONG);
    View snackbarView = snackbar.getView();
    Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
    layout.setGravity(Gravity.CENTER);
    TextView mTextView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
    mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
    mTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    snackbar.show();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接