【发布时间】:2017-06-01 16:09:39
【问题描述】:
我正在尝试用另一个片段替换 ViewPager 中的片段之一。
pager 由两个页面组成: Fragment1 , Fragment2 在fragment2里面,有一个按钮。当我单击该按钮时,它将用 Fragment3 替换当前片段 Fragment2。对于 Fragment2,我希望它被销毁,不再存在。
实现代码:
-
activity_main 的布局:
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay"> </android.support.v7.widget.Toolbar> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"/> -
主要活动:
private SectionsPageAdapter mSectionsPageAdapter; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.container); setupViewPager(mViewPager); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); mSectionsPageAdapter.clearAll(); } private void setupViewPager(ViewPager viewPager) { SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager()); adapter.addFragment(new Tab1Fragment(), "Tab 1"); adapter.addFragment(new Tab2Fragment(), "Tab 2"); adapter.notifyDataSetChanged() viewPager.setAdapter(adapter); } -
适配器:
public class SectionsPageAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } public SectionsPageAdapter(FragmentManager fm) { super(fm); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } } -
片段2:
public class Tab2Fragment extends Fragment { private static final String TAG = "Tab2Fragment"; private Button btnTEST; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab2_fragment,container,false); btnTEST = (Button) view.findViewById(R.id.btnTEST2); btnTEST.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getActivity(), "TESTING BUTTON CLICK 2", Toast.LENGTH_SHORT).show(); } }); return view; } }
更新:
我尝试在适配器中实现 clearAll 方法,我注意到 mFragmentList.size() 返回 0 为什么?
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
Log.d("tmz",mFragmentList.size()+" From addFragment"); // return 1 & 2
}
@Override
public int getCount() {
return mFragmentList.size();
Log.d("tmz",mFragmentList.size()+"getCount "); // return 2
}
public void clearAll(){
Log.d("tmz",mFragmentList.size()+" From addFragment"); // return 0 why ?
for(int i=0; i<mFragmentList.size(); i++)
fragMan.beginTransaction().remove(mFragmentList.get(i)).commit();
mFragmentList.clear();
mFragmentList=new ArrayList<Fragment>();
notifyDataSetChanged();
}
【问题讨论】:
-
你在哪里调用 clearAll()?
-
此外,您的 addFragment() 方法需要在其末尾调用 notifyDataSetChanged() 才能使添加生效。
-
我对我的代码进行了更改,我将 clearAll() 放在 oncreate() 中只是为了测试 mFragmentList 的大小,但在我将 notifyDataSetChanged() 放在之后仍然给了我一个零设置适配器。
-
如果你在调用
setupViewPager()之后调用它,那么它不应该返回0。否则你可以在addFragment()中的某个地方放置一个断点并在运行时检查mFragmentList中的值. -
我做到了,添加 Fragment() 和 getCount() 的大小将是 2 ,但是对于 clearAll() 是零,我不知道为什么?
标签: android android-fragments android-viewpager android-tablayout