【问题标题】:Place snackbar in a Utility class将小吃店放在实用程序类中
【发布时间】:2016-06-03 10:08:21
【问题描述】:

我经常使用这种方法来显示带有应用程序中使用的颜色的小吃栏消息。出于这个原因,我想让该方法成为静态方法并将其放在最后一类实用程序中,这样我就可以在所有地方使用它,而无需每次都重复它。

但是,这有findViewByIdgetResources().getColor 等的问题。需要一个活动来“生活”并且也不能是静态的。

有什么优雅的方法可以做到这一点?我一直在查看其他帖子,但没有一个确实反映了这个问题。 谢谢!!

    protected void displaySnackbar (String s)
{
    Snackbar snack = Snackbar.make(findViewById(android.R.id.content), s, Snackbar.LENGTH_LONG);
    View sbview = snack.getView();
    sbview.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
    TextView textView = (TextView) sbview.findViewById(android.support.design.R.id.snackbar_text);
    textView.setTextColor(getResources().getColor(R.color.primary_light));
    snack.show();
}

【问题讨论】:

  • Snackbar 的根视图可以不同于android.R.id.content ?

标签: android android-snackbar


【解决方案1】:

您可以使用此代码gist

在链接失效的情况下发布代码

public class UtilSnackbar {
    /************************************ ShowSnackbar with message, KeepItDisplayedOnScreen for few seconds*****************************/
    public static void showSnakbarTypeOne(View rootView, String mMessage) {
        Snackbar.make(rootView, mMessage, Snackbar.LENGTH_LONG)
                .setAction("Action", null)
                .show();
    }

    /************************************ ShowSnackbar with message, KeepItDisplayedOnScreen*****************************/
    public static void showSnakbarTypeTwo(View rootView, String mMessage) {

        Snackbar.make(rootView, mMessage, Snackbar.LENGTH_LONG)
                .make(rootView, mMessage, Snackbar.LENGTH_INDEFINITE)
                .setAction("Action", null)
                .show();

    }

    /************************************ ShowSnackbar without message, KeepItDisplayedOnScreen, OnClickOfOk restrat the activity*****************************/
    public static void showSnakbarTypeThree(View rootView, final Activity activity) {

        Snackbar
                .make(rootView, "NoInternetConnectivity", Snackbar.LENGTH_INDEFINITE)
                .setAction("TryAgain", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = activity.getIntent();
                        activity.finish();
                        activity.startActivity(intent);
                    }
                })
                .setActionTextColor(Color.CYAN)
                .setCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                        super.onDismissed(snackbar, event);
                    }

                    @Override
                    public void onShown(Snackbar snackbar) {
                        super.onShown(snackbar);
                    }
                })
                .show();

    }

    /************************************ ShowSnackbar with message, KeepItDisplayedOnScreen, OnClickOfOk restrat the activity*****************************/
    public static void showSnakbarTypeFour(View rootView, final Activity activity, String mMessage) {

        Snackbar
                .make(rootView, mMessage, Snackbar.LENGTH_INDEFINITE)
                .setAction("TryAgain", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = activity.getIntent();
                        activity.finish();
                        activity.startActivity(intent);
                    }
                })
                .setActionTextColor(Color.CYAN)
                .setCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                        super.onDismissed(snackbar, event);
                    }

                    @Override
                    public void onShown(Snackbar snackbar) {
                        super.onShown(snackbar);
                    }
                })
                .show();

    }
}

【讨论】:

    【解决方案2】:

    将此方法放在您想要显示小吃栏的位置并在该类中传递相应的参数

    protected void displaySnackbar (View view,String s)
        {
            Snackbar snack = Snackbar.make(view, s, Snackbar.LENGTH_LONG);
            View sbview = snack.getView();
            sbview.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
            TextView textView = (TextView) sbview.findViewById(android.support.design.R.id.snackbar_text);
            textView.setTextColor(getResources().getColor(R.color.primary_light));
            snack.show();
        }
    

    【讨论】:

      【解决方案3】:

      您可以将视图和上下文作为方法的参数传递

          protected void displaySnackbar (Context context, View view, String s)
       {
          Snackbar snack = Snackbar.make(view, s, Snackbar.LENGTH_LONG);
          View sbview = snack.getView();
          sbview.setBackgroundColor(context.getColor(this, R.color.colorAccent));
          TextView textView = (TextView) sbview.findViewById(android.support.design.R.id.snackbar_text);
          textView.setTextColor(context.getResources().getColor(R.color.primary_light));
          snack.show();
      }
      

      【讨论】:

      • 问题是:"this" 必须改为"context",这样就可以了,另一件事是当我们将上下文添加到"context.getResources().getColor( R.color.primary_light)" , getColor() 显示为已弃用
      • @JaviMar 也许您应该将 ContextCompat 作为额外参数传递给函数,因为 getColor 方法会提示输入上下文
      【解决方案4】:

      您可以将 Context 和 View 作为参数传递

      protected static void displaySnackbar (View view, Context context,String s) {
       Snackbar snack = Snackbar.make(view.findViewById(android.R.id.content), s, Snackbar.LENGTH_LONG);
          View sbview = snack.getView();
          sbview.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
          TextView textView = (TextView) sbview.findViewById(android.support.design.R.id.snackbar_text);
          textView.setTextColor(context.getResources().getColor(R.color.primary_light));
          snack.show();
      }
      

      【讨论】:

        【解决方案5】:

        感谢大家的灵感。这段代码现在可以工作了:

            protected static void sacaSnackbar (Context context, View view, String s)
        {
            Snackbar snack = Snackbar.make(view, s, Snackbar.LENGTH_LONG);
            View sbview = snack.getView();
            sbview.setBackgroundColor(ContextCompat.getColor(contexto, R.color.colorAccent));
            TextView textView = (TextView) sbview.findViewById(android.support.design.R.id.snackbar_text);
            textView.setTextColor(ContextCompat.getColor(context, R.color.primary_light));
            snack.show();
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-25
          • 2016-03-13
          • 2020-05-18
          • 2018-09-27
          • 1970-01-01
          • 1970-01-01
          • 2020-07-05
          • 1970-01-01
          • 2018-09-13
          相关资源
          最近更新 更多