26

編集2

ここからのトリックを使用してエラーを取り除くことができましたhttps://code.google.com/p/android/issues/detail?id=42601#c10これが、最後の編集が一番上にある理由です私の質問の。

しかし、これは次のエラーにつながりました:

java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281)
at android.view.View.dispatchRestoreInstanceState(View.java:12043)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694)
at android.view.View.restoreHierarchyState(View.java:12021)
at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4800)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)

そして今、私はどこに続くべきかわかりません...

編集 0 - 最初の質問

次の例外が発生します。

java.lang.IllegalStateException: No activity
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1492)
at android.support.v4.app._HoloFragment.performActivityCreated(_HoloFragment.java:251)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4800)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)

どこから始めればよいかわかりません。最新のサポート ライブラリ (v4、rev18) を使用しています。

と組み合わせてaFragmentを保持するa を追加するまで、すべてが正常に機能します。ViewPagerFragmentStatePagerAdapter

どこでもサポート ライブラリを使用しています。https://code.google.com/p/android/issues/detail?id=42601のソリューションを試しました...

しかし、まだ何も機能していません...

どこから始めればいいのかわからないのですが、ヒントはありますか?

編集 1: 背景とコード

1) MainActivity では、次を使用します。

3 番目のページにはビューページャーがあります...

public void setPage(int pos, boolean addToBackStack)
 {
    Fragment nextFragment = null;
    FragmentTransaction transaction = null;

    switch (pos)
    {
        case 0:
            if (mFragmentAllRoutines == null)
                mFragmentAllRoutines = new RoutinesListFragment();
            if (!mFragmentAllRoutines.isVisible())
                nextFragment = mFragmentAllRoutines;
            break;
        case 1:
            if (mFragmentRoutine == null)
                mFragmentRoutine = new RoutineFragment();
            if (!mFragmentRoutine.isVisible())
                nextFragment = mFragmentRoutine;
            break;
        case 2:
            if (mFragmentDay == null)
                mFragmentDay = new RoutineDayFragment();
            if (!mFragmentDay.isVisible())
                nextFragment = mFragmentDay;
            break;
        default:
            break;
    }

    if (nextFragment != null)
    {
        // Fragment prevFragment = getSupportFragmentManager().findFragmentById(R.id.fragment);
        transaction = getSupportFragmentManager().beginTransaction();
        // if (prevFragment != null)
        //    transaction.detach(prevFragment);
        transaction.replace(R.id.fragment, nextFragment, nextFragment.getClass().getName());
        // transaction.attach(nextFragment);
        if (addToBackStack)
            transaction.addToBackStack(null);
        transaction.commit();
    }
}

2) 3 番目のフラグメント:

これは、ViewPager と FragmentStatePagerAdapter を持つ単純な Fragment です。FragmentStatePagerAdapter は FragmentManager として取得getChildFragmentManager()されます。そして、どこかに問題があるようです。

4

4 に答える 4

69

これをどこに適用するかを知るために、より多くのコードを見る必要があります...しかし、私はあなたと同じような状況にありました...私ChildFragmentManagerは同じ方法で問題を解決しNullPointerException、あなたが持っているのと同じ.

私はそれを解決することができました...あなたが提供したコードでは、「修正」を適用する場所がわからないので、私の解決策を説明しようとします...それは本当に修正です...それはそうではありませんこれを解決するエレガントな方法!しかし、それは私を助けました.ビューページャーを離れたら状態を復元する必要がないので、私にとってマイナス面はありません.

コードの静的ビットと onDetach ( https://code.google.com/p/android/issues/detail?id=42601#c10 ) を実装する複数のフラグメントがあり、各フラグメントにはページャーがあり、onCreateView FragmentStatePagerAdapter を拡張するアダプターを取り付けます。

これらのアダプターでは、restoreState メソッドをオーバーライドして何もしないようにしました

    @Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
    //do nothing here! no call to super.restoreState(arg0, arg1);
}

繰り返しますが、これは最善の方法ではありません...しかし、それは私の問題を解決しました。

頑張ってください!

于 2013-09-30T17:13:46.427 に答える
1

私の側では、ViewPager フラグメントへの参照を包含フラグメントに保持し、onSaveInstanceState を使用してそれらの状態を保存していました。これがViewPager独自のメカニズムと衝突してフラグメントを復元したため、NPEが発生したと思います。私がしたことは、アーキテクチャを ViewPager から自分で管理するフラグメント トランザクションに変更したことです。(ViewPager は私の場合には適切な解決策ではありませんでした)

于 2015-05-12T15:06:18.713 に答える
0

まず第一に、英語は私の母国語ではありません。文法に何か問題がある場合は教えてください。私のプロジェクトでこの問題が発生しました。最初はマークが言ったことを実行しましたが、うまくいきました。しかし、親フラグメントに別の ViewPager を追加すると、新しい ViewPager のコードが何であれ、新しい ViewPager は古いものと同じように表示されました。ついにその理由を見つけました。FragmentTrasaction.replace(R.layout.fragment,fragment) メソッドを使用して常に Fragment を作成します。このため、このメソッドを使用すると、新しいフラグメント インスタンスが作成されます。replace() メソッドを使用する代わりに、 FragmentTransaction.hide() および show() メソッドを使用してフラグメントを切り替えます。私はこの方法で問題を解決しました。ここに私のコードスニペットがあります:

@Override
public void onClick(View v) {
    FragmentTransaction transaction = fm.beginTransaction();
    switch (v.getId()) {
        case R.id.tv_schedule_day:
        hideFragment(transaction);
        if (dayFragment == null) {
            dayFragment = new ScheduleDayFragment();
            transaction.add(R.id.ll_schedule_content, dayFragment);
        } else {
            transaction.show(dayFragment);
        }
        transaction.commit();
        break;
        case R.id.tv_schedule_week:
        hideFragment(transaction);
        if (weekFragment == null) {
            weekFragment = new ScheduleWeekFragment();
            transaction.add(R.id.ll_schedule_content, weekFragment);
        } else {
            transaction.show(weekFragment);
        }
        transaction.commit();
        break;
    case R.id.tv_schedule_month:
        hideFragment(transaction);
        if (monthFragment == null) {
            monthFragment = new ScheduleMonthFragment();
            transaction.add(R.id.ll_schedule_content, monthFragment);
        } else {
            transaction.show(monthFragment);
        }
        transaction.commit();
        break;

private void hideFragment(FragmentTransaction transaction) {
    if (dayFragment != null) {
        transaction.hide(dayFragment);
    }
    if (weekFragment != null) {
        transaction.hide(weekFragment);
    }
    if (monthFragment != null) {
        transaction.hide(monthFragment);
    }
}

hide() および show() メソッドを使用して、スイッチの親フラグメントを作成するため、埋め込みフラグメントで getChildFragmentManager() を使用すると、null が返されません。この質問は 2013 年に出されたもので、誰もこの回答を目にすることはないと思いますが、この質問に回答できることを非常にうれしく思います。

于 2015-05-25T06:38:19.823 に答える