FragmentNav可以讓你以類(lèi)似啟動(dòng)Activity的操作啟動(dòng)/結(jié)束一個(gè)/多個(gè)Fragment肃拜。將你從冗長(zhǎng)的AndroidManifest配置中解放出來(lái),基于Task棧管理的設(shè)計(jì)可以讓你的業(yè)務(wù)開(kāi)發(fā)更加的高效便捷雌团。
主要功能
1燃领、支持以Task棧的形式批量管理Fragment
2、支持startFragmentForResult
3锦援、支持BringToFront操作
4猛蔽、Activity.onSaveInstanceState安全
使用
1、在同一個(gè)Task中啟動(dòng)Fragment
//創(chuàng)建一個(gè)帶有一個(gè)String類(lèi)型數(shù)據(jù)和特定頁(yè)面動(dòng)畫(huà)的FragmentIntent
FragmentIntent fragmentIntent = new FragmentIntent(Fm01.class)
.putExtra(KEY_STRING, "StringExtra")
//可以通過(guò)FragmentIntent.getDefault()來(lái)配置默認(rèn)頁(yè)面動(dòng)畫(huà)
.setAnim(R.anim.page_start, R.anim.page_finish, R.anim.page_show, R.anim.page_hide);
//啟動(dòng)該Fragment
startFragment(fragmentIntent);
運(yùn)行圖:
2灵寺、在一個(gè)新的Task中批量啟動(dòng)Fragment
此方式可以方便的以業(yè)務(wù)棧的形式組織和管理Fragment曼库,比如可以將多個(gè)獲取用戶(hù)輸入的頁(yè)面在一個(gè)Task中啟動(dòng),在用戶(hù)輸入完畢并提交數(shù)據(jù)后一次性結(jié)束整個(gè)業(yè)務(wù)棧略板。
//添加FragmentIntent.FLAG_NEW_TASK以在一個(gè)新的task中啟動(dòng)FragmentIntent intent11 = new FragmentIntent(Fm11.class).addFlag(FragmentIntent.FLAG_NEW_TASK);
FragmentIntent intent12 = new FragmentIntent(Fm12.class);
FragmentIntent intent21 = new FragmentIntent(Fm21.class).addFlag(FragmentIntent.FLAG_NEW_TASK);
startFragment(intent11, intent12, intent21);
運(yùn)行圖:
3毁枯、結(jié)束Task
//結(jié)束當(dāng)前Fragment所在的task,也可以調(diào)用FragmentNav.finishTask(Fragment)來(lái)結(jié)束指定Fragment的task蚯根,
//或調(diào)用FragmentNav.finishTasks(int... taskIds)來(lái)同時(shí)結(jié)束多個(gè)Task
finishTask();
運(yùn)行圖:
4后众、BringToFront
該操作類(lèi)似Activity的BRING_TO_FRONT操作,效果為將一個(gè)已啟動(dòng)的非當(dāng)前Fragment“帶到”當(dāng)前顯示颅拦。
//將某個(gè)已啟動(dòng)的Fragment置頂顯示
startFragment(new FragmentIntent(Fm01.class).addFlag(FragmentIntent.FLAG_BRING_TO_FRONT))
運(yùn)行圖:
5、startFragmentForResult
類(lèi)似Activity中的startActivityForResult操作教藻,在Fragment中調(diào)用setResult()后再回到調(diào)用頁(yè)面可以將結(jié)果通過(guò)onFragmentResult(int requestCode, int resultCode, Object data);回調(diào)傳遞給調(diào)用頁(yè)面距帅。
//啟動(dòng)Fm01
startFragmentForResult(REQUEST_CODE, new FragmentIntent(Fm01.class));
@Override
public void onFragmentResult(int requestCode, int resultCode, Object data) {
super.onFragmentResult(requestCode, resultCode, data);
Androids.shortToast(getContext(), "onFragmentResult:\nRequestCode=>%s\nResultCode=>%s\nData=>%s", requestCode, resultCode, data);
}
// ****** Fm01中setResult調(diào)用,和Activity.setResult()類(lèi)似 ******
setResult(setResult(RESULT_OK, "FragmentResultFrom[" + getClass().getSimpleName() + "]"));
finish();
運(yùn)行圖:
當(dāng)然也可以同時(shí)啟動(dòng)多個(gè)Fragment來(lái)獲取結(jié)果,此時(shí)在任一被此次操作啟動(dòng)并且處于顯示狀態(tài)的Fragment中進(jìn)行setResult操作后返回啟動(dòng)頁(yè)面就可返回結(jié)果
FragmentIntent intent01 = new FragmentIntent(Fm01.class).addFlag(FragmentIntent.FLAG_NEW_TASK);
FragmentIntent intent21 = new FragmentIntent(Fm21.class).addFlag(FragmentIntent.FLAG_NEW_TASK);
FragmentIntent intent23 = new FragmentIntent(Fm23.class);
startFragmentForResult(REQUEST_CODE, intent01, intent21, intent23);
//****** Fm21中setResult調(diào)用 ******
setResult(setResult(RESULT_OK, "FragmentResultFrom[" + getClass().getSimpleName() + "]"));
//參數(shù)1和2為Fm01和Fm21所在的task的id
getFragmentNav().finishTasks(1, 2);
運(yùn)行圖:
6、Activity.onSaveInstanceState() Safe
FragmentNav會(huì)自動(dòng)保存在Activity.onSaveInstanceState()調(diào)用之后的對(duì)Fragment的操作并且在App被帶回前臺(tái)時(shí)執(zhí)行操作
運(yùn)行圖:
集成
1括堤、添加依賴(lài)
compile 'ray.easydev.fragmentnav:fragmentnav:0.1.2'
2碌秸、創(chuàng)建一個(gè)Activity繼承FnFragmentActivity或FnAppCompatActivity绍移,以繼承FnFragmentActivity為例:
MainActivity.java
public class MainActivity extends FnFragmentActivity {
static {
//Configure the default fragment animations
FragmentIntent.getDefault().setAnim(
R.anim.page_start, //animation for start a fragment
R.anim.page_finish, //animation for finish a fragment
R.anim.page_show, //animation for show the previous fragment when finish a fragment
R.anim.page_hide //animation for hide the fragment when start a new fragment
);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public int getFragmentContainerId() {
//The id of ViewGroup that contains fragments
return R.id.fragment_container;
}
@NonNull
@Override
public FragmentIntent[] getStartIntents() {
//Configure the enter fragments
return new FragmentIntent[]{
//Configure the start fragment with activity intent's extras
new FragmentIntent(FmEnter.class, getIntent().getExtras())
//Disable the start animation to avoid the conflict with the activity's start animation
.addFlag(FragmentIntent.FLAG_NO_START_ANIMATION)
};
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
或者,你可以實(shí)現(xiàn)你自己的Activity讥电,例如:
public class MyActivity extends FragmentActivity implements FnActivity {
private FragmentNav mFragmentNav;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//FragmentNav must be created before super.onCreate
mFragmentNav = FragmentNavHelper.createBeforeSuperOnCreate(this, R.id.fragment_container, savedInstanceState);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState == null){
//If this app is not in recovery, start a new fragment
mFragmentNav.startFragment(null, new FragmentIntent(FmEnter.class, getIntent().getExtras())
.addFlag(FragmentIntent.FLAG_NO_START_ANIMATION));
}
}
@NonNull
@Override
public FragmentNav getFragmentNav() {
return mFragmentNav;
}
@Override
public void onBackPressed() {
//Pass back pressed event to FragmentNav
FragmentNavHelper.onBackPressed(getFragmentNav());
}
}
3、繼承FnFragment實(shí)現(xiàn)自己的Fragment
class FmEnter extends FnFragment {
}
單元測(cè)試
目前已經(jīng)對(duì)主要實(shí)現(xiàn)邏輯進(jìn)行了單元測(cè)試,結(jié)果如下怜珍,沒(méi)有測(cè)試到的主要是一些Exception處理分支和一些暫未開(kāi)放的功能乔外,后續(xù)會(huì)盡量補(bǔ)上。
兼容性測(cè)試結(jié)果如下:
Android Sdk Version | Android Support Version |
---|---|
4.2.2, 4.4.4, 5.1, 6.0.1, 7.0 | 24.2.1, 25.3.0, 26.1.0 |
最后
如果FragmentNav給你帶來(lái)了幫助纠炮,請(qǐng)給我一個(gè)Star以示支持吧??