【问题标题】:Snackbar crashes with NullPointerException when using programatically created View使用以编程方式创建的视图时,Snackbar 崩溃并出现 NullPointerException
【发布时间】:2023-03-25 02:27:01
【问题描述】:

我知道它适用于来自 XML 的任何类型的视图,但为什么在使用以编程方式创建的视图时它不起作用?

这是我的代码:

TextView tv = new TextView(getApplicationContext());
Snackbar snackbar = Snackbar.make(tv, "Welcome to AndroidHive", Snackbar.LENGTH_LONG);
snackbar.show();

这是我的错误:

*Process: com.cloudents.mysnackbar, PID: 9924
java.lang.NullPointerException
    at android.support.design.widget.Snackbar.<init>(Snackbar.java:180)
    at android.support.design.widget.Snackbar.make(Snackbar.java:206)
    at com.cloudents.mysnackbar.MainActivity$2.onClick(MainActivity.java:39)
    at android.view.View.performClick(View.java:4442)
    at android.view.View$PerformClick.run(View.java:18473)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5105)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    at dalvik.system.NativeStart.main(Native Method)*

【问题讨论】:

  • 您传递给Snackbar 的View 需要附加到屏幕上的层次结构。我想当它试图找到其父母的父母时,它会抛出 NPE。

标签: android android-snackbar


【解决方案1】:

您不能使用TextView,只是实例化以显示SnackBar。它需要的是提交的View 的合适的父级。如果您没有或不确定是哪一张,请直接使用android.R.id.content,

例如

Snackbar.make(findViewById(android.R.id.content), "Welcome to AndroidHive", Snackbar.LENGTH_LONG).show();

【讨论】:

  • 谢谢您,只是为了让其他用户清楚代码应该如下所示:
【解决方案2】:

是的,当然可以,如果在您尝试显示您的Snackbar 之前将动态创建的TextView 添加到您的Layout,就像这里一样,

TextView tv = new TextView(getApplicationContext());
        tv.setText("Button");
        tv.setId(5);
 ((LinearLayout) findViewById(R.id.myLinearLayout)).addView(tv);

那么你就可以轻松做到了,

Snackbar snackbar = Snackbar.make(tv, "Welcome to AndroidHive", Snackbar.LENGTH_LONG);
        snackbar.show();

Snackbar 将会出现。

【讨论】:

    【解决方案3】:

    中的视图:

    Snackbar snackbar = Snackbar.make(view, "Welcome to AndroidHive",Snackbar.LENGTH_LONG);
    snackbar.show();
    

    是你想要添加snackbar 视图的视图,它不是snackbar 本身,所以就像上面提到的@Blackbelt,如果你只想将snackbar 添加到活动中,请使用findViewById(android.R.id.内容)另一方面,如果您想修改快餐栏视图本身中的一些内容,看起来像:

    Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Welcome to AndroidHive",Snackbar.LENGTH_LONG);
    
    View snackbarView = snackbar.getView()
    TextView snackTextView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
    snackTextView.setTextColor(CUSTOMCOLOR);
    // modify anything you want in the view here
    snackbar.show();
    

    此外,我想建议您在主布局中添加一个 coordinatorlayout 并向其中添加小吃栏,以便用户能够滑动以关闭小吃栏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多