A simple router (view dispatcher) for Android Activities and Views.
The concept of a router is very common in single-page web applications. The reason why people prefer routers instead of showing/hiding/modifying views directly is because:
repositories {
maven { url = 'https://jitpack.io' }
}
dependencies {
compile 'com.github.trikita:android-router:1.0.0'
}
Declare routes:
ActivityRouter.getDefault()
.add("/splashscreen", SplashScreenActivity.class)
.add("/login", LoginActivity.class)
.add("/profile/:userId", ProfileActivity.class);
Navigate (open certain activity):
ActivityRouter.getDefault().route(mContext, "/profile/" + mUserId);
Get route parameters inside an Activity:
String userId = getIntent().getStringExtra("userId")
View router is most helpful if you want your application to be a single-activity app with multiple viewgroups inside (see "Advocating agains fragments" to find out why it's a good approach).
Declare routes and navigate:
public class MainActivity extends Activity {
ViewRouter mRouter = new ViewRouter(this);
...
mRouter
.add("/splashscreen", SplashScreen.class)
.add("/login", LoginScreen.class)
.add("/profile/:userId/...", ProfileScreen.class); // note the "..." - it allows to nest view routers
mRouter.route(String.format("/profile/%s/general", "user1234"));
Parameters are passed as [Properties]():
public class ProfileScreen extends ViewGroup {
String userId; // will be set to "user1234" automatically
String uriRemainder; // will be set to "general"
ViewRouter mPageRouter;
ProfileScreen(Context c) {
// Nested router will dispatch between certain view mounted inside the current one
mPageRouter = new ViewRouter(findViewById(R.id.page_content))
.add("/general", ProfileGeneralView.class)
.add("/general", ProfileGeneralView.class);
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
mPageRouter.route(this, uriRemainder);
}
}
View router has its own backstack which can be unrolled with mRouter.back()
.
This returns true if the navigation happened successfully, false if the
backstack was empty.
Activity router state is saved automatically in the backstack.
View router state can be saved into a bundle using mRouter.save(b)
and restored by mRouter.load(b)
.
Library is distributed under MIT license.