【问题标题】:SwipeRefreshLayout -Attempt to invoke virtual method on a null object referenceSwipeRefreshLayout - 尝试在空对象引用上调用虚拟方法
【发布时间】:2015-06-26 13:46:42
【问题描述】:

我尝试使用 SwipeRefreshLayout 下拉刷新他的内容来实现 ListFragment

我的代码是

 public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SwipeRefreshLayout srl = (SwipeRefreshLayout) view.findViewById(R.id.srl);
    srl.setOnRefreshListener(this);
}

我的 XML 是

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/srl"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

但我总是得到错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.widget.SwipeRefreshLayout.setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout$OnRefreshListener)' on a null object reference
        at info.androidhive.slidingmenu.fragments.EventsOverview_pull.onViewCreated(EventsOverview_pull.java:32)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:961)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

看起来 view.findViewById(R.id.srl) 返回 null。

有人有想法怎么了?

编辑:

我的 OnCrateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    View rootView = inflater.inflate(R.layout.pulldown, container, false);


    return rootView;
}

现在我得到这个错误

java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
        at android.support.v4.app.ListFragment.ensureList(ListFragment.java:344)
        at android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145)
        at info.androidhive.slidingmenu.fragments.EventsOverview_pull.onViewCreated(EventsOverview_pull.java:29)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:961)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

【问题讨论】:

  • 清理你的项目并重建一切。如果一切在源代码级别看起来都正确,那么编译的内容可能不同步。
  • 发布您的oncreateView
  • 如果你真的在使用ListFragment,那么你的ListView必须有id android.R.id.list。其次,您必须在 onCreateView 中充气并返回您的自定义布局。
  • 在布局 xml 文件中将 listview id 更改为 android:id="@android:id/list"
  • 异常说明了一切:Your content must have a ListView whose id attribute is 'android.R.id.list'

标签: java android android-listfragment swiperefreshlayout


【解决方案1】:

不要使用 SwipeRefreshLayout 作为父布局。它会起作用的。 像这样使用它

  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/srl"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >

  <android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/srl"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

它对我有用。 快乐编码:)

【讨论】:

    【解决方案2】:

    尝试将代码放入onActivityCreated(...) 而不是onViewCreated(..)

    【讨论】:

    • 一些解释会有所帮助
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2019-05-10
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多