@Ali的回答很好,但是想象一下如果你有5个片段。这是另一种显示/隐藏你的片段的方式:
@Ali的回答不���,但如果您有5个片段,那么以下是另一种显示/隐藏您的片段的方法:
public abstract String getTAG();
public String getTAG(){
return TAG;
}
private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;
private ConcurrentHashMap<String,BaseFragment> mapOfAddedFragments = new ConcurrentHashMap<>();
private void displayFragmentA() {
displayFragment(fragmentA)
}
private void displayFragmentB() {
displayFragment(fragmentB)
}
private void displayFragmentC() {
displayFragment(fragmentC)
}
private void displayFragment(BaseFragment fragment){
if(!mapOfAddedFragments.containsKey(fragment.getTAG()))
mapOfAddedFragments.put(fragment.getTAG(), fragment);
showFragment(fragment.getTAG(), R.id.containerBody);
}
private void showFragment(String fragmentTag, @IdRes int containerViewId){
FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
BaseFragment fragment = null;
fragment = mapOfAddedFragments.get(fragmentTag);
if(fragment != null) {
if (fragment.isAdded())
ft.show(fragment);
else {
ft.add(containerViewId, fragment, fragment.getTAG());
}
}
else
return;
for (ConcurrentHashMap.Entry<String, BaseFragment> entry : mapOfAddedFragments.entrySet()){
if(!entry.getKey().equals(fragmentTag)){
BaseFragment fragmentTemp = entry.getValue();
if(fragmentTemp != null)
if(fragmentTemp.isAdded())
ft.hide(fragmentTemp);
}
}
ft.commit();
}
要实例化它们,您可以在活动的onCreate()方法中执行以下操作:
private void instantiateFragments(Bundle inState) {
if (inState != null) {
fragmentA = inState.containsKey(FragmentA.TAG) ?
(FragmentA) getSupportFragmentManager().getFragment(inState, FragmentA.TAG):
FragmentA.newInstance(FragmentA.TAG,"0");
fragmentB = inState.containsKey(FragmentB.TAG) ?
(FragmentB) getSupportFragmentManager().getFragment(inState, FragmentB.TAG):
FragmentB.newInstance(FragmentB.TAG,"1");
fragmentc = inState.containsKey(FragmentC.TAG) ?
(FragmentC) getSupportFragmentManager().getFragment(inState, FragmentC.TAG):
FragmentC.newInstance(FragmentC.TAG,"2");
}
else{
fragmentA = FragmentA.newInstance(FragmentA.TAG,"0");
fragmentB = FragmentB.newInstance(FragmentB.TAG,"1");
fragmentc = FragmentC.newInstance(FragmentC.TAG,"2");
}
}
根据Shujaat Ali Khan的问题进行编辑:
BaseFragment扩展了support4 fragment:
public abstract class BaseFragment extends Fragment {
public abstract String getTAG();
}
例如,FragmentA:
public class FragmentA extends BaseFragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public static final String TAG = "FragmentA";
public static FragmentA newInstance(String param1, String param2) {
FragmentA fragment = new FragmentA();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmentA, container, false);
return view;
}
@Override
public String getTAG() {
return TAG;
}
}
最后,R.id.containerBody
是一个 FrameLayout 的 id,该 FrameLayout 包含在包含这些碎片的活动中。
hide()
和show()
时,可能会出现问题。就像在这里可能会发生的那样,currentFragment
引用与fragment
相同的片段。说到这个问题,我认为声称supportFragmentManager.fragments
列表中的最后一个片段将是最后显示的片段(而不是最近添加的片段)是错误的。您应该遍历所有fragments
并搜索具有isVisible()
为true的片段,或者只需存储最后显示的片段标记并稍后查找它。 - Maciej Ciemięga