Java 碎片替换不';我不总是工作
这就是我的情况: 我在FragmentStatePagerAdapter中动态添加了几个片段,效果很好。但现在我想在按下按钮时替换一个片段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
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);
}