片段替换不起作用

时间:2013-03-18 16:40:30

标签: java android android-fragments

这是我的情况:

我有一些动态添加到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;
}

同样重要的是告诉我:我正在使用两个片段的framelayout(因此xml中没有硬编码片段标签)

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

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

1 个答案:

答案 0 :(得分:4)

我将不得不测试代码,但从我看到的,最简单的方法就是获取新的Fragment,即使它是相同的片段类。

  

片段如何= XmlParserSax.howFragments.get(i);

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

希望有所帮助

编辑:

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

}