建立新项目,选择Tabbed Activityide
默认就有2个Fragment,这里咱们删除相关代码。spa
在切换时
FragmentPagerAdapter
onDestroyView
onCreateView
Fragment没有被销毁
FragmentStatePagerAdapter
onDestroyView
onDestroy
onCreate
onCreateView
Fragment被销毁
建议ViewPager对象使用setOffscreenPageLimit方法
建立新的Fragment而且修改代码指针
New ->Fragment->blank Fragmentcode
FragmentPagerAdapter子类中的getItem修改以下对象
Fragment fragment = null; switch (position) { case 0: fragment=new HomeFragment(); break; case 1: fragment=new AboutFragment(); break; } return fragment;
Activity中调用Fragment对象blog
建立接口
在FragmentPagerAdapter 的instantiateItem的时候添加Fragment,ci
在destroyItem的时候删除Fragment。rem
所有代码get
public class MainActivity extends AppCompatActivity { public SparseArray<Fragment> fragments = new SparseArray<>(); private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { @NonNull @Override public Fragment getItem(int position) { Fragment fragment = null; switch (position) { case 0: fragment=new HomeFragment(); break; case 1: fragment=new AboutFragment(); break; } return fragment; } @Override public int getCount() { return TAB_TITLES.length; } @Nullable @Override public CharSequence getPageTitle(int position) { return getResources().getString(TAB_TITLES[position]); } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { Fragment fragment= (Fragment)super.instantiateItem(container, position); fragments.put(position,fragment); return fragment; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { fragments.remove(position); super.destroyItem(container, position, object); } }); TabLayout tabs = findViewById(R.id.tabs); tabs.setupWithViewPager(viewPager); } }
Fragment调用Activity中的方法
方法1:使用getActivity,转成MainActivity,在调方法
方法2;在Fragment中建立Listener 接口,对象指针,设置对象的方法
public static interface onSpecialListener{ void onSL(String msg); } private onSpecialListener mListener; public void setmListener(onSpecialListener listener) { mListener=listener; }
在Activity中设置Fragment的该接口对象
fragment=new HomeFragment(); HomeFragment homeFragment=(HomeFragment)fragment; homeFragment.setmListener(new HomeFragment.onSpecialListener() { @Override public void onSL(String msg) { ShowMsg(msg); } });
在Fragment中有需求的时候调用该接口,
Button btnHome = v.findViewById(R.id.btnHome); btnHome.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mListener != null) { mListener.onSL("From HomeFragment to MainAct"); } } }); return v;