首先,我知道这些主题在stackoverflow上已经花了很多时间,但是我没有找到解决问题的方法。其次,我是法国人,所以我的英语并不完美,对不起,请告诉我您是否听不懂。结束本介绍,这是我第一次处理 fragment ,因此,对不起,如果有我不了解的内容,对不起!

我有三个按钮,可以在三个 fragment 之间切换。
在这些 fragment 之一中,我有一个包含两个 fragment 的 View 寻呼机。目前,每个 fragment (有5个)仅包含一个TextView。
我正在使用最新版本的android-support-v4(我在stackoverflow中读了很多主题,说最新版本的支持解决了我遇到的“递归输入executePendingTransactions”错误)。

我的两个问题:

  • 当我在一个按钮中单击两次时,我有一个IllegaleStateException“无法更改 fragment 的标签”。我可以通过在onButtonSelected方法上创建一个新的 fragment 来解决此问题,但是出于内存原因和功能原因,我不想每次都重新创建该 fragment :fragment必须保持其状态。这个问题不是我的主要问题,确实,我知道可以在用户已经处于 fragment 状态时禁用按钮,但是在未完成此管理时出现异常是很奇怪的,不是吗?
  • 当我使用 View 分页器从 fragment 中取出并返回到该 fragment 时,我有一个IllegalStateException“到executePendingTransactions的递归项”。我可以通过在处理程序上设置适配器来解决此问题,或者使用FragmentStatePagerAdapter而不是FragmentPageAdapter(请参见Display fragment viewpager within a fragment),但是即使我的应用程序没有崩溃,当我使用 View 分页器返回到 fragment 时, View 分页器也消失了!

  • 你能帮助我吗 ?

    Java源代码在下面,我认为布局源代码是没有用的。

    主要 Activity :
    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();
    
    }
    
    }
    

    fragment 2和 fragment 3仅会使仅包含TextView的布局膨胀。
    fragment 一(请注意,我使用的是DirectionalViewPager-lib-而不是ViewPager):
    public class FragmentOne extends SherlockFragment{
    
    private FragmentOneAdapter fragmentOneAdapter;
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
    
        super.onActivityCreated(savedInstanceState);
    
        // Set up the pager
        final DirectionalViewPager pager = (DirectionalViewPager)getActivity().findViewById(R.id.pager);
        if (this.fragmentOneAdapter== null){
            this.fragmentOneAdapter= new FragmentOneAdapter (getActivity().getSupportFragmentManager());
        }
        pager.setAdapter(fragmentOneAdapter);
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_landing_page, container, false);
    }
    

    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();
    }
    
    }
    

    预先感谢您的帮助!

    最佳答案

    我已经解决了我的问题!

    我只是将getSupportFragmentManager()上的FragmentOne替换为getChildFragmentManager()。然后,我通过每次创建一个新的fragment实例而不是使用三个不同的实例来编辑onButtonSelected的方法(如果我不这样做,则有一个异常(exception):java.lang.IllegalStateException: Activity has been destroyed)。

    这个解决方案仍然有一个问题:每次在fragmentOnefragmentTwofragmentThree之间切换时,我都会丢失每个 fragment 的状态。您对此有解决方案吗?

    关于android - 处理 fragment 并查看传呼机: can't change tag of fragment AND Recursive entry to executePendingTransactions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15076839/

    10-11 22:23
    查看更多