Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 处理片段和视图寻呼机:can';t将片段和递归项的标记更改为executePendingTransactions_Android_Android Fragments_Android Viewpager - Fatal编程技术网

Android 处理片段和视图寻呼机:can';t将片段和递归项的标记更改为executePendingTransactions

Android 处理片段和视图寻呼机:can';t将片段和递归项的标记更改为executePendingTransactions,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,首先,我知道这些主题已经在stackoverflow上创建了很多时间,但我还没有找到解决问题的方法。第二,我是法国人,所以我的英语不是很好,对不起,如果你不懂的话,请告诉我。为了完成这篇介绍,这是我第一次处理片段,所以,如果有什么我没有很好理解的话,很抱歉 我有三个按钮,可以在三个片段之间切换。 在其中一个片段中,我有一个带有两个片段的视图寻呼机。目前,每个片段(共5个)只包含一个TextView。 我使用的是最新版本的android-support-v4(我在stackoverflow中读到很

首先,我知道这些主题已经在stackoverflow上创建了很多时间,但我还没有找到解决问题的方法。第二,我是法国人,所以我的英语不是很好,对不起,如果你不懂的话,请告诉我。为了完成这篇介绍,这是我第一次处理片段,所以,如果有什么我没有很好理解的话,很抱歉

我有三个按钮,可以在三个片段之间切换。 在其中一个片段中,我有一个带有两个片段的视图寻呼机。目前,每个片段(共5个)只包含一个TextView。 我使用的是最新版本的android-support-v4(我在stackoverflow中读到很多主题,说最新版本的support解决了我遇到的“Recursive entry to executePendingTransactions”错误)

我的两个问题:

  • 当我在一个按钮中单击两次时,我有一个IllegaleStateException“不能更改片段的标记”。我可以通过在onButtonSelected方法上创建一个新的片段来修复这个问题,但我不想每次都重新创建片段,因为内存原因和功能原因:片段必须保持其状态。这个问题不是我的主要问题,事实上,我知道当用户已经在fragment上时禁用按钮是可能的,但是当这个管理没有完成时出现异常是很奇怪的,不是吗

  • 当我使用查看页面从片段中出来,返回到这个片段时,我有一个非法状态异常“Recursive entry to executePendingTransactions”。我可以通过在处理程序上设置适配器来解决这个问题,或者使用FragmentStatePagerAdapter而不是FragmentPageAdapter(请参阅),但是即使我的应用程序没有崩溃,当我使用视图寻呼机返回到片段时,视图寻呼机已经失效

你能帮我吗

Java源代码是贝娄,布局源代码,我认为,是无用的

主要活动:

public class MainActivity extends SherlockFragmentActivity{

private SherlockFragment fragmentOne, fragmentTwo, fragmentThree;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

//      this.fragmentOne = new fragmentOne();
//      this.fragmentTwo = new fragmentTwo();
//      this.fragmentThree = new fragmentThree();
// Call new or instanciate ? What's the correct way ?

    this.fragmentOne = (SherlockFragment) SherlockFragment.instantiate(this, FragmentOne.class.getName());
    this.fragmentTwo = (SherlockFragment) SherlockFragment.instantiate(this, FragmentTwo.class.getName());
    this.fragmentThree = (SherlockFragment) SherlockFragment.instantiate(this, FragmentThree.class.getName());

    // Add fragment
    FragmentTransaction transaction = (
        this.getSupportFragmentManager().beginTransaction()
    );      
    transaction.add(
        R.id.tab_fragment,
        this.fragmentOne,
        this.fragmentOne.toString()
    );
    transaction.commit();

}

public void onButtonSelected(View v){

    switch (v.getId()){

        case R.id.button_one_tab:{
            showFragment(this.fragmentThree);
            break;
        }
        case R.id.button_two_tab:{
            showFragment(this.fragmentOne);
            break;
        }
        case R.id.button_three_tab:{
            showFragment(this.fragmentTwo);
            break;
        }
        default:{
            break;
        }

    }

}

public void showFragment(SherlockFragment fragmentToShow){

    FragmentTransaction transaction = (
        this.getSupportFragmentManager().beginTransaction()
    );

    transaction.replace(R.id.tab_fragment, fragmentToShow, fragmentToShow.toString());
    transaction.commit();

}

}
片段2和片段3仅对仅包含TextView的布局进行充气。 片段一(请注意,我使用的是DirectionalViewPager—一个库—而不是ViewPager):

FragmentOneAdapter:

public class FragmentOneAdapter extends FragmentPagerAdapter{

private ArrayList<SherlockFragment> fragmentsList;

public FragmentOneAdapter(FragmentManager fragmentManager) {

    super(fragmentManager);

    SherlockFragment fragmentFour = new FragmentFour();
    SherlockFragment fragmentFive = new FragmentFive();

    this.fragmentsList = new ArrayList<SherlockFragment>();
    this.fragmentsList.add(fragmentFour);
    this.fragmentsList.add(fragmentFive);

}

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

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

}
公共类FragmentOneAdapter扩展了FragmentPagerAdapter{
私有ArrayList碎片列表;
公共FragmentOneAdapter(FragmentManager FragmentManager){
超级(碎片管理器);
SherlockFragmentFour=新的fragmentFour();
SherlockFragmentFive=新的fragmentFive();
this.fragmentsList=新的ArrayList();
这个.fragmentsList.add(fragmentFour);
这个.fragmentsList.add(fragmentFive);
}
@凌驾
公共片段getItem(int位置){
返回此.fragmentsList.get(位置);
}
@凌驾
public int getCount(){
返回此.fragmentsList.size();
}
}

谢谢你的帮助

我已经解决了我的问题

我只需将
FragmentOne
上的
getSupportFragmentManager()
替换为
getChildFragmentManager()
。然后,我编辑了我的
onButtonSelected
方法,每次都创建一个新的fragment实例,而不是使用我的三个不同实例(如果我不这样做,我有一个异常:
java.lang.IllegalStateException:活动已被销毁


这个解决方案仍然有一个问题:每次在
fragmentOne
fragmentTwo
fragmentTwo
之间切换时,我都会丢失每个片段的状态。你有解决方法吗?

天哪,我几个月来一直遇到类似的问题,我甚至对解决它失去了希望,而且很容易!
public class FragmentOneAdapter extends FragmentPagerAdapter{

private ArrayList<SherlockFragment> fragmentsList;

public FragmentOneAdapter(FragmentManager fragmentManager) {

    super(fragmentManager);

    SherlockFragment fragmentFour = new FragmentFour();
    SherlockFragment fragmentFive = new FragmentFive();

    this.fragmentsList = new ArrayList<SherlockFragment>();
    this.fragmentsList.add(fragmentFour);
    this.fragmentsList.add(fragmentFive);

}

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

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

}