2

これは私の状況です:

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にハードコードされたフラグメントタグはありません)

明確にするために:これは次のフラグメントが異なるクラスからのものである場合に発生します、問題ありません 正常

これは、次のフラグメントが同じレイアウトとクラスからのものである場合に発生します。 問題

4

1 に答える 1

4

コードをテストする必要がありますが、私が見たところ、これを機能させる最も簡単な方法は、同じフラグメントクラスであっても、新しいフラグメントを取得することです。

フラグメントhow=XmlParserSax.howFragments.get(i);

この関数がフラグメントの新しいインスタンスを返す場合は、機能するはずです。

お役に立てば幸い

編集 :

フラグメントが作成された後、アクティビティがボタンにアクセスできると確信しています。それ以外の場合は、アダプターでクリックを処理するためのハンドラーが必要です。フラグメントのリストが静的であることがわかります(推奨されません)。ページラダプターの設定方法のコードを追加していないので、使用しているリストがわかりませんが、そのリストの項目を変更する必要があります。ページャーを初期化したアクティビティから、パブリック関数を呼び出して、現在のページャーアイテムページャーを置き換えることができます。(ViewPager.getCurrentItem()を使用できます)

私はテストしていないので、それを完成させるために微調整して遊んでみる必要があるかもしれません。

お役に立てれば。

ここにサンプルがあります:

 public static class MyAdapter extends FragmentStatePagerAdapter {
  ArrayList<Fragment> fragmentArray = new ArrayList<Fragment();
   public MyAdapter(FragmentManager fm) {
       super(fm);
   }

   //didn't put in the function to populate the list with fragments

  public void replaceItem(Fragment newFrag, int pos){
       fragmentArray.remove(pos);
       fragmentArray.add(pos,newFrag);
       notifyDataSetChanged();
  }


  @Override
   public int getCount() {
       return fragmentArray.size();
   }

   @Override
   public Fragment getItem(int position) {
       return fragmentArray.get(position);
   }

}

于 2013-03-18T17:05:16.590 に答える