Skip to content

Commit 330702f

Browse files
committed
Add fragment support.
1 parent fc3b2b8 commit 330702f

9 files changed

Lines changed: 46 additions & 4 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
8. 支持用户指定全局降级与局部降级策略
3030
9. 页面、拦截器、服务等组件均自动注册到框架
3131
10. 支持多种方式配置转场动画
32+
11. 支持获取Fragment
3233

3334
#### 二、典型应用
3435
1. 从外部URL映射到内部页面,以及参数传递与解析
@@ -298,6 +299,9 @@
298299
.withFlags();
299300
.navigation();
300301
302+
// 获取Fragment
303+
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
304+
301305
// 对象传递
302306
ARouter.getInstance()
303307
.withObject("key", new TestObj("Jack", "Rose"))

README_CN.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
8. 支持用户指定全局降级与局部降级策略
2828
9. 页面、拦截器、服务等组件均自动注册到框架
2929
10. 支持多种方式配置转场动画
30+
11. 支持获取Fragment
3031

3132
#### 二、典型应用
3233
1. 从外部URL映射到内部页面,以及参数传递与解析
@@ -300,6 +301,9 @@
300301
ARouter.getInstance()
301302
.withObject("key", new TestObj("Jack", "Rose"))
302303
.navigation();
304+
305+
// 获取Fragment
306+
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
303307

304308
// 觉得接口不够多,可以直接拿出Bundle赋值
305309
ARouter.getInstance()

app/src/main/java/com/alibaba/android/arouter/demo/BlankFragment.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import android.widget.TextView;
1010

1111
import com.alibaba.android.arouter.facade.annotation.Autowired;
12+
import com.alibaba.android.arouter.facade.annotation.Route;
1213

