我有FragementPagerAdapter
,有6个片段。我使用newInstance
方法实例化这些片段,传递ID创建参数,然后将其分配给成员变量mBarracksId
。该应用程序加载正常,但一旦我尝试滑过第4个片段,应用程序崩溃,因为mBarracksId
变为空。 onCreateView
是null时首先调用mBarrakacsId
的地方。
代码:
public static BarracksFragment newInstance(String barracksID) {
BarracksFragment fragment = new BarracksFragment();
Bundle args = new Bundle();
args.putString(ARG_BARRACKS_ID, barracksID);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mBarracksID = getArguments().getString(ARG_BARRACKS_ID);
}
}
FragmentPagerAdapter
public Fragment getItem(int position) {
switch (position) {
case 0: {
return BarracksFragment.newInstance("1");
}
case 1: {
return BarracksFragment.newInstance("2");
}
case 2: {
return BarracksFragment.newInstance("3");
}
case 3: {
return BarracksFragment.newInstance("4");
}
case 4: {
return DarkBarracksFragment.newInstance("5", "1");
}
case 5: {
return DarkBarracksFragment.newInstance("6", "2");
}
default: {
return null;
}
}
}
我尝试了什么:
我尝试在onSaveInstanceState
中传递数据,但似乎未在viewPager
中调用,并且生命周期由viewPager
控制。我找不到该生命周期的任何文档。我将日志标记放在各种生命周期方法中,所以我知道什么时候调用,但我无法弄清楚如何将数据传递给onCreateView
方法。
我还尝试从getArguments().getString()
内的onCreateView
再次获取数据,但在mBarracks
为空的实例中它为空。
我还尝试将pagerAdapter设置为setOffscreePageLimit()
各种值,这通常会导致应用立即崩溃。没有价值解决问题
我一直在寻找2天,但无法找到答案来解决这个问题。感谢您的帮助。
错误代码
java.lang.IllegalArgumentException: the bind value at index 1 is null
at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:71)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1400)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1247)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1118)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1286)
at com.clashtoolkit.clashtoolkit.database.ArmyProvider.query(ArmyProvider.java:83)
at android.content.ContentProvider.query(ContentProvider.java:976)
at android.content.ContentProvider$Transport.query(ContentProvider.java:221)
at android.content.ContentResolver.query(ContentResolver.java:499)
at android.content.ContentResolver.query(ContentResolver.java:443)
at com.clashtoolkit.clashtoolkit.UI.BarracksFragment.setInitialBarracksLevel(BarracksFragment.java:184)
at com.clashtoolkit.clashtoolkit.UI.BarracksFragment.onCreateView(BarracksFragment.java:103)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1105)
at android.support.v4.view.ViewPager.populate(ViewPager.java:951)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:250)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:792)
at android.view.Choreographer.doCallbacks(Choreographer.java:596)
at android.view.Choreographer.doFrame(Choreographer.java:556)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:778)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5725)
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:1030)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
抛出异常的行是setInitialBarracksLevel(spinner)
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_barracks, container, false);
Spinner spinner = Utilities.setSingleLevelSpinner(mView, R.id.barracks_level, R.array.level_array_10, getActivity());
spinner.setOnItemSelectedListener(this);
setInitialBarracksLevel(spinner);
return mView;
}
然后在这里使用mBarracksId
:
public void setInitialBarracksLevel(Spinner spinner) {
Cursor cursor = getActivity().getContentResolver().query(ArmyContract.CurrentBarracks.CONTENT_URI,
new String[]{ArmyContract.CurrentBarracks.LEVEL},
"_id=?",
new String[]{mBarracksID},
null);
if (cursor != null && cursor.moveToFirst()) {
if (cursor.getInt(0) > 1) {
spinner.setSelection(cursor.getInt(0) - 1);
}
cursor.close();
}
}
当实际尝试运行查询时,另一行在我的内容提供程序中。