4

4 つのメイン ビューを持つアプリを作成しています。それらのすべてを LIST メニューの一番上に置いておきたいです (今のところは問題ありません)。

フラグメントを使用すると、実際に他のアクティビティに移動せずにビューを変更できますが、ビューの 1 つに ViewPager があるため、まったく機能しません (最初にビューを読み込んだとき、コンテンツは問題ありませんが、2 回目では問題ありません時間、ViewPager のビューが消え、2 つのインデックス位置を離れて戻った場合にのみ表示されます) (最初のロード時間と 2 番目の図を参照)

ここに画像の説明を入力

ViewPager はメニュー項目を表示するものではないことに注意してください。実際には、現在のメニュー項目 (この場合は "Simula'c~ao") のフラグメントの一部です。

私の質問は次のとおりです。これは既知の問題ですか、それを修正する簡単な方法はありますか、それとも別の方法で行う必要がありますか? 私はすでにこの問題をインターネットで検索しましたが、何もうまくいきませんでした(無効化、オンを設定しgetItemPositionて戻りPOSITION_NONEます...)

私は ViewPager クラスを調べましたが、すべて問題ないようです。ビューをレンダリングするたびにすべてを強制的にレンダリングするように変更しましたが、この方法ではうまくいきませんでした。

可視性を GONE と VISIBLE に設定しようとしました

アダプターを取り外して取り付けてみました

ビューをキャッシュして、キャッシュを返そうとしました。

うまくいったことの1つは、電話の向きを変えることです。それはうまくいきました。

私も覚えていることをたくさん試しました... 過去24時間はこの「ミステリー」を解決するのにまったく役立たなかったので、私はこれに少し激怒しています. あなたの何人かができることを願っています=]

私のコード: https://www.dropbox.com/s/u4mlxr3k6ta9yrm/MainActivity.java https://www.dropbox.com/s/2dqfnzjs2wl89hj/SimulationFragment.java

ビュー: https://www.dropbox.com/s/d6ruc1zjovqu6ob/activity_main.xml https://www.dropbox.com/s/lp1iea13klr77iq/activity_simulation.xml https://www.dropbox.com/s/1mkl3jqmo7g4wh8/ item_simulation.xml

4

3 に答える 3

5

さて、これが一体何なのかを発見しようと長い時間を費やした後、@anup-cowkur が私の問題を解決する道を案内してくれました。

最初は、問題は にあるPageViewと思いました。サポート ライブラリをダウンロードし、編集し、多くのことを変更しましたが、問題はありませんでした。

実際、問題は にありFragmentPagerAdapterます。ViewPager彼は、フラグメントごとに一種の「キャッシング」を使用します。そのため、私がビューに戻ったときに彼は「通知」されず、表示された最後のフラグメントが「実際には」親ビューに存在しないようにしました (この場合、ViewPager からの他のフラグメントを保持するメインフラグメント) )。

これらは FragmentManager に登録されているため、FragmentPagerAdapter をハックして、次のメソッドを実装しました。

FragmentPagerAdapter.java

public void clear(ViewGroup container){
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }

    for(int i = 0; i < getCount(); i++){

        final long itemId = getItemId(i);

        // Do we already have this fragment?
        String name = "android:switcher:" + container.getId() + ":" + itemId;
        Fragment fragment = mFragmentManager.findFragmentByTag(name);

        if(fragment != null){
            mCurTransaction.detach(fragment);
        }
    }
    mCurTransaction.commitAllowingStateLoss();
    mCurTransaction = null;
}

そして、それを「onCreate」で呼び出します。

myPagerAdapter.clear(mViewPager);

終わり。すべてのフラグメントは FragmentManager から強制的に削除され、「キャッシュ」が消えます。

これは最善の解決策ではありませんが、機能した唯一の解決策です。

編集 ここで穴ファイルを見つけることができます: http://pastebin.com/07adWVrr

于 2013-05-17T07:01:23.057 に答える
0

FragmentStatePagerAdapterを使用しています。このアダプターは、ViewPager 内のフラグメントを使用します。別の親 Fragment 内にこの ViewPager があります。したがって、フラグメント内にフラグメントがあります。ネストされたフラグメントはサポートされていません。これが問題を抱えている理由です。参照: Fragment 内で ViewPager を使用できないのはなぜですか? それは実際にある

FragmentStatePagerAdapter の代わりに通常のPagerAdapterを使用することをお勧めします。これは Fragments の代わりに通常のビューを使用し、正常に動作するはずです。

于 2013-05-17T06:05:02.270 に答える
0

画面上のページを取得するために複数回のスワイプを行う必要があるときに問題が発生した場合は、次のコードで解決します。

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
于 2016-05-05T01:38:52.670 に答える