您的位置:首页 > 其它

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: