これは私の状況です:
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)が新しいフラグメントに置き換えられます。これは機能しますが、注意が必要な部分は次のとおりです。
次のフラグメントにスライドし、ボタンを使用してフラグメントにスライドすると、機能し続けますが、次のフラグメント(同じタイプのQuestionFragment)に2回スライドすると、新しいフラグメントの機能は実行されますが、表示されません。新しいフラグメント..メモリに保存されているため、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にハードコードされたフラグメントタグはありません)
明確にするために:これは次のフラグメントが異なるクラスからのものである場合に発生します、問題ありません
これは、次のフラグメントが同じレイアウトとクラスからのものである場合に発生します。