1314
/**
1415
* A simple {@link Fragment} subclass.
1516
*/
17+
@Route(path = "/test/fragment")
1618
public class BlankFragment extends Fragment {
1719

1820
@Autowired

app/src/main/java/com/alibaba/android/arouter/demo/MainActivity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.os.Build;
66
import android.os.Bundle;
77
import android.support.v4.app.ActivityOptionsCompat;
8+
import android.support.v4.app.Fragment;
89
import android.support.v7.app.AppCompatActivity;
910
import android.util.Log;
1011
import android.view.View;
@@ -151,6 +152,10 @@ public void onLost(Postcard postcard) {
151152
.build("/test/activity2")
152153
.navigation(this, 666);
153154
break;
155+
case R.id.getFragment:
156+
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
157+
Toast.makeText(this, "找到Fragment:" + fragment.toString(), Toast.LENGTH_SHORT).show();
158+
break;
154159
default:
155160
break;
156161
}

app/src/main/res/layout/activity_main.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@
8888
android:onClick="onClick"
8989
android:text="跳转ForResult" />
9090

91+
<Button
92+
android:id="@+id/getFragment"
93+
android:layout_width="match_parent"
94+
android:layout_height="wrap_content"
95+
android:onClick="onClick"
96+
android:text="获取Fragment实例" />
97+
9198
<Button
9299
android:id="@+id/normalNavigationWithParams"
93100
android:layout_width="match_parent"

arouter-api/src/main/java/com/alibaba/android/arouter/core/LogisticsCenter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ public synchronized static void completion(Postcard postcard) {
184184
postcard.setProvider(instance);
185185
postcard.greenChannel(); // Provider should skip all of interceptors
186186
break;
187+
case FRAGMENT:
188+
postcard.greenChannel(); // Fragment needn't interceptors
187189
default:
188190
break;
189191
}

arouter-api/src/main/java/com/alibaba/android/arouter/launcher/_ARouter.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.app.Activity;
44
import android.app.Application;
5+
import android.app.Fragment;
56
import android.content.Context;
67
import android.content.Intent;
78
import android.net.Uri;
@@ -360,6 +361,19 @@ public void run() {
360361
case BOARDCAST:
361362
case CONTENT_PROVIDER:
362363
case FRAGMENT:
364+
Class fragmentMeta = postcard.getDestination();
365+
try {
366+
Object instance = fragmentMeta.getConstructor().newInstance();
367+
if (instance instanceof Fragment) {
368+
((Fragment) instance).setArguments(postcard.getExtras());
369+
} else if (instance instanceof android.support.v4.app.Fragment) {
370+
((android.support.v4.app.Fragment) instance).setArguments(postcard.getExtras());
371+
}
372+
373+
return instance;
374+
} catch (Exception ex) {
375+
logger.error(Consts.TAG, "Navigation to fragment error, " + TextUtils.formatStackTrace(ex.getStackTrace()));
376+
}
363377
case METHOD:
364378
case SERVICE:
365379
default:

arouter-compiler/src/main/java/com/alibaba/android/arouter/compiler/processor/RouteProcessor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import static com.alibaba.android.arouter.compiler.utils.Consts.ACTIVITY;
4848
import static com.alibaba.android.arouter.compiler.utils.Consts.ANNOTATION_TYPE_AUTOWIRED;
4949
import static com.alibaba.android.arouter.compiler.utils.Consts.ANNOTATION_TYPE_ROUTE;
50+
import static com.alibaba.android.arouter.compiler.utils.Consts.FRAGMENT;
5051
import static com.alibaba.android.arouter.compiler.utils.Consts.IPROVIDER_GROUP;
5152
import static com.alibaba.android.arouter.compiler.utils.Consts.IROUTE_GROUP;
5253
import static com.alibaba.android.arouter.compiler.utils.Consts.ITROUTE_ROOT;
@@ -56,7 +57,6 @@
5657
import static com.alibaba.android.arouter.compiler.utils.Consts.NAME_OF_PROVIDER;
5758
import static com.alibaba.android.arouter.compiler.utils.Consts.NAME_OF_ROOT;
5859
import static com.alibaba.android.arouter.compiler.utils.Consts.PACKAGE_OF_GENERATE_FILE;
59-
import static com.alibaba.android.arouter.compiler.utils.Consts.PARCELABLE;
6060
import static com.alibaba.android.arouter.compiler.utils.Consts.SEPARATOR;
6161
import static com.alibaba.android.arouter.compiler.utils.Consts.SERVICE;
6262
import static com.alibaba.android.arouter.compiler.utils.Consts.WARNING_TIPS;
@@ -164,7 +164,8 @@ private void parseRoutes(Set<? extends Element> routeElements) throws IOExceptio
164164

165165
TypeMirror type_Activity = elements.getTypeElement(ACTIVITY).asType();
166166
TypeMirror type_Service = elements.getTypeElement(SERVICE).asType();
167-
TypeElement type_Parcelable = elements.getTypeElement(PARCELABLE);
167+
TypeMirror fragmentTm = elements.getTypeElement(FRAGMENT).asType();
168+
TypeMirror fragmentTmV4 = elements.getTypeElement(Consts.FRAGMENT_V4).asType();
168169

169170
// Interface of ARouter
170171
TypeElement type_IRouteGroup = elements.getTypeElement(IROUTE_GROUP);
@@ -236,6 +237,9 @@ private void parseRoutes(Set<? extends Element> routeElements) throws IOExceptio
236237
} else if (types.isSubtype(tm, type_Service)) { // Service
237238
logger.info(">>> Found service route: " + tm.toString() + " <<<");
238239
routeMete = new RouteMeta(route, element, RouteType.parse(SERVICE), null);
240+
} else if (types.isSubtype(tm, fragmentTm) || types.isSubtype(tm, fragmentTmV4)) {
241+
logger.info(">>> Found fragment route: " + tm.toString() + " <<<");
242+
routeMete = new RouteMeta(route, element, RouteType.parse(FRAGMENT), null);
239243
}
240244

241245
categories(routeMete);

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ SUPPORT_LIB_VERSION=25.2.0
2424
MIN_SDK_VERSION=12
2525
TARGET_SDK_VERSION=25
2626

27-
arouter_compiler_version=1.0.4
28-
arouter_api_version=1.1.0
27+
arouter_compiler_version=1.0.5
28+
arouter_api_version=1.1.1
2929
arouter_annotation_version=1.0.3
3030

3131
bintrayRepo=maven

0 commit comments

Comments
 (0)