1

ABS とナビゲーション タイプのタブを備えたアプリがあります。タブの 1 つに 3 つのフラグメント (異なる配置の縦向き/横向き) があります。1 つにはリストがあり、1 つにはカバーフローがあり、最後には検索機能があります。リストアイテム、カバーフローアイテム、または検索結果を押すと、フラグメントフルスクリーンとして読み込まれる詳細フラグメントを開く必要があります。もう 1 つの問題は、フラグメントごとに、表示する情報を返す Web サービスを呼び出さなければならないことです。しかし、それらを並行して呼び出すことはできないため、最初にリストをロードし、カバーフロー、次に検索オプションをロードします。そうしないと、「接続がまだ割り当てられています」のようなサーバーエラーが発生します。

問題: 構成が変更された場合、期待どおりに動作しません: 新しい構成に従って、バックスタック内の 3 つについても詳細を目的のレイアウトでロードしたくないため、何らかの形でサーバー エラーが発生しないようにします:D

私が試したこと: 1)アクティビティのconfigChanges属性がないため、アクティビティは毎回再起動しています。この種の 3 つのフラグメントでは機能しますが、詳細を開くと、前述のサーバー エラーが発生します。バックスタックから 3 つのフラグメントすべてと詳細フラグメントを同時に復元しようとするためです。

logcat の出力を参照してください。

06-12 12:31:38.511: E/EvenementsMainActivity (23833): onCreate

06-12 12:31:38.551: E/NouveauLieuxFragment (23833): onCreateView

06-12 12:31:38.561: E/Top5Fragment (23833): onCreateView

06-12 12:31:38.571: E/RechercheFragment(23833): onCreateView

06-12 12:31:38.611: E/SalleDetailsFragment (23833): onCreateView

06-12 12:31:38.641: W/PhoneWindow(23833): 以前にフォーカスされたビューは、保存中に ID 2131099775 を報告しましたが、復元中に見つかりません。

06-12 12:31:38.641: 私/EvenementsMainActivity (23833): onResumeFragments

06-12 12:31:38.671: I/EvenementsMainActivity(23833): onTabSelected - レ トップス

06-12 12:31:38.671: E/NouveauLieuxFragment (23833): onCreateView

06-12 12:31:38.681: W/SingleClientConnManager(23833): SingleClientConnManager の無効な使用: 接続がまだ割り当てられています。

06-12 12:31:38.681: W/SingleClientConnManager(23833): 別の接続を割り当てる前に、必ず接続を解放してください。

06-12 12:31:38.721: E/Top5Fragment(23833): onCreateView 06-12 12:31:38.731: E/RechercheFragment(23833): onCreateView

06-12 12:31:38.831: 私/coverflow (23833): センター coverflow 427

06-12 12:31:38.851: E/SalleDetailsFragment (23833): GetSalleById エラー サーバー エラー

06-12 12:31:38.851: W/System.err(23833): com.neurospeech.wsclient.SoapFaultException: サーバー エラー

  • ここで、EvenementsMainActivity がメイン アクティビティです。NouveauLieuxfragment、Top5Fragment、および RechercheFragment は、私が話していた 3 つのフラグメントであり、SalleDetailsFragment は詳細フラグメントです。
    • なぜoncreateviewフラグメントが2回呼び出されるのか理解できないようです:(

2)アクティビティのconfigChanges属性を使用して、onConfigurationChangedメソッドを作成しましたが、私がしたように、詳細であっても元のタブを復元するだけです。

3)今、詳細をアクティビティに変更しようとしていますが、変数がたくさん必要で、バンドルを介して送信する必要があり、アクションバーなどもありません...

注:方向のレイアウトが異なるため、構成が変更されたときにアクティビティとフラグメントを再度表示する必要があります。

理解を深めるために提供する情報またはコードが他にもあることをお知らせください。

編集: タブを含む 1 つの SherlockFragmentActivity と、各タブの SherlockFragment があり、詳細についても同じです。私が持っているより:

private class MyTabListener implements ActionBar.TabListener {
    private final Activity mActivity;

    public MyTabListener(Activity activity, String tag) {
        mActivity = activity;
    }

    @Override
    public void onTabSelected(Tab tab, final FragmentTransaction ft) {

        ....

        tab_position = tab.getPosition();

        switch (tab_position) {
           ...
            case 1: // Les Tops

                if (BuildMode.DEBUG) {
                    Log.i(TAG, "onTabSelected - Les Tops");
                }

                preInitializedFragment1 = (SherlockFragment) ((SherlockFragmentActivity) mActivity).getSupportFragmentManager()
                        .findFragmentByTag(fragments_mTags.get(2));
                preInitializedFragment2 = (SherlockFragment) ((SherlockFragmentActivity) mActivity).getSupportFragmentManager()
                        .findFragmentByTag(fragments_mTags.get(10));
                if (!isPhone)
                    preInitializedFragment3 = (SherlockFragment) ((SherlockFragmentActivity) mActivity).getSupportFragmentManager()
                            .findFragmentByTag(fragments_mTags.get(8));

                if (preInitializedFragment1 == null && preInitializedFragment2 == null
                        && ((!isPhone && preInitializedFragment3 == null) || isPhone)) {
                    frag1 = (SherlockFragment) SherlockFragment.instantiate(mActivity, NouveauLieuxFragment.class.getName());
                    ft.add(R.id.content1, frag1, fragments_mTags.get(2));
                    frag2 = (SherlockFragment) SherlockFragment.instantiate(mActivity, Top5Fragment.class.getName());
                    ft.add(R.id.content2, frag2, fragments_mTags.get(10));
                    if (!isPhone) {
                        frag3 = (SherlockFragment) SherlockFragment.instantiate(mActivity, RechercheFragment.class.getName());
                        ft.add(R.id.content3, frag3, fragments_mTags.get(8));
                    }
                } else if (frag1 != null && frag2 != null && ((!isPhone && frag3 != null) || isPhone)) {
                    ft.attach(frag1);
                    ft.attach(frag2);
                    if (!isPhone)
                        ft.attach(frag3);
                } else if (preInitializedFragment1 != null && preInitializedFragment2 != null
                        && ((!isPhone && preInitializedFragment3 != null) || isPhone)) {
                    ft.attach(preInitializedFragment1);
                    ft.attach(preInitializedFragment2);
                    frag1 = preInitializedFragment1;
                    frag2 = preInitializedFragment2;
                    if (!isPhone) {
                        ft.attach(preInitializedFragment3);
                        frag3 = preInitializedFragment3;
                    }
                }
                loadLesTops();

                break;
            ....
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {


        ....

        // Detach the fragment, because another one is being attached
        if (frag1 != null) {
            ft.detach(frag1);
        }
        if (frag2 != null) {
            ft.detach(frag2);
        }
        if (frag3 != null) {
            ft.detach(frag3);
        }
    }
}
4

1 に答える 1

0

まず第一に、あなたがどのように動作するかを確認するためのコードが必要です。

ABS を使用する場合は、アクティビティまたはフラグメントを使用しないでください。SherlockFragmentActivity と SherlockFragment を使用する必要があります。

たとえば、ViewPager またはタブを含む 1 つの SherlockFragmentActivity と、各タブに SherlockFragment を含めることができます。

DetailView は、Extra でデータを渡すことができる SherlockFragmentActivity である必要があります。これは、フラグメントにバンドルするのと同じ動作です。ABS は、以下を使用してすべての SherlockFragmentActivity で取得できます。

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.titre_abs);
bar.setDisplayHomeAsUpEnabled(true);

次の方法で MainActivity に戻ります。

@Override
public void onBackPressed() {
    finish();
    overridePendingTransition(R.animator.anim_left, R.animator.anim_right);
}

MenuItems を次のように管理します

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    return true;
}

アプリケーションで必要な場合を除き、画面の回転時にアクティビティ/フラグメントを更新しないでください。使用する :

android:configChanges="orientation|screenSize"

フラグメントを交換するときは、「追加」を使用せず、「置換」を使用してください。

... TabAdapter クラスを使用していますか? ViewPager ?

あなたのコードの助けがもっと必要です

于 2013-06-12T08:10:05.343 に答える