14

我想在我的应用程序中添加一个基本的小吃店,但我收到了一个我无法弄清楚原因的错误。

我在 Fragment 的 onCreateView() 方法中添加了这段代码。

Snackbar.make(view, "Snackbar", Snackbar.LENGTH_LONG)
            .setAction("Action", null).show();

并收到此错误:

06-01 10:26:09.955    1232-1232/? E/ActivityThread﹕ Failed to find provider  info for me.muraterdogan.watchme.MetricaContentProvider
06-01 10:26:10.075    1232-1447/? E/ActivityThread﹕ Failed to find provider info for me.muraterdogan.watchme.YPLContentProvider
06-01 10:33:55.044    6646-6646/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: me.muraterdogan.watchme, PID: 6646
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.view.ViewGroup.getContext()' on a null object reference
        at android.support.design.widget.Snackbar.<init>(Snackbar.java:116)
        at android.support.design.widget.Snackbar.make(Snackbar.java:140)
        at me.muraterdogan.watchme.fragments.TrendingFragment.GetData(TrendingFragment.java:90)
        at me.muraterdogan.watchme.fragments.TrendingFragment.onCreateView(TrendingFragment.java:83)
...
4

6 回答 6

19

如果您的 Fragment 被添加到现有的活动中(记住您可以通过 xml 添加它),您应该将 SnackBar 的方法调用到 Fragment 的 onActivityCreated() 方法中。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Snackbar.make(view, "Snackbar", Snackbar.LENGTH_LONG)
        .setAction("Action", null).show();
}
于 2015-07-14T15:22:37.733 回答
13

1.将其移至 onActivityCreated 方法。

2.尝试在make方法中使用getView(),如下所示:

Snackbar.make(getView(), "Snackbar", Snackbar.LENGTH_LONG)
        .setAction("Action", null).show();
于 2015-10-09T06:11:08.113 回答
3

在我正在处理的代码库Snackbar中,异步方法回调中显示了 s,例如网络调用的错误处理程序。Snackbar制作时,Fragment将不再附加它View,并且返回的它在视图的层次结构中getView()没有CoordinatorLayoutFrameLayout Snackbar不想拥有。

特别是,它是遍历层次结构的私有findSuitableParent()方法Snackbar

private static ViewGroup findSuitableParent(View view) {
    ViewGroup fallback = null;
    do {
        if (view instanceof CoordinatorLayout) {
            // We've found a CoordinatorLayout, use it
            return (ViewGroup) view;
        } else if (view instanceof FrameLayout) {
            if (view.getId() == android.R.id.content) {
                // If we've hit the decor content view, then we didn't find a CoL in the
                // hierarchy, so use it.
                return (ViewGroup) view;
            } else {
                // It's not the content view but we'll use it as our fallback
                fallback = (ViewGroup) view;
            }
        }

        if (view != null) {
            // Else, we will loop and crawl up the view hierarchy and try to find a parent
            final ViewParent parent = view.getParent();
            view = parent instanceof View ? (View) parent : null;
        }
    } while (view != null);

    // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
    return fallback;
}

此方法的结果将传递给Snackbar调用getContext()它的构造函数,如果此方法返回null,您将获得问题中所见的 NPE。

有几种方法可以解决这个问题,假设在附加的片段中有一个CoordinatorLayout或的快乐情况FrameLayout仍然成立:

  1. 首先检查确保您的片段没有分离isDetached()

  2. 我自己最终做了什么:代码库中已经有一个Builder 模式样式包装器Snackbar,所以我在 builder 中分叉了,并在尝试调用之前findSuitableParent()添加了一个检查以查看它是否返回。这样 Snackbar 构建器调用者就不必添加任何额外的检查。!= nullSnackbar.make()

于 2016-09-09T12:57:51.150 回答
2

通过过程,小吃店搜索视图。

  • 您使用了片段视图
  • 但是片段视图本身尚未附加,因为尚未调用片段的 onAttach。

因此,在运行时,应用程序本身并不真正知道您实际上指的是片段的视图。

尝试将您的snackbar show 方法放在片段的“onResume”中。希望这可以帮助。

于 2016-02-02T01:03:04.297 回答
1

你为什么在 onCreate 中这样做?

此外,请确保您遵循以下几条规则:

  1. 确保您的主 Activity 继承自 AppCompatActivity,因为这是使用 Support 库所必需的。
  2. 确保您传递的视图确实存在(这就是为什么我要问您为什么在 onCreate 中这样做,为什么不在之后?)
于 2015-06-24T19:55:37.070 回答
0

正如文档所说,“Snackbar 将尝试找到一个父视图来保存 Snackbar 的视图,而不是赋予视图的值”。

因此,您可以传递当前附加的任何视图。

于 2016-05-03T00:08:30.813 回答