【问题标题】:Set vertical padding on Android SnackBar在 Android SnackBar 上设置垂直填充
【发布时间】:2019-11-30 03:04:19
【问题描述】:

所以我想以一种干净可维护的方式更改 Android SnackBar 上的垂直填充。

我尝试使用:

  • FrameLayoutLinearLayoutTextView 上的setPaddingsetMargin 用于创建 SnackBar

  • includeFontPaddingsetLineSpacingsetSingleLineTextView

但似乎没有任何效果。

不过,我找到this 回答:

dimens.xml

使用这个:

<dimen name="design_snackbar_padding_horizontal">0dp</dimen> 但请记住,这将应用于您应用程序中的所有快餐栏。

这确实有效,但丑陋的方式,它适用于应用程序中的所有 SnackBars,而且它不安全,因为我正在覆盖将来可能重命名或删除的私有属性。

我正在尝试创建类似于 Facebook Messenger(以前)和 Youtube(很有趣,Google)的互联网连接指示器:

Snackbar.make(container, message, duration).apply {

    val snackBarView = view.apply {
        setBackgroundColor(ContextCompat.getColor(this@MainActivity, connectivity.color))
    }

    (snackBarView.findViewById(com.google.android.material.R.id.snackbar_text) as TextView).apply {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            textAlignment = View.TEXT_ALIGNMENT_CENTER
        else
            gravity = Gravity.CENTER
    }

}.show()

所以这就是我所期望的,并且正在使用上面提供的答案:

这就是我实际得到的:

提前致谢!

【问题讨论】:

  • 您只是在更改文本的重力,但据我了解,您想降低SnackBar 的高度。为此,我要做的是更改您从 SnackBar 获得的 TextView 的布局参数。
  • 我确实尝试过,我尝试用WRAP_CONTENT 为高度创建一个新的LinearLayout.LayoutParams,但没有成功。额外的空间实际上是填充而不是高度,可以使用以下方法覆盖它:` 4dp `

标签: android android-snackbar


【解决方案1】:

制作自定义小吃吧:

Snackbar snackbar = Snackbar.make(coordinatorLayout, R.string.custom_color, Snackbar.LENGTH_LONG).setAction(R.string.Ok, new View.OnClickListener() {
                  @Override
                   public void onClick(View view) {
                          Snackbar.make(coordinatorLayout, R.string.click_action, Snackbar.LENGTH_SHORT).show();
                   }
         }).setActionTextColor(Color.RED);
            View snackview = snackbar.getView();
            TextView txtView = snackview.findViewById(R.id.snackbar_text);
            txtView.setPadding(0,0,0,0);
            snackbar.show();

【讨论】:

  • 使用setPadding(0, 0, 0, 0)TextView 上设置填充似乎不起作用。
  • 为 textview 填充尝试负值!
【解决方案2】:

提供的答案不适合我。所以经过大量的尝试,我终于解决了我的问题(和上面描述的完全一样)。 要减少小吃栏中的垂直填充,请尝试以下操作:

        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    llp.topMargin = -30;
    llp.bottomMargin = -30;
    snackText.setLayoutParams(llp);

以下是我编写的完整代码,用于制作 youtube 应用程序等功能,用于检查和显示互联网错误。

    public void showNoInternet(){
    noInternetSnack = Snackbar.make(noInternetSnackParent, "No internet connection", Snackbar.LENGTH_INDEFINITE)
            .setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_SLIDE)
            .setBackgroundTint(PaletteUtils.getSolidColor(PaletteUtils.MATERIAL_RED));

    Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) noInternetSnack.getView();
    TextView snackText = snackbarLayout.findViewById(com.google.android.material.R.id.snackbar_text);
    snackText.setTextSize(getResources().getDimension(R.dimen.newsMoreTextSize)/3);
    snackText.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    llp.topMargin = -30;
    llp.bottomMargin = -30;
    snackText.setLayoutParams(llp);

    noInternetSnack.show();
}

public void hideNoInternet(){
    if (noInternetSnack != null && noInternetSnack.isShown()){
        Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) noInternetSnack.getView();
        noInternetSnack.setBackgroundTint(PaletteUtils.getSolidColor(PaletteUtils.MATERIAL_GREEN));
        TextView snackText = snackbarLayout.findViewById(com.google.android.material.R.id.snackbar_text);
        snackText.setText("You are back online");
        new java.util.Timer().schedule(
                new java.util.TimerTask() {
                    @Override
                    public void run() {
                        noInternetSnack.dismiss();
                    }
                },
                500
        );
    }
}

private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        NetworkInfo currentNetworkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

        if (currentNetworkInfo.isConnected()) {
            hideNoInternet();
        } else {
            showNoInternet();
        }
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多