【问题标题】:Android Snackbar TextAlignment in CenterAndroid Snackbar TextAlignment 居中
【发布时间】:2015-09-19 12:27:23
【问题描述】:

如何将 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();

【问题讨论】:

    标签: android


    【解决方案1】:
    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);
    }
    

    【讨论】:

    • 我无法仅使用 setGravity 获得所需的效果(即没有 setTextAlignment,它适用于 API 17)。我正在使用支持库 23.2.0...
    • @kevinze 我只使用了 setTextAlignment 而没有使用 setGravity,支持 API 23 上的 23.3.0。
    【解决方案2】:

    试试这个:

    // 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();
    

    【讨论】:

      【解决方案3】:

      上述条件setTextAlignment() OR setGravity() 解决方案对我不起作用。

      对于防弹居中文本:

      1. 始终申请setGravity()
      2. 申请setTextAlignment() API >= 17

      并注意 AndroidX 中的支持库更改。如果使用 AndroidX,请通过 com.google.android.material.R.id.snackbar_text 而不是 android.support.design.R.id.snackbar_text 查找 TextView。

      代码:

      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);
      }
      

      【讨论】:

        【解决方案4】:

        下面的代码对我有用:

        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);
        }
        

        【讨论】:

          【解决方案5】:

          另一种解决方案,使用 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 为小吃栏添加边距,并更改其动画。如果您想要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>
          

          【讨论】:

            【解决方案6】:

            使用“com.google.android.material”而不是“android.support.design.R”,因为它在 androidx 迁移后不再受支持。

                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();
                    }
                });
            

            【讨论】:

              【解决方案7】:

              H/V 中心的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();
                  }
              }
              

              结果:

              【讨论】:

                【解决方案8】:

                尝试以下代码,它适用于在中心设置小吃栏文本:

                    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();
                

                【讨论】:

                  猜你喜欢
                  • 2019-01-14
                  • 2013-04-18
                  • 2016-11-06
                  • 2015-08-22
                  • 2017-05-10
                  • 2017-03-07
                  • 2016-03-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多