Posts List
  1. Tips 1: 不要重复添加Fragment
  2. Tips 2: 向Fragment传参数
  3. Tips 3: Fragment替换时使用addToBackStack
  4. Activity与Fragment交互、Fragment与Fragment交互

Fragment使用时的一些Tips

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);
// 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传参数

1
2
3
// 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

1
2
3
4
5
6
7
8
9
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

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);
// 检查外部的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进行交互

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) {
// 直接调用ArticleFragment的updateArticleView方法进行文章的更新
articleFrag.updateArticleView(position);
}
}
}

本文作者:JeremyHe
本文链接:https://alzz.me/posts/2015/05/19/11_fragment-in-android-developer/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

联系作者
微信。◕‿◕。