实例变量在ViewPager中不可用

时间:2015-10-08 15:10:31

标签: android fragmentpageradapter

我有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();
    }
}

当实际尝试运行查询时,另一行在我的内容提供程序中。

0 个答案:

没有答案