尝试刷新片段给我 NullPointerException;我确保兼容性不是问题,我的片段不应该为空
Attempt to refresh fragment gives me NullPointerException; I've made sure compatibility isn't an issue, and my fragments shouldn't be null
我目前正在尝试在我的 android 项目中实现代码,我的片段将在按下按钮后刷新,重新创建视图并显示不同的项目。我确保 android.app 和 android.support.v4.app 之间没有兼容性问题,并且确信我的片段 ID 标记正确。
这是我在模拟器上 运行 我的应用程序时收到的确切错误:
java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:722)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这里是导致 class 问题的 java 代码:
package edu.sbu.cs.android.NMR.core;
import edu.sbu.cs.android.NMR.core.ImageAdapter;
import edu.sbu.cs.android.R;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class HomeFragment extends Fragment {
public interface OnSelectedListener {
public void onSelected();
}
OnSelectedListener mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
GridView gridview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
gridview = (GridView)rootView.findViewById(R.id.gridView1);
gridview.setAdapter(new ImageAdapter(gridview.getContext()));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
((MainActivity) getActivity()).setProblem(position);
switch (position) {
case 0:
SpectraFragment.w.loadUrl("file:///android_asset/nmr0.html");
getArguments().putString("problem", "0");
FragmentManager fragMan;
fragMan = getFragmentManager();
Fragment frg= fragMan.findFragmentById(R.layout.fragment_spectra);
Fragment frg2 = fragMan.findFragmentById(R.layout.fragment_questions);
final FragmentTransaction ft = fragMan.beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.detach(frg2);
ft.attach(frg2);
ft.commit();
case 1:
SpectraFragment.w.loadUrl("file:///android_asset/nmr1.html");
getArguments().putString("problem", "1");
fragMan = getFragmentManager();
frg = fragMan.findFragmentById(R.layout.fragment_spectra);
frg2 = fragMan.findFragmentById(R.layout.fragment_questions);
final FragmentTransaction ft2 = fragMan.beginTransaction();
ft2.detach(frg);
ft2.attach(frg);
ft2.detach(frg2);
ft2.attach(frg2);
ft2.commit();
case 2:
SpectraFragment.w.loadUrl("file:///android_asset/nmr2.html");
getArguments().putString("problem", "2");
fragMan = getFragmentManager();
frg = fragMan.findFragmentById(R.layout.fragment_spectra);
frg2 = fragMan.findFragmentById(R.layout.fragment_questions);
final FragmentTransaction ft3 = fragMan.beginTransaction();
ft3.detach(frg);
ft3.attach(frg);
ft3.detach(frg2);
ft3.attach(frg2);
ft3.commit();
default:
SpectraFragment.w.loadUrl("file:///android_asset/nmr0.html");
}
Toast.makeText(getActivity(), " " + position, Toast.LENGTH_SHORT).show();
}
});
return rootView;
}
}
之前有没有人遇到过这个问题不是因为 android.support.v4.app 和 android.app 之间的兼容性问题,或者我在我的代码中遗漏了一点我正在创建一个空对象引用?我已经在这些论坛上搜索了数周,并尝试了我能想到的所有解决方案。我什至在我的 MainActivity 中关闭了 ActionBar 选项卡以使用 material 设计 SlidingTabLayout 来解决兼容性问题,但它什么也没做。我很沮丧为什么我的代码不会,虽然我已经使用 android 一年了,但仍然有一些我不太理解的东西,尽管我已经制作了一个不同的应用程序工作正常。这个有点复杂,交给我去做,所以我还在弄清楚其中的一些是如何工作的。很抱歉发脾气了,但我在这个问题上被困了一段时间,似乎走到了死胡同。有人有解决办法吗?
此外,我正在使用 android studio 开发我的应用程序,如果这对解决问题有任何影响的话,但我之前一直在使用 eclipse 并已将项目转移过来。
问题是您在可能扩展 android.app.Fragment
的片段上使用 android.support.v4.app.FragmentTransaction
您必须使用 android.app.FragmentTransaction
和 android.app.Fragment
并且您必须使用 android.support.v4.app.FragmentTransaction
进行涉及 android.app.v4.app.Fragment
的交易
你不能把两者混为一谈。修复它的方法只是将有问题的片段改为扩展 android.support.v4.app.Fragment
。
更新:
在 switch
声明中,您缺少关于您的案例的 break;
声明。
看一眼 BackStackRecord
的 source code 的第 722 行表明您使用空片段调用了 FragmentTransaction.detach()
。您对 findFragmentById()
的调用之一可能返回空值。要找出是哪一个,请检查每个调用的结果并记录调试消息(如果为空)。
错误清楚地向您表明它是对空对象引用起作用的,这意味着该片段中没有具有相应 ID 的片段 manager.Try getChildFragmentManager() 或 getParentFragment() 对我有用。
我目前正在尝试在我的 android 项目中实现代码,我的片段将在按下按钮后刷新,重新创建视图并显示不同的项目。我确保 android.app 和 android.support.v4.app 之间没有兼容性问题,并且确信我的片段 ID 标记正确。
这是我在模拟器上 运行 我的应用程序时收到的确切错误:
java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:722)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这里是导致 class 问题的 java 代码:
package edu.sbu.cs.android.NMR.core;
import edu.sbu.cs.android.NMR.core.ImageAdapter;
import edu.sbu.cs.android.R;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class HomeFragment extends Fragment {
public interface OnSelectedListener {
public void onSelected();
}
OnSelectedListener mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
GridView gridview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
gridview = (GridView)rootView.findViewById(R.id.gridView1);
gridview.setAdapter(new ImageAdapter(gridview.getContext()));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
((MainActivity) getActivity()).setProblem(position);
switch (position) {
case 0:
SpectraFragment.w.loadUrl("file:///android_asset/nmr0.html");
getArguments().putString("problem", "0");
FragmentManager fragMan;
fragMan = getFragmentManager();
Fragment frg= fragMan.findFragmentById(R.layout.fragment_spectra);
Fragment frg2 = fragMan.findFragmentById(R.layout.fragment_questions);
final FragmentTransaction ft = fragMan.beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.detach(frg2);
ft.attach(frg2);
ft.commit();
case 1:
SpectraFragment.w.loadUrl("file:///android_asset/nmr1.html");
getArguments().putString("problem", "1");
fragMan = getFragmentManager();
frg = fragMan.findFragmentById(R.layout.fragment_spectra);
frg2 = fragMan.findFragmentById(R.layout.fragment_questions);
final FragmentTransaction ft2 = fragMan.beginTransaction();
ft2.detach(frg);
ft2.attach(frg);
ft2.detach(frg2);
ft2.attach(frg2);
ft2.commit();
case 2:
SpectraFragment.w.loadUrl("file:///android_asset/nmr2.html");
getArguments().putString("problem", "2");
fragMan = getFragmentManager();
frg = fragMan.findFragmentById(R.layout.fragment_spectra);
frg2 = fragMan.findFragmentById(R.layout.fragment_questions);
final FragmentTransaction ft3 = fragMan.beginTransaction();
ft3.detach(frg);
ft3.attach(frg);
ft3.detach(frg2);
ft3.attach(frg2);
ft3.commit();
default:
SpectraFragment.w.loadUrl("file:///android_asset/nmr0.html");
}
Toast.makeText(getActivity(), " " + position, Toast.LENGTH_SHORT).show();
}
});
return rootView;
}
}
之前有没有人遇到过这个问题不是因为 android.support.v4.app 和 android.app 之间的兼容性问题,或者我在我的代码中遗漏了一点我正在创建一个空对象引用?我已经在这些论坛上搜索了数周,并尝试了我能想到的所有解决方案。我什至在我的 MainActivity 中关闭了 ActionBar 选项卡以使用 material 设计 SlidingTabLayout 来解决兼容性问题,但它什么也没做。我很沮丧为什么我的代码不会,虽然我已经使用 android 一年了,但仍然有一些我不太理解的东西,尽管我已经制作了一个不同的应用程序工作正常。这个有点复杂,交给我去做,所以我还在弄清楚其中的一些是如何工作的。很抱歉发脾气了,但我在这个问题上被困了一段时间,似乎走到了死胡同。有人有解决办法吗?
此外,我正在使用 android studio 开发我的应用程序,如果这对解决问题有任何影响的话,但我之前一直在使用 eclipse 并已将项目转移过来。
问题是您在可能扩展 android.app.Fragment
android.support.v4.app.FragmentTransaction
您必须使用 android.app.FragmentTransaction
和 android.app.Fragment
并且您必须使用 android.support.v4.app.FragmentTransaction
进行涉及 android.app.v4.app.Fragment
你不能把两者混为一谈。修复它的方法只是将有问题的片段改为扩展 android.support.v4.app.Fragment
。
更新:
在 switch
声明中,您缺少关于您的案例的 break;
声明。
看一眼 BackStackRecord
的 source code 的第 722 行表明您使用空片段调用了 FragmentTransaction.detach()
。您对 findFragmentById()
的调用之一可能返回空值。要找出是哪一个,请检查每个调用的结果并记录调试消息(如果为空)。
错误清楚地向您表明它是对空对象引用起作用的,这意味着该片段中没有具有相应 ID 的片段 manager.Try getChildFragmentManager() 或 getParentFragment() 对我有用。