将 snackbar 放入 Utility class

Place snackbar in a Utility class

我经常使用这种方法来使用应用程序中使用的颜色显示快餐栏消息。出于这个原因,我想使该方法成为静态方法并将其放在实用程序的最终 class 中,这样我就可以在所有地方使用它而不必每次都重复它。

然而,这有一个问题,即 findViewByIdgetResources().getColor 等。需要一个 activity 到 "live in" 并且也不能是静态的。

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

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

您可以将 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();
}

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

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

您可以使用此代码gist

发布代码以防 link 出现故障

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

    }
}

感谢大家的启发。此代码现在有效:

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

将此方法放在您想要显示快餐栏的位置,并在其中传递相应的参数 class

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