が実行されたViewPager
後に入力される を使用してアクティビティを作成しました。AsyncTask
それぞれTestDataObject
が関連する に関連付けられていますTestFragment
。NullPointerException
画面を回転させると、内部onCreateView
メソッドによりアプリケーションがクラッシュします。これはViewPager
/AdapteronSaveInstanceState
メソッドが原因で、データがまだ利用できない場合onCreateView
に、データのロード前にデータを復元しようとするためだと思います。AsyncTask
私はif
onCreateViewコードだけでできましたが、ViewPager内のフラグメントの量が異なる可能性があるため、不要な仕事をする可能性があるため、正しい解決策のようには感じません.変更されたviewpagerコンテンツを復元してから、最初のものに置き換えます この場合、onSaveInstanceState は非常に有害なようです。おそらく、ViewPager または Adapter を拡張して、保存手順をキャンセルすることもできます。これも奇妙だと思います。
提供するより良い提案はありますか?
public class MainActivity extends LoggerActivity {
private ArrayList<TestDataObject> mDataObjects = new ArrayList<MainActivity.TestDataObject>();
private ViewPager mViewPager;
private TestFragmentAdapter mViewPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPagerAdapter = new TestFragmentAdapter(
getSupportFragmentManager(), mDataObjects);
mViewPager.setAdapter(mViewPagerAdapter);
new TestAsyncTask().execute();
}
private class TestAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
mDataObjects.add(new TestDataObject());
mDataObjects.add(new TestDataObject());
mDataObjects.add(new TestDataObject());
mViewPagerAdapter.notifyDataSetChanged();
}
}
public static class TestFragment extends Fragment {
private TestDataObject mDataObject;
public static TestFragment getInstance(TestDataObject obj) {
TestFragment f = new TestFragment();
f.mDataObject = obj;
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// layout.find...
mDataObject.toString();
return inflater.inflate(R.layout.fragment_test, null, false);
}
}
public static class TestFragmentAdapter extends FragmentStatePagerAdapter {
private List<TestDataObject> mDataObjects;
public TestFragmentAdapter(FragmentManager fm, List<TestDataObject> objs) {
super(fm);
mDataObjects = objs;
}
@Override
public Fragment getItem(int position) {
return TestFragment.getInstance(mDataObjects.get(position));
}
@Override
public int getCount() {
return mDataObjects == null ? 0 : mDataObjects.size();
}
}
public static class TestDataObject {
}
}