碎片Detatch / Reattach Vs显示/隐藏

我无法找出在没有寻呼机的情况下浏览片段的正确方法,并且在屏幕方向的配置更改期间遇到问题。 我正在使用片段上的显示/隐藏,使它们可见和功能,但我想知道是否应该使用分离/附加。 我也有问题添加到背面堆栈的东西,我认为这也是由于使用show / hide。 使用Attach / detatch还是有一种方法可以重写后退按钮的功能,以显示/隐藏最后/当前片段。

行为:我有一个地图片段和一个List片段以及其他几个。 所有事情都可以正确启动,并且最初在方向改变时工作 当我导航到列表视图时,它会正确填充,但是在方向更改时,列表会重绘,而不会显示其中的数据。 地图视图也会重新绘制,并在我的寻呼机标题指示符后面可见。 如果任何人都可以请指出正确的方向来解决这个问题,那真是太棒了。 我怀疑这是由我展示和隐藏碎片的方式造成的。

这里是我创建碎片并将它们添加到碎片管理器的地方。 我还显示了我显示/隐藏片段的位置。

@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;
    }
}

这不是你的错。 问题是,当方向改变所有活动被销毁时,甚至所有的片段都被添加。 所以它里面的数据都没有保留。 建议不要使用android:configChanges="orientation|keyboardHidden" 。 相反,为每个片段setRetainInstance(true) ,它将适用于您当前的代码。


如果你想有更好的持久性(例如,当空间问题的活动被暂时销毁时),还要记住用onSaveInstanceState保存你的片段的状态。 setRetainInstance将只在配置更改即将到来时起作用。

链接地址: http://www.djcxy.com/p/66971.html

上一篇: Fragments Detatch/Reattach Vs Show/Hide

下一篇: How does WPF DataGrid get frozen rows/columns working?