Java 碎片替换不';我不总是工作

Java 碎片替换不';我不总是工作,java,android,android-fragments,Java,Android,Android Fragments,这就是我的情况: 我在FragmentStatePagerAdapter中动态添加了几个片段,效果很好。但现在我想在按下按钮时替换一个片段 public class QuestionFragment extends UpperFragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState

这就是我的情况:

我在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;
}
还有一点很重要:我对这两个片段都使用框架布局(因此xml中没有硬编码的片段标记)

为了说明这一点: 这发生在下一个片段来自不同的类时,没有问题

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

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

Fragment how=XmlParserSax.howFragments.get(i)

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

希望有帮助

编辑:

我很确定在创建片段后,活动可以访问按钮。 否则,您需要一个处理程序来传递单击以在适配器中处理它。我看到您的片段列表是静态的(不推荐)。由于您尚未添加任何关于如何设置pageradapter的代码,我不知道您使用的是什么列表,但您需要更改该列表中的项目。在初始化寻呼机的活动中,可以调用public函数来替换当前寻呼机项pager。(您可以使用ViewPager.getCurrentItem())

我还没有测试过,所以你可能需要调整和玩来完善它

希望这有帮助

以下是一个示例:

公共静态类MyAdapter扩展了FragmentStatePagerAdapter{

ArrayList fragmentArray=new ArrayList我必须测试代码,但从我看到的情况来看,最简单的方法是获取新片段,即使它是相同的片段类

Fragment how=XmlParserSax.howFragments.get(i)

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

希望有帮助

编辑:

我很确定在创建片段后,活动可以访问按钮。 否则,您需要一个处理程序来传递单击以在适配器中处理它。由于您尚未添加任何关于如何设置pageradapter的代码,我不知道您使用的是什么列表,但您需要更改该列表中的项目。从初始化寻呼机的活动中,您可以调用公共函数来替换当前的寻呼机项目寻呼机。(您可以使用ViewPager.getCurrentItem()

我还没有测试过,所以你可能需要调整和玩来完善它

希望这有帮助

以下是一个示例:

公共静态类MyAdapter扩展了FragmentStatePagerAdapter{

ArrayList fragmentArray=new ArrayListhmm我想我不明白你的意思,也许我也忘了告诉你我从一个只包含How片段的列表中得到How片段..这是因为我需要正确片段问题中的正确片段How(因为不同的How有不同的问题)也许您缺少一个notifydatasetchanged()?据我所知,statepager用于在片段和按钮之间滑动以打开新片段。这意味着,既然您已经在viewpager上,您可以将当前的viewpager项替换为您想要的任何片段,只需调用notifydatasetchanged来更新adapter.hmm,这听起来是个好主意,其中我应该把notifydatasetchanged()放进去吗?那么?也许你可以给我举个例子,因为我无法从我认为的类中访问适配器?我已经尝试过了,现在它正在做的是:当我按下按钮时,什么都没有发生,只是当我再滑动2个片段,然后再向后滑动时,它发生了变化,所以它看起来像notifydatasetchanged()不起作用?这样做的一个缺点可能是,当我按下“后退”按钮时,它不会更改为原始片段,这就是意图?到目前为止,对于notifydatasetchanged()…它是一个bug,请使用@Override public int getItemPosition(Object Object Object){return POSITION_NONE;}修复它嗯,我想我不明白你的意思,也许我也忘了告诉你,我从一个只包含How片段的列表中获取How片段..这是因为我需要正确片段问题中的正确片段How(因为有不同的问题具有不同的How)也许你缺少notifydatasetchanged()?据我所知,statepager用于在片段和按钮之间滑动以打开新片段。这意味着,既然您已经在viewpager上,您可以将当前的viewpager项替换为您想要的任何片段,只需调用notifydatasetchanged来更新adapter.hmm,这听起来是个好主意,其中我应该把notifydatasetchanged()放进去吗?那么?也许你可以给我举个例子,因为我无法从我认为的类中访问适配器?我已经尝试过了,现在它正在做的是:当我按下按钮时,什么都没有发生,只是当我再滑动2个片段,然后再向后滑动时,它发生了变化,所以它看起来像notifydatasetchanged()不起作用?这样做的一个缺点可能是,当我按下“后退”按钮时,它不会更改为原始片段,这就是意图?到目前为止,对于notifydatasetchanged()…它是一个bug,请使用@Override public int getItemPosition(Object Object Object){return POSITION_NONE;}修复它
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;
}
 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);
   }