Activity启动时如何显示Snackbar?


98

我想Snackbar (android.support.design.widget.Snackbar)在活动开始时显示android ,就像我们显示一样Toast

但是问题是我们在创建Snackbar像这样的时候必须指定父布局:

Snackbar.make(parentlayout, "This is main activity", Snackbar.LENGTH_LONG)
            .setAction("CLOSE", new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            })
            .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
            .show();

当我们Snackbar在活动开始时显示没有任何点击事件的情况下,如何给出父级布局(如果是点击事件,我们可以轻松地传递父级视图)?


1
onetouchcode.com/2016/12/24/use-snackbar-android-apps上写了一篇文章,这将有助于您了解Snackbar的更多详细信息
Shailendra

Answers:


211

只需指向XML View内部的任何内容即可Activity's。例如,您可以为根viewGroup指定一个ID,并使用:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);    
   setContentView(R.layout.main_activity);
   View parentLayout = findViewById(android.R.id.content);
   Snackbar.make(parentLayout, "This is main activity", Snackbar.LENGTH_LONG) 
        .setAction("CLOSE", new View.OnClickListener() {
            @Override 
            public void onClick(View view) {

            } 
        }) 
        .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
        .show(); 
   //Other stuff in OnCreate();
}

57
对于根视图,通常也可以findViewById(android.R.id.content)按此处指示的那样使用stackoverflow.com/a/4488149/1518546
John Cummings

查看parentLayout = findViewById(R.id.root_view); 在5.0或更低版本中引发nullpointer异常。如何解决这个问题呢 ?
Anand Savjani 2015年

1
@AnandSavjani对于5.0和5.0以下的版本,代码与我完全兼容,在您的布局(root_view)中一定存在错误。如果使用片段,则应编写rootview.findViewById(R.id.your_parent_view); 并且也不要提供与布局名称相同的ID。
Sudheesh Mohan

我相信,如果您未将CoordinatorLayout用作根,则会抛出NullpointerException。
伊桑(Ishaan)2016年

不要忘了包括支持设计库:'com.android.support:design:27.0.0'–
Nikola,

27

到目前为止,我一直无法展示Snackbar。这是显示快餐栏的最简单方法。要将其显示为主要活动开始,只需将这两行放在您的OnCreate()

    Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Welcome To Main Activity", Snackbar.LENGTH_LONG);
    snackbar.show();

PS:只要确保您已导入Android Design支持即可(如问题中所述)。

对于科特林,

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()

8

试试这个

Snackbar.make(findViewById(android.R.id.content), "Got the Result", Snackbar.LENGTH_LONG)
                        .setAction("Submit", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();

3

在onCreate上调用此方法

Snackbar snack = Snackbar.make(
                    (((Activity) context).findViewById(android.R.id.content)),
                    message + "", Snackbar.LENGTH_SHORT);
snack.setDuration(Snackbar.LENGTH_INDEFINITE);//change Duration as you need
            //snack.setAction(actionButton, new View.OnClickListener());//add your own listener
            View view = snack.getView();
            TextView tv = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_text);
            tv.setTextColor(Color.WHITE);//change textColor

            TextView tvAction = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_action);
            tvAction.setTextSize(16);
            tvAction.setTextColor(Color.WHITE);

            snack.show();

2

显示小吃店的工具功能

fun showSnackBar(activity: Activity, message: String, action: String? = null,
    actionListener: View.OnClickListener? = null, duration: Int = Snackbar.LENGTH_SHORT) {
    val snackBar = Snackbar.make(activity.findViewById(android.R.id.content), message, duration)
        .setBackgroundColor(Color.parseColor("#CC000000")) // todo update your color
        .setTextColor(Color.WHITE)
    if (action != null && actionListener!=null) {
        snackBar.setAction(action, actionListener)
    }
    snackBar.show()
}

在Activity中使用的示例

  showSnackBar(this, "No internet")
  showSnackBar(this, "No internet", duration = Snackbar.LENGTH_LONG)
  showSnackBar(activity, "No internet", "OK", View.OnClickListener { 
       // handle click 
  })

在片段中使用的示例

  showSnackBar(getActivity(), "No internet")

希望对你有帮助



1

只需在onCreate中使用以下代码即可完成此操作。通过使用android的默认布局

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();

在Android版本5.x上-突然getWindow().getDecorView()返回所有屏幕,包括“底部按钮”(例如主页,后退等)。所以我的零食正显示在此按钮上,而不是在应用程序中显示
alena_fox_spb

检查更新的答案。它将解决您的问题。使用Android的默认布局
Jarin岩

是的,当我从全部更改windowandroid.R.id.content开始工作时。因此,我写了我的评论以解决将来
遇到的

0

您还可以为所有活动定义一个超类,并在父活动中找到一次视图。

例如

AppActivity.java:

public class AppActivity extends AppCompatActivity {

    protected View content;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        changeLanguage("fa");
        content = findViewById(android.R.id.content);
    }
}

并且您的零食在应用程序的每个活动中都将如下所示:

Snackbar.make(content, "hello every body", Snackbar.LENGTH_SHORT).show();

为了提高性能,您必须为每个活动找到一次视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.