【问题标题】:How to show Snackbar when Activity starts?Activity 启动时如何显示 Snackbar?
【发布时间】:2015-09-07 19:35:39
【问题描述】:

我想在活动开始时显示 android Snackbar (android.support.design.widget.Snackbar),就像我们显示 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而没有任何点击事件时如何给父布局(如果它是一个点击事件,我们可以轻松地传递父视图)?

【问题讨论】:

标签: android material-design android-snackbar


【解决方案1】:

只需指向Activity's XML 中的任何View。例如,您可以为根 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();
}

【讨论】:

  • 对于根视图,您一般也可以使用findViewById(android.R.id.content),如这里所示stackoverflow.com/a/4488149/1518546
  • 查看 parentLayout = findViewById(R.id.root_view);在 5.0 或更低版本中抛出空指针异常。如何解决这个问题?
  • @AnandSavjani 该代码在 5.0 和 5.0 以下版本中与我完美配合,您的布局(root_view)中一定有一些错误。如果您使用的是片段,您应该编写 rootview.findViewById(R.id.your_parent_view);并且不要给出与布局名称相同的 id。
  • 如果你不使用 CoordinatorLayout 作为根,我相信它会抛出 NullpointerException。
  • 不要忘记包含支持设计库:'com.android.support:design:27.0.0'
【解决方案2】:

到目前为止,我在显示 Snackbar 时遇到了麻烦。 这是显示 Snackbar 的最简单方法。要将其显示为您的 Main Activity Starts,只需将这两行放在您的 OnCreate() 中即可

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

附:只需确保您已导入 Android 设计支持。(如问题中所述)。

对于 Kotlin,

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

【讨论】:

    【解决方案3】:

    试试这个

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        显示小吃店的实用程序函数

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

        在 Fragment 中使用的示例

          showSnackBar(getActivity(), "No internet")
        

        希望对你有帮助

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 在 android 版本 5.x 上 - 突然 getWindow().getDecorView() 返回所有屏幕,包括“底部按钮”(如主页、返回等)。所以我的零食显示在这个按钮上,而不是在应用程序中
          • 检查更新的答案。它会解决你的问题。使用android的默认布局
          • 是的,当我从window 更改为android.R.id.content 时,都开始工作了。所以我写了我的评论来解决其他人的问题)
          【解决方案7】:

          你可以试试这个库。这是 android 默认快餐栏的包装器。 https://github.com/ChathuraHettiarachchi/CSnackBar

          Snackbar.with(this,null)
              .type(Type.SUCCESS)
              .message("Profile updated successfully!")
              .duration(Duration.SHORT)
              .show();
          

          这包含多种类型的snackbar,甚至还有一个customview 集成的snackbar

          【讨论】:

            【解决方案8】:

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

            例如

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

            最好为每个活动找到一次视图。

            【讨论】:

              【解决方案9】:

              显示一些文本的简单方法:

              Snackbar.make(view, "Sample Text", Snackbar.LENGTH_SHORT).show();
              

              并用按钮显示文本:

              Snackbar.make(view, "Sample Text", Snackbar.LENGTH_SHORT).setAction("Ok", new View.OnClickListener() {
                          @Override 
                          public void onClick(View view) {
              
                          } 
                      }).show();
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-03-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-08
                • 1970-01-01
                相关资源
                最近更新 更多