我正在制作新闻应用程序,我在内部片段中有Gridview,并且在配置更改时我实现了onSaveInstanceState和onRestoreInstanceState .
低于我得到的错误
致命异常:主程序:com.edgar.yodgorbekkomilo.newsapp,PID:5676 java.lang.NullPointerException:尝试在空对象引用上调用虚方法'android.os.Parcelable android.widget.GridView.onSaveInstanceState()' com.edgar.yodgorbekkomilo.newsapp.AllNewsFragmentTab.onCreateView(AllNewsFragmentTab.java:53)在android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)的android.support.v4.app.FragmentManagerImpl.moveToState( FragmentManager.java:1419)在Android.support.v4上有android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740),位于android.support.v4上的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809) .app.BackStackRecord.executeOps(BackStackRecord.java:799)在android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367) )在android.support.v4.app.FragmentManagerImpl.removeRedundantOpera在Android.support的android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:651)的android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2199)上的tionsAndExecute(FragmentManager.java:2322) .v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:167)位于android.support.v4.view.ViewPager.populate(ViewPager.java:1236)的android.support.v4.view.ViewPager.populate(ViewPager.java) :1084)在android.view.measure.View.measure(View.java:22002)的android.sview.View.measure(View.java: . 6580)在android.sview.View.measure的android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:714)android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:786) .java:22002)在Android.widget.FrameLayout.onMeasure(FrameLayout . )的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) . java:185)在android.view.measure.View.measure(View.java:22002)上的android.sview.vs.Widget.ContentChildMaygins(View.java:2200)上的android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)(ViewGroup.java) :6580)android.widget.LinearLayout.measureChildBeforeLayout.Rayout . 在Android.widget.Linear.measureVertical(LinearLayout.java:806)的android.widget.LinearLayout.onMeasure(LinearLayout.java:685) .view.View.measure(View.java:22002)位于android.view.View上的android.view.measureGroup.measureChildMaygins(ViewGroup.java:6580)android.widget.FrameLayout.onMeasure(FrameLayout.java:185) . 在Android.widget.Lineout.measureVertical(LinearLayout.java)的android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)上的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)测量(View.java:22002) :806)在android.view上的android.view.View.measure(View.java:22002)的android.widget.LinearLayout.onMeasure(LinearLayout.java:685) . 在android.view.View的com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)的android.widget.FrameLayout.onMeasure(FrameLayout.java:185)上的ViewGroup.measureChildWithMargins(ViewGroup.java:6580) .measure(View.java:22002)在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)的android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1498)android.view.ViewRootImpl.performTraversals(ViewRootImpl . java:1751)在android.view.ViewRootImpl上的android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)在Android.view.Choreographer $ TraversRecord.run(Choreographer.java :911)在Android.view.Choreographer(Page 4)上的android.view.Chocographer.doCallbacks(Choreographer.java:723),android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:897)在android.os.Handler.handleCallback(Handler.java:789)03-17 20:12:26.358 5676-5676 / com.edgar.yodgorbekkomilo.newsapp E / AndroidRunti我:在android.o.Handler.dispatchMessage(Handler.java:98)的android.app.Looper.loop(Looper.java:164)在android.app.ActivityThread.main(ActivityThread.java:6541)的java . lang.reflect.Method.invoke(Native Method)atcom.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)和我的Fragment下面,我实现了配置更改
公共类AllNewsFragmentTab扩展Fragment {
public ArrayList<News> articleList;
ArrayList<Article> articleArrayList = new ArrayList<>();
public GridView gridView;
private View parentView;
private ArticleAdapter adapter;
Parcelable state;
// ...
//恢复索引和位置
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.all_news_fragment_tab, container, false);
gridView = view.findViewById(R.id.listView);
articleList = new ArrayList<>();
parentView = view.findViewById(R.id.parentLayout);
state = gridView.onSaveInstanceState();
/**
* Getting List and Setting List Adapter
*
*
*/
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Snackbar.make(parentView,articleArrayList.get(position).getStatus()“=>”articleArrayList.get(position).getTotalResults(),Snackbar.LENGTH_LONG) . show(); Intent i = new Intent(getContext(),NewsDetailActivity.class);
i.putExtra("myDataKey", articleArrayList.get(position));
startActivity(i);
}
});
Toast toast = Toast.makeText(getActivity().getApplicationContext(), R.string.string_click_to_load, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
/**
* Checking Internet Connection
*/
if (InternetConnection.checkConnection(getActivity().getApplicationContext())) {
final ProgressDialog dialog;
/**
* Progress Dialog for User Interaction
*/
dialog = new ProgressDialog(getActivity());
dialog.setTitle(getString(R.string.string_getting_json_title));
dialog.setMessage(getString(R.string.string_getting_json_message));
dialog.dismiss();
//Creating an object of our api interface
ApiService api = RetroClient.getApiService();
/**
* Calling JSON
*/
Call<News> call = api.getAllNews();
/**
* Enqueue Callback will be call when get response...
*/
call.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
//Dismiss Dialog
dialog.dismiss();
if (response.isSuccessful()) {
/**
* Got Successfully
*/
// String articleList = String.valueOf(response.body());
News news = response.body();
articleArrayList.addAll(news.getArticles());
/**
* Binding that List to Adapter
*/adapter = new ArticleAdapter(getActivity(), articleArrayList);
gridView.setAdapter(adapter);
if(state != null) {
gridView.onRestoreInstanceState(state);
}
} else {
Snackbar.make(parentView, R.string.string_some_thing_wrong, Snackbar.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
dialog.dismiss();
}
});
} else {
Snackbar.make(parentView, R.string.string_internet_connection_not_available, Snackbar.LENGTH_LONG).show();
}
return view;
}
}
below my all_news_fragment_tab.xml where I have declared my fragment
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="?android:attr/textAppearanceLarge" />
<GridView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</RelativeLayout>