13

編集

したがって、 myは再初期化を試みる にFragment保持されているようです。FragmentManagerで破棄されない理由はまだわかりませんActivity。読み込み中のメッセージは、ListView にアダプタが設定されていない場合に表示されます。ただし、アダプター項目を設定したonCreateのでonResume、この読み込み画面が表示される理由がわかりません。この動作の説明はまだ受け付けています

オリジナル

フラグメントをいじっていて、画面の向きを変更すると奇妙なエラーが表示されることに気付きました。ただし、画面の向きが変更されたときにすべてのデータが onCreate で再作成されるため、このエラーは発生しないはずです。また、フラグメントonResume()はローテーション後に 2 回呼び出されます。エラーを作成するための私の手順と、デバッガーが関数にヒットする方法を次に示します。

  • アクティビティ: onCreate()
  • アクティビティ: onResume()
  • フラグメント: onResume()
  • 画面を回転
  • アクティビティ: onCreate()
  • アクティビティ: onResume()
  • Fragment: onResume() (Activity.onResume() で設定してもアイテムは null です)
  • フラグメント: onResume() (アイテムは null ではありません。これが 2 回呼び出されるのはなぜですか?)

この最後のフラグメントonResumeがヒットした後、タブレットには「読み込み中...」というメッセージとアイコンが表示されます。データがリストに表示されなくなったのはなぜですか? 私の疑いは、onCreate が 2 番目のフラグメントを作成していることです。最初のフラグメントは、方向がビューを破壊するためにデータを失い、2 番目のフラグメントはデータを取得し、ロード画面はデータ項目のない最初のフラグメントであり、2 番目のフラグメントは非表示になっています。私は間違っているかもしれません。のように画面を回転させたときに破片がすべて破壊されないのはなぜActivityですか? この特定の問題を解決しない限り、コードを批判しないでください。私は実際にアプリを作っているのではなく、フラグメント機能を試しています。ありがとう!

主な活動

private ArrayList<Object> items = new ArrayList<Object>();
private MyListFragment mylistFragment;

public MainActivity() {
    items.add("Hello");
    items.add("World");
    items.add("Goodbye");
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    mylistFragment = new MyListFragment();
    mylistFragment.setItems(items);

    ft.add(R.id.container, mylistFragment);
    ft.commit();
}

@Override
public void onResume() {
    super.onResume();

    mylistFragment.setItems(items);
    mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show();
        }

    });
}

リストフラグメント

private List<Object> items = null;
private Boolean isSet = false;

@Override
public void onResume() {
    super.onResume();
    if( !isSet && items != null) {
        setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items));
        isSet = true;
    }
}

public void setItems(List<Object> items) {
    this.items = items;
    if( this.isResumed() ) {
        setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items));
        isSet = true;
    } else {
        isSet = false;
    }
}
4

3 に答える 3

5

FragmentManager自動的に を再作成Fragmentします。ただし、それらの内部のデータは再初期化する必要があります。したがって、私のコードは 2 番目のフラグメントを作成していました。ロード画面は、最初のフラグメントにアイテムのアダプターがなくなり、2 番目のフラグメントが非表示になったためです。なんと頭痛の種です。保持しているデータを使用してそれらを再作成できるように、FragmentManagerを破棄する必要があると思います。Fragments

于 2011-05-03T19:32:14.893 に答える
0

これが、Diane や他の Google の例を介したさまざまなデモの理由だと思います...通常、静的メソッドと setArguments を介して初期化を支援する方法があります。

IIRC、フラグメント作成スタッフは作成するデフォルトのコンストラクターを呼び出しますが、setArguments を介して適切なデータを入力することしか知りません。Android 開発ブログの例では、id は listactivity から details フラグメントに渡されていました。setParams が呼び出された後、fragmentManager はそれを再アニメートできる必要があります。

この件に関するドキュメントはまばらなようで、私は正しいことをしたいと思っているので、フィードバックがあれば感謝します.

于 2011-05-06T21:15:12.953 に答える
0

FragmentActivityサポート ライブラリから使用すると、インスタンスの保存と復元が自動的に行われるようです。savedInstanceStateしたがって、 の場合にのみフラグメント トランザクションを実行してくださいnull

たとえば、 で、次FragmentActivityの操作を行います。onCreate()

if(savedInstanceState == null){
       FragmentManager fragmentManager = getSupportFragmentManager();
       fragmentManager.beginTransaction()
       .replace(R.id.fragment_container, mFragment).commit(); //mFragment is your own defined fragment
}
于 2014-05-14T19:49:48.657 に答える