将Snackbar放置在实用程序类中

3

我经常使用这种方法来显示 Snackbar 消息,并使用应用中使用的颜色。因此,我想将该方法设置为静态方法,并将其放置在一个实用程序的最终类中,以便我可以在任何地方使用它,而不必每次都重复编写代码。

但是,这样做会有一个问题,即 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 不同吗? - Giorgio Antonioli
5个回答

3
将此方法放在您想要显示snackbar的位置,并在该类中传递相应的参数。
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();
    }

2
你可以使用这段代码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();

    }
}

1
你可以将视图和上下文作为参数传递给该方法。
    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
@JaviMar也许你应该将ContextCompat作为额外参数传递给函数,因为getColor方法需要上下文提示。 - SaravInfern

0

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

0

感谢大家的启发.. 这段代码现在可以运行了:

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

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