片段替换不起作用
Fragment replace doesnt work
I'm having a radio group that changes my fragments in the activity when a the selected radiobutton is changed.我有这个代码:
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.main_menu1:
showOffersFragment();
break;
case R.id.main_menu2:
openMap();
break;
case R.id.main_menu3:
showProductsFragment();
break;
}
}
private void showProductsFragment() {
fm = getFragmentManager();
ft = fm.beginTransaction();
if (productsFragment == null) {
bundle = new Bundle();
bundle.putSerializable(ActivityConstants.PRODUCT_ITEMS, products);
productsFragment = new ProductFragment();
productsFragment.setArguments(bundle); ft.add(R.id.main_frag_container, productsFragment, "products");
} else {
//TODO
ft.replace(R.id.main_frag_container, productsFragment, "products");
productsFragment.loadList(products);
}
ft.commit();
}
private void showOffersFragment() {
Log.d(TAG, "OFFERS NULL OR :" + (offersFragment == null)+" ITEMS ="+items.size());
fm = getFragmentManager();
ft = fm.beginTransaction();
if (offersFragment == null) {
bundle = new Bundle();
bundle.putSerializable(ActivityConstants.OFFER_ITEMS, items);
offersFragment = new OffersFragment();
offersFragment.setArguments(bundle);
ft.add(R.id.main_frag_container, offersFragment,"offers");
} else {
ft.replace(R.id.main_frag_container, offersFragment,"offers");
}
ft.commit();
}
private void openMap() {
fm = getFragmentManager();
ft = fm.beginTransaction();
if(mapFragment==null){
mapFragment = new MapFragment();
ft.add(R.id.main_frag_container, mapFragment, "Map");
}else{
ft.replace(R.id.main_frag_container, mapFragment, "Map");
}
ft.commit();
mapFragment.getMapAsync(this);
}
现在的问题是当我在片段之间切换时。它不会立即更改片段,因此响应不是很好。我应该在它们之间切换几次,这样片段才能出现。
谁能告诉我怎样才能optimize/make它正常工作?
它不会立即响应,因为一开始,一旦你选择了每个选项,这一行是 运行 ft.add(R.id.main_frag_container, mapFragment, "Map");
,这意味着你正在将新片段添加到同一个容器中,而不是更换旧的。
使用 ft.replace(R.id.main_frag_container, mapFragment, "Map");
而不是 ft.add(R.id.main_frag_container, mapFragment, "Map");
。虽然我可能是错的,但容器(这里 R.id.main_fragment_container)必须已经添加了片段,一种选择是仅当容器为空时才添加片段,否则替换。
如果您想返回之前的片段,您可能需要选中 addToBackStack。
I'm having a radio group that changes my fragments in the activity when a the selected radiobutton is changed.我有这个代码:
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.main_menu1:
showOffersFragment();
break;
case R.id.main_menu2:
openMap();
break;
case R.id.main_menu3:
showProductsFragment();
break;
}
}
private void showProductsFragment() {
fm = getFragmentManager();
ft = fm.beginTransaction();
if (productsFragment == null) {
bundle = new Bundle();
bundle.putSerializable(ActivityConstants.PRODUCT_ITEMS, products);
productsFragment = new ProductFragment();
productsFragment.setArguments(bundle); ft.add(R.id.main_frag_container, productsFragment, "products");
} else {
//TODO
ft.replace(R.id.main_frag_container, productsFragment, "products");
productsFragment.loadList(products);
}
ft.commit();
}
private void showOffersFragment() {
Log.d(TAG, "OFFERS NULL OR :" + (offersFragment == null)+" ITEMS ="+items.size());
fm = getFragmentManager();
ft = fm.beginTransaction();
if (offersFragment == null) {
bundle = new Bundle();
bundle.putSerializable(ActivityConstants.OFFER_ITEMS, items);
offersFragment = new OffersFragment();
offersFragment.setArguments(bundle);
ft.add(R.id.main_frag_container, offersFragment,"offers");
} else {
ft.replace(R.id.main_frag_container, offersFragment,"offers");
}
ft.commit();
}
private void openMap() {
fm = getFragmentManager();
ft = fm.beginTransaction();
if(mapFragment==null){
mapFragment = new MapFragment();
ft.add(R.id.main_frag_container, mapFragment, "Map");
}else{
ft.replace(R.id.main_frag_container, mapFragment, "Map");
}
ft.commit();
mapFragment.getMapAsync(this);
}
现在的问题是当我在片段之间切换时。它不会立即更改片段,因此响应不是很好。我应该在它们之间切换几次,这样片段才能出现。
谁能告诉我怎样才能optimize/make它正常工作?
它不会立即响应,因为一开始,一旦你选择了每个选项,这一行是 运行 ft.add(R.id.main_frag_container, mapFragment, "Map");
,这意味着你正在将新片段添加到同一个容器中,而不是更换旧的。
使用 ft.replace(R.id.main_frag_container, mapFragment, "Map");
而不是 ft.add(R.id.main_frag_container, mapFragment, "Map");
。虽然我可能是错的,但容器(这里 R.id.main_fragment_container)必须已经添加了片段,一种选择是仅当容器为空时才添加片段,否则替换。
如果您想返回之前的片段,您可能需要选中 addToBackStack。