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)被新片段替换。这行得通,但棘手的部分来了:

当我滑动到下一个片段并使用按钮滑动到片段时,它会继续工作,但是如果我滑动 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 中没有硬编码的片段标签)

说清楚:当下一个片段来自不同的类时会发生这种情况,没问题 普通的

当下一个片段来自相同的布局和类时会发生这种情况: 问题

4

1 回答 1

4

我必须测试代码,但据我所知,最简单的方法是获取新的 Fragment,即使它是同一个片段类。

片段方法 = XmlParserSax.howFragments.get(i);

如果此函数返回片段的新实例,它应该可以工作。

希望有帮助

编辑 :

我很确定活动可以在创建片段后访问按钮。否则,您需要一个处理程序来传递单击以在适配器中处理它。我看到您的片段列表是静态的(不推荐)。由于您没有为如何设置 pageradapter 添加任何代码,因此我不知道您使用的是哪个列表,但您需要更改该列表中的项目。从你初始化pager的Activity中,你可以调用public函数来替换当前pager item pager。(您可以使用 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 回答