Fragment使用时的一些Tips
2015-10-29 16:32
435 查看
原文地址:http://zlv.me/posts/2015/05/19/11_fragment-in-android-developer/
Tips 1: 不要重复添加Fragment
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); // However, if we're being restored from a previous state, // then we don't need to do anything and should return or else // we could end up with overlapping fragments. if (savedInstanceState != null) { return; } // Create a new Fragment to be placed in the activity layout HeadlinesFragment firstFragment = new HeadlinesFragment(); // Add the fragment to the 'fragment_container' FrameLayout getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, firstFragment).commit(); }
通过判断savedInstanceState是否为null来得知Activity是否已经创建过
如果是,则没必要再重新添加Fragment,否则会导致Fragment重叠。
Tips 2: 向Fragment传参数
// In case this activity was started with special instructions from an // Intent, pass the Intent's extras to the fragment as arguments 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
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit();
在进行替换Fragment操作时,如果同时通过addToBackStack把此事务添加到后退栈中
当用户按返回键时,则可以回退到前一个Fragment。
原因在于FragmentActivity的onBackPressed函数中会先判断后退栈中是否为空,如果不为空,则回滚当前事务,即返回到前一个Fragment;否则如果为空,则结束此Activity
public void onBackPressed() { if (!mFragments.popBackStackImmediate()) { finish(); } }
除此之外,如果使用了addToBackStack,则前一个Fragment并不会被销毁(destroyed),而只是停止状态(stopped)
Activity与Fragment交互、Fragment与Fragment交互
每一个Fragment都是一个独立的可重用的UI组件,不应当与其他外部的组件产生强耦合。因此,Fragment与Activity的交互同一些控件类似,都是采用提供接口的方式进行实现。而Activity则可直接调用Fragment的公有方法。
public class HeadlinesFragment extends ListFragment { OnHeadlineSelectedListener mCallback; // 对外提供的接口 public interface OnHeadlineSelectedListener { public void onArticleSelected(int position); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // 检查外部的Activity是否实现了接口,如果实现,则直接保存至mCallback中 if (activity instanceof OnHeadlineSelectedListener) { mCallback = (OnHeadlineSelectedListener) activity; } } @Override public void onListItemClick(ListView l, View v, int position, long id) { // 当需要的时候,调用接口,通知实现了此接口的Activity if (mCallback != null) { mCallback.onArticleSelected(position); } } ... }
而Activity则采用直接调用Fragment公有方法的方式与Fragment进行交互
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) { // 直接调用ArticleFragment的updateArticleView方法进行文章的更新 articleFrag.updateArticleView(position); } } }
相关文章推荐
- [Error]分布式部署SCOM安装报错——Report Services实例无效
- 分析-外星人计算Pi的程序
- Android总结篇系列:Android广播机制
- Web前端工程师-优秀简历汇总
- java中main方法详解
- 网络爬虫-理解
- ICE流传输
- 使用AndroidStudio一分钟实现Navigation Drawer 导航抽屉效果
- Android取消EditText自动获取焦点默认行为
- hdu 1430 魔板(bfs+预处理+康托展开)
- 数据库分页查询的方法
- CentOS VI常用命令
- 使用navigator.userAgent来判断浏览器类型
- 五种控制Android应用的权限的方法
- Xcode7无须开发者账号进行真机调试
- 回文数
- eclipse安装插件提示Duplicate Location错误的解决办法
- 页面传值
- 数据传输协议库(protobuffer & flatbuffer)
- jQuery瀑布流详解(PC及移动端)