片段:添加片段后不调用onCreateView

时间:2014-07-03 19:02:50

标签: android android-fragments

我有简单的应用片段。

开头的片段列表是空的。

还有2个按钮:

添加碎片

删除碎片

以下用例:

  1. 添加片段
  2. 添加片段
  3. 删除第一个片段
  4. 添加片段
  5. 结果,第4步中的onCreateView()未执行。

    如果我在第5步再次添加片段 - 再次执行onCreateView。

    为什么会这样?我在谷歌找不到正确的答案。

    源代码:

    public class MyActivity extends FragmentActivity {
    
    private ViewPager pager;
    private FragmentAdapter adapter;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pager = (ViewPager) findViewById(R.id.pager);
        final Button addButton = (Button) findViewById(R.id.add_button);
        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.addFragment(new MyFragment());
                adapter.notifyDataSetChanged();
            }
        });
        final Button removeButton = (Button) findViewById(R.id.remove_button);
        removeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.removeFragment(0);
                adapter.notifyDataSetChanged();
            }
        });
        adapter = new FragmentAdapter(getSupportFragmentManager());
        pager.setAdapter(adapter);
        pager.setOffscreenPageLimit(10);
    }
    
    private class FragmentAdapter extends FragmentStatePagerAdapter {
    
        final List<MyFragment> fragments = new ArrayList<MyFragment>();
    
        public FragmentAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int i) {
            return fragments.get(i);
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        public void addFragment(MyFragment fragment) {
            fragments.add(fragment);
        }
    
        public void removeFragment(int index) {
            fragments.remove(index);
        }
    
    }
    
    private class MyFragment extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment, container, false);
        }
    
    }
    

    }

    main.xml中

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add"
            android:id="@+id/add_button"/>
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Remove first"
            android:id="@+id/remove_button"/>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>
    

    fragment.xml之

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/textView"
            android:layout_gravity="center_horizontal"/>
    
    </LinearLayout>
    

2 个答案:

答案 0 :(得分:1)

只有在屏幕上绘制实际片段时才会调用

OnCreateView()。由于您在开头删除了一个片段,因此寻呼机不再查看相同的片段。

为了更好地理解发生了什么,在每个片段上放置一个可见数字,然后尝试添加和删除片段。

答案 1 :(得分:0)

问题是'FragmentStatePagerAdapter'及其实现方式。修复它的方法是:

  1. 转到googlesource并获取'FragmentStatePagerAdapter'的来源。
  2. 重构(名称,包等),使其成为您自己的实现。
  3. 从您的新版“FragmentStatePagerAdapter”
  4. 延伸
  5. 使用以下步骤修改新版本的“FragmentStatePagerAdapter”:
  6. a)在'instantiateItem()'函数中将mFragments.set(index,object)命令更改为mFragments.add(index,object)。 b)在'destroyItem'函数中将mFragments.set(index,object)命令更改为mFragments.remove(index)。

    所有这一切都假设您使用ArrayList来保存“extends”类中的片段,并且它们会被同步以匹配ViewPager。

    您需要为每个片段添加一个'pageIndex',这样您就可以在项目“移动”时告诉ViewPager(由于删除了一个项目,这不是最后一项)。

    这需要几天才能完成......希望它可以帮助某人: - )