7

ポケットベルなしでフラグメントをナビゲートする適切な方法を見つけるのに問題があり、画面の向きの構成変更中に問題が発生します。フラグメントを表示/非表示にして表示および機能させるようにしていますが、代わりにデタッチ/アタッチを使用する必要があるかどうか疑問に思っています。バックスタックに物を追加するのにも問題があります。これもshow/hideの使用によるものだと思います。アタッチ/デタッチを使用する方が良いですか、それとも最後の/現在のフラグメントを表示/非表示にするために戻るボタンの機能をオーバーライドする方法がありますか?

動作:マップフラグメントとリストフラグメント、およびその他のフラグメントがあります。すべてが正しく起動し、最初は向きを変更して機能します。リストビューに移動すると、正しく表示されますが、向きを変更すると、データが含まれていない状態でリストが再描画されます。マップビューも再描画され、ポケットベルのタイトルインジケータの後ろに表示されます。誰かがこれを解決するための正しい方向に私を向けることができればそれは素晴らしいでしょう。これは、フラグメントの表示と非表示の方法が原因であると思われます。

ここでフラグメントを作成し、フラグメントマネージャーに追加します。フラグメントを表示/非表示にする場所も示しました。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map_frags);
    mapViewContainer = LayoutInflater.from(this)
            .inflate(R.layout.map, null);

    setupFragments();
    showFragment(0);
}
public void setListData(String name) {
    bName = name;
    showFragment(1);
}
private void setupFragments() {
    final FragmentManager fm = getSupportFragmentManager();
    final FragmentTransaction ft = fm.beginTransaction();
    mFragment1 = fm.findFragmentByTag("f1");
    if (mFragment1 == null) {
        mFragment1 = new MenuFragment();
        ft.add(mFragment1, "f1");
        ft.hide(mFragment1);
    }
    mMapFragment = (MapFragment) getSupportFragmentManager()
            .findFragmentByTag(MapFragment.TAG);
    if (mMapFragment == null) {
        mMapFragment = MapFragment.newInstance(0);
        ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG);
    }
    ft.hide(mMapFragment);

    myListFragment = (ListFrag) getSupportFragmentManager()
            .findFragmentByTag(ListFrag.TAG);
    if (myListFragment == null) {
        myListFragment = new ListFrag();
        ft.add(R.id.fragment_container, myListFragment, ListFrag.TAG);
    }
    ft.hide(myListFragment);

    frag = (frag) getSupportFragmentManager().findFragmentByTag(
            frag.TAG);
    if (frag == null) {
        bacFrag = new frag();
        ft.add(R.id.fragment_container, frag, frag.TAG);
    }
    ft.hide(bacFrag);
    ft.commit();
}

public void showFragment(int fragIn) {
    final FragmentTransaction ft = getSupportFragmentManager()
            .beginTransaction();
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
    if (mVisible != null) {
        if (mVisible == mListFragment) {
            ft.remove(mListFragment);
        } else {
            ft.hide(mVisible);
        } 
    }

    switch (fragIn) {
    case 0:
        ft.show(mMapFragment);
        ft.commit();
        mVisible = mMapFragment;
        break;
    case 1:
        mListFragment = (ListFragmentDisplay) getSupportFragmentManager()
                .findFragmentByTag(ListFragmentDisplay.TAG);
        Toast.makeText(this, "startListFrag", Toast.LENGTH_LONG).show();
        if (mListFragment == null) {
            mListFragment = new ListFragmentDisplay();
            ft.add(R.id.fragment_container, mListFragment,
                    ListFragmentDisplay.TAG);
        }
        ft.show(mListFragment).commit();
        mVisible = mListFragment;
        break;
    case 2:
        ft.show(myfragment).commit();
        mVisible = myfragment;
        break;
    case 3:
        ft.show(frag).commit();
        mVisible = frag;
        break;
    }
}
4

2 に答える 2

4

これはあなたの責任ではないです。問題は、向きが変わると、すべてのフラグメントが追加されても、すべてのアクティビティが破棄されることです。したがって、その中のデータは保持されません。を使用することはお勧めしません android:configChanges="orientation|keyboardHidden"。むしろ、すべてのフラグメントに設定するsetRetainInstance(true)と、現在のコードでうまく機能します。

于 2013-02-15T13:53:02.270 に答える
0

より良い永続性が必要な場合(たとえば、スペースの問題でアクティビティが一時的に破棄された場合)、onSaveInstanceStateを使用してフラグメントの状態を保存することも忘れないでください。setRetainInstance構成が変更されようとしている場合にのみ機能します。

于 2013-06-18T04:09:05.727 に答える