查看传呼机崩溃空指针异常是由于导航回到旧片段 - Android电子 [英] View Pager Crash Null Pointer Exception due to navigating back to the old fragment - Android
问题描述
我使用寻呼机查看页面之间进行导航。我使用FragmentStatePagerAdapter。我可以在一个方向上有任何问题,轻扫。但是,如果我刷回旧之一。它越来越崩溃。我得到空指针异常。
十月3日至12日:20:34.273:E / AndroidRuntime(29035):工艺:com.titlesource.notarymobile,PID:29035
10月3日至12日:20:34.273:E / AndroidRuntime(29035):显示java.lang.NullPointerException
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.Fragment.instantiate(Fragment.java:399)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1790)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.Fragment.performCreate(Fragment.java:1489)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.view.ViewPager.populate(ViewPager.java:914)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.view.ViewPager $ 3.run(ViewPager.java:244)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer.doCallbacks(Choreographer.java:574)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer.doFrame(Choreographer.java:543)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.os.Handler.handleCallback(Handler.java:733)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.os.Handler.dispatchMessage(Handler.java:95)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.os.Looper.loop(Looper.java:136)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.app.ActivityThread.main(ActivityThread.java:5102)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在java.lang.reflect.Method.invokeNative(本机方法)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在java.lang.reflect.Method.invoke(Method.java:515)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在dalvik.system.NativeStart.main(本机方法)
这是我的code:
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_page_view);
mProgressDialog =新ProgressDialog(JobDetailsActivity.this);
mProgressDialog.setMessage(加载);
束束= getIntent()getExtras()。
位置= bundle.getInt(list_posiition_details);
清单<片断>片段= getFragments();
pageAdapter =新MyPageAdapter(getSupportFragmentManager(),片段); 寻呼机=(ViewPager)findViewById(R.id.viewpager);
pager.setAdapter(pageAdapter);
pager.setCurrentItem(位置);
pager.setOffscreenPageLimit(3);
}
公共接口YourFragmentInterface {
无效fragmentBecameVisible();
} 私人列表<片断> getFragments(){
清单<片断> FLIST =新的ArrayList<片断>(); 最终的ArrayList<> TEMP = DataModel.getScheduleList(); 对于(最终obj对象:TEMP){
如果(OBJ的instanceof作业){
字符串=((工作)OBJ).getA();
字符串B = Long.toString(((工作)OBJ).getB());
字符串C =((工作)OBJ).getC();
fList.add(JobDetailsFragment_.newInstance(A,B,C));
mProgressDialog.dismiss();
}
}
返回FLIST;
}
公共类MyPageAdapter扩展FragmentStatePagerAdapter {
私人列表<片断>片段; 公共MyPageAdapter(FragmentManager FM,列表与LT;片断>片段){
超(FM);
this.fragments =片段;
}
@覆盖
公共片段的getItem(INT位置){
返回this.fragments.get(位置);
} @覆盖
公众诠释的getCount(){
返回this.fragments.size();
} @覆盖
公众诠释getItemPosition(Object对象){
返回POSITION_NONE;
} }
下面是我的片段类:
公共类MyFragment扩展片段{
公共静态最后弦乐EXTRA_MESSAGE =EXTRA_MESSAGE;
私有静态视图视图;
/ **
*请注意,这可能是NULL,如果谷歌Play服务APK是不是
*可用。
* /SupportMapFragment mSupportMapFragment;
私人GoogleMap的GoogleMap的;公共静态最终MyFragment的newInstance(字符串消息)
{
MyFragment F =新MyFragment();
集束BDL =新包(1);
bdl.putString(EXTRA_MESSAGE,消息);
f.setArguments(BDL);
返回F;
}
//浏览视图。@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
捆绑savedInstanceState){
。字符串消息= getArguments()的getString(EXTRA_MESSAGE); 如果(查看!= NULL){
ViewGroup中父=(ViewGroup中)view.getParent();
如果(父!= NULL)
parent.removeView(视图);
}
尝试{
鉴于= inflater.inflate(R.layout.myfragment_layout,集装箱,FALSE);
TextView的messageTextView =(TextView中)view.findViewById(R.id.textView);
messageTextView.setText(消息);
}赶上(InflateException E){
/ *地图已经存在,只是返回看法,因为它是* /
}//视图V = inflater.inflate(R.layout.myfragment_layout,集装箱,FALSE);
返回视图。
}
@覆盖
公共无效onActivityCreated(捆绑savedInstanceState){
super.onActivityCreated(savedInstanceState);
FragmentManager FM = getChildFragmentManager();
mSupportMapFragment =(SupportMapFragment)fm.findFragmentById(R.id.location_map);
如果(mSupportMapFragment == NULL){
mSupportMapFragment = SupportMapFragment.newInstance();
fm.beginTransaction()取代(R.id.location_map,mSupportMapFragment).commit()。
}
}@覆盖
公共无效onResume(){
super.onResume();
如果(GoogleMap的== NULL){
GoogleMap的= mSupportMapFragment.getMap();
googleMap.addMarker(。新的MarkerOptions()位置(经纬度新(0,0)));
}
}}
我找到了解决办法。
其因FragmentStatePagerAdapter的发生。在片段,我们需要分离getChildFragmentManager。
因此,我们需要activityCreated()后添加以下code
@覆盖
公共无效onDetach(){
super.onDetach();
尝试{
现场childFragmentManager = Fragment.class.getDeclaredField(mChildFragmentManager);
childFragmentManager.setAccessible(真);
childFragmentManager.set(这一点,空);
}赶上(NoSuchFieldException E){
抛出新的RuntimeException(E);
}赶上(IllegalAccessException E){
抛出新的RuntimeException(E);
}
}
I am using view pager for navigating between pages. I am using FragmentStatePagerAdapter. I can swipe in one direction with out any problems. But if i swipe back to the older one. Its getting crash. I am getting null pointer exception.
03-12 10:20:34.273: E/AndroidRuntime(29035): Process: com.titlesource.notarymobile, PID: 29035
03-12 10:20:34.273: E/AndroidRuntime(29035): java.lang.NullPointerException
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.Fragment.instantiate(Fragment.java:399)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1790)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.Fragment.performCreate(Fragment.java:1489)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.view.Choreographer.doFrame(Choreographer.java:543)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.os.Handler.handleCallback(Handler.java:733)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.os.Handler.dispatchMessage(Handler.java:95)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.os.Looper.loop(Looper.java:136)
03-12 10:20:34.273: E/AndroidRuntime(29035): at android.app.ActivityThread.main(ActivityThread.java:5102)
03-12 10:20:34.273: E/AndroidRuntime(29035): at java.lang.reflect.Method.invokeNative(Native Method)
03-12 10:20:34.273: E/AndroidRuntime(29035): at java.lang.reflect.Method.invoke(Method.java:515)
03-12 10:20:34.273: E/AndroidRuntime(29035): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-12 10:20:34.273: E/AndroidRuntime(29035): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-12 10:20:34.273: E/AndroidRuntime(29035): at dalvik.system.NativeStart.main(Native Method)
And here is my Code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_page_view);
mProgressDialog = new ProgressDialog(JobDetailsActivity.this);
mProgressDialog.setMessage("Loading");
Bundle bundle = getIntent().getExtras();
position = bundle.getInt("list_posiition_details");
List<Fragment> fragments = getFragments();
pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);
pager = (ViewPager)findViewById(R.id.viewpager);
pager.setAdapter(pageAdapter);
pager.setCurrentItem(position);
pager.setOffscreenPageLimit(3);
}
public interface YourFragmentInterface {
void fragmentBecameVisible();
}
private List<Fragment> getFragments(){
List<Fragment> fList = new ArrayList<Fragment>();
final ArrayList<?> temp = DataModel.getScheduleList();
for (final Object obj : temp) {
if(obj instanceof Job) {
String a = ((Job) obj).getA();
String b = Long.toString(((Job) obj).getB());
String c = ((Job) obj).getC();
fList.add(JobDetailsFragment_.newInstance(a, b, c));
mProgressDialog.dismiss();
}
}
return fList;
}
public class MyPageAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragments;
public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
Here is my Fragment class:
public class MyFragment extends Fragment {
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
private static View view;
/**
* Note that this may be null if the Google Play services APK is not
* available.
*/
SupportMapFragment mSupportMapFragment;
private GoogleMap googleMap;
public static final MyFragment newInstance(String message)
{
MyFragment f = new MyFragment();
Bundle bdl = new Bundle(1);
bdl.putString(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}
// View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String message = getArguments().getString(EXTRA_MESSAGE);
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.myfragment_layout, container, false);
TextView messageTextView = (TextView)view.findViewById(R.id.textView);
messageTextView.setText(message);
} catch (InflateException e) {
/* map is already there, just return view as it is */
}
// View v = inflater.inflate(R.layout.myfragment_layout, container, false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
mSupportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.location_map);
if (mSupportMapFragment == null) {
mSupportMapFragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.location_map, mSupportMapFragment).commit();
}
}
@Override
public void onResume() {
super.onResume();
if (googleMap == null) {
googleMap = mSupportMapFragment.getMap();
googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)));
}
}
}
I found the solution.
Its happening because of FragmentStatePagerAdapter. In the fragment we need to detach the getChildFragmentManager.
So we need to add the below code after activityCreated()
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
这篇关于查看传呼机崩溃空指针异常是由于导航回到旧片段 - Android电子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!