Tips 1: 不要重复添加Fragment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); if (savedInstanceState != null) { return; } HeadlinesFragment firstFragment = new HeadlinesFragment(); getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, firstFragment).commit(); }
|
通过判断savedInstanceState是否为null来得知Activity是否已经创建过
如果是,则没必要再重新添加Fragment,否则会导致Fragment重叠。
Tips 2: 向Fragment传参数
1 2 3
| firstFragment.setArguments(getIntent().getExtras());
|
通过setArguments方法,可以把Activity接收到的Intent中的参数传递给Fragment
而在Fragment的onCreateView方法中,可以通过getArguments()的方式来获取传递过来的参数,然后对View进行初始化。
而官方推荐使用setArguments方式进行传递参数,而不推荐new HeadlinesFragment(“参数”);构造函数的方式传递,原因在于当系统需要重建Fragment时,setArguments方式所传递的参数仍然存在。具体分析可查看此文:http://blog.csdn.net/tu_bingbing/article/details/24143249
Tips 3: Fragment替换时使用addToBackStack
1 2 3 4 5 6 7 8 9
| FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); transaction.commit();
|
在进行替换Fragment操作时,如果同时通过addToBackStack把此事务添加到后退栈中
当用户按返回键时,则可以回退到前一个Fragment。
原因在于FragmentActivity的onBackPressed函数中会先判断后退栈中是否为空,如果不为空,则回滚当前事务,即返回到前一个Fragment;否则如果为空,则结束此Activity
1 2 3 4 5
| public void onBackPressed() { if (!mFragments.popBackStackImmediate()) { finish(); } }
|
除此之外,如果使用了addToBackStack,则前一个Fragment并不会被销毁(destroyed),而只是停止状态(stopped)
Activity与Fragment交互、Fragment与Fragment交互
每一个Fragment都是一个独立的可重用的UI组件,不应当与其他外部的组件产生强耦合。
因此,Fragment与Activity的交互同一些控件类似,都是采用提供接口的方式进行实现。而Activity则可直接调用Fragment的公有方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class HeadlinesFragment extends ListFragment { OnHeadlineSelectedListener mCallback; public interface OnHeadlineSelectedListener { public void onArticleSelected(int position); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof OnHeadlineSelectedListener) { mCallback = (OnHeadlineSelectedListener) activity; } } @Override public void onListItemClick(ListView l, View v, int position, long id) { if (mCallback != null) { mCallback.onArticleSelected(position); } } ... }
|
而Activity则采用直接调用Fragment公有方法的方式与Fragment进行交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager().findFragmentById(R.id.article_fragment); if (articleFrag != null) { articleFrag.updateArticleView(position); } } }
|
本文作者:JeremyHe
本文链接:https://alzz.me/posts/2015/05/19/11_fragment-in-android-developer/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!