这是我的情况:
我有几个片段动态添加到 FragmentStatePagerAdapter,这很好用。但是现在我希望能够在按下按钮时替换片段。
public class QuestionFragment extends UpperFragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setRetainInstance(true);
CustomViewPager.enabled = true;
View rootView = inflater.inflate(R.layout.question, container, false);
Button btn = ((Button) rootView.findViewById(R.id.bQuestion));
if (how == true) {
btn.setVisibility(View.VISIBLE);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// lijst afgaan met alle how en kijken welke id nodig is
for (int i = 0; i < XmlParserSax.howFragments.size(); i++) {
Fragment how = XmlParserSax.howFragments.get(i);
if (howId.equals(((UpperFragment) how).getIdNum())) {
FragmentTransaction transaction = getFragmentManager()
.beginTransaction();
transaction
.replace(R.id.flQuestion, how, "howFragment")
.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null).commit();
break;
}
}
}
});
} else {
btn.setVisibility(View.GONE);
}
return rootView;
}
因此,当我按下按钮时,当前布局(R.id.flQuestion)被新片段替换。这行得通,但棘手的部分来了:
当我滑动到下一个片段并使用按钮滑动到片段时,它会继续工作,但是如果我滑动 2 次到下一个片段(相同类型的 QuestionFragment),它会执行新片段的功能,但不会显示新片段..所以它似乎不能替换 R.id.flQuestion 因为它可能存储在内存中?
即使接下来的 2 个片段具有相同的类型和相同的布局(R.id.flQuestion),我也需要确保始终替换片段。
这是新 frag 的类布局
public class HowFragment extends UpperFragment {
..
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setRetainInstance(true);
View rootView = inflater.inflate(R.layout.how, container, false);
//if back key pressed return to layout of Question
rootView.setFocusableInTouchMode(true); //this line is important
rootView.requestFocus();
rootView.setOnKeyListener( new View.OnKeyListener()
{
@Override
public boolean onKey( View v, int keyCode, KeyEvent event )
{
if( keyCode == KeyEvent.KEYCODE_BACK )
{
CustomViewPager.enabled = true;
return false;
}
return true;
}
} );
//don't allow pushing button again
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return true;
}
});
return rootView;
}
同样重要的是要告诉:我对两个片段都使用了框架布局(因此 xml 中没有硬编码的片段标签)
说清楚:当下一个片段来自不同的类时会发生这种情况,没问题
当下一个片段来自相同的布局和类时会发生这种情况: