我无法找到在没有寻呼机的情况下浏览片段的正确方法,并且在屏幕方向的配置更改期间遇到问题。我在片段上使用Show / Hide来使它们可见并且功能正常但我想知道我是否应该使用Detach / Attach。我也有问题在后台堆栈添加东西,我认为这也是由于使用show / hide。是否更好地使用附加/分离或有一种方法来覆盖后退按钮的作用,使其显示/隐藏最后/当前片段。
行为: 我有一个地图片段和一个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;
}
}
答案 0 :(得分:4)
这不是你的错。问题是,当方向改变时,所有活动都被销毁,甚至添加了所有碎片。因此,其中没有任何数据被保留。
不建议使用android:configChanges="orientation|keyboardHidden"
。
相反,为每个片段setRetainInstance(true)
设置它,它将适用于您当前的代码。
答案 1 :(得分:0)
如果您希望获得更好的持久性(例如,当活动因空间问题而暂时销毁时),请记住使用onSaveInstanceState保存片段的状态。只有在即将发生配置更改时,setRetainInstance
才会起作用。