【 Android 】优雅的实现 Navigation 栏目切换
本文是对 优雅的实现Navigation栏目切换 文章的进行改造。使用最流行的开发技术:
Java 8 + Data-Binding + RxAndroid 进行编写。
1.导入必要的库
① Java 8(据说 Android Studio 2.4 版对 Java 8 进行了全面的支持,可能就不需要到这么繁琐了)
build.gradle(Project:Xxx)
buildscript {
...
dependencies {
...
classpath 'me.tatarka:gradle-retrolambda:3.6.1'
}
}
build.gradle(Module:Xxx)
apply plugin: 'me.tatarka.retrolambda'
android {
...
compileOptions {
//使用JAVA8语法解析
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
② Data Binding
build.gradle(Module:Xxx)
android {
...
dataBinding {
enabled = true
}
}
③ RxAndroid: Reactive Extensions for Android
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
</br>
2.创建 RxDrawer 类,实现异步加载切换页面
public class RxDrawer {
private static final float OFFSET_THRESHOLD = 0.03f;
public static Observable<Irrelevant> close(final DrawerLayout drawer) {
return Observable.create(emitter -> {
drawer.closeDrawer(GravityCompat.START);
DrawerLayout.DrawerListener listener = new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
if (slideOffset < OFFSET_THRESHOLD) {
emitter.onNext(Irrelevant.INSTANCE);
emitter.onComplete();
drawer.removeDrawerListener(this);
}
}
};
drawer.addDrawerListener(listener);
});
}
}
</br>
3.具体实现
主页面继承 NavigationView.OnNavigationItemSelectedListener
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {}
布局页面相关的代码就不在赘述,和 优雅的实现Navigation栏目切换 的布局是一样的。
</br>
初始化我们的抽屉(侧边栏)
private void initDrawer() {
if (mBinding.navView != null) {
mBinding.navView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle =
new ActionBarDrawerToggle(this, mBinding.drawerLayout, mBinding.toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
mBinding.drawerLayout.addDrawerListener(toggle);
toggle.syncState();
}
}
说明:
ActionBarDrawerToggle 是 DrawerLayout.DrawerListener实现。
和 NavigationDrawer 搭配使用,推荐用这个方法,符合Android design规范。
作用:
1).改变android.R.id.home返回图标。
2).Drawer拉出、隐藏,带有android.R.id.home动画效果。
3).监听Drawer拉出、隐藏;
</br>
侧边栏Item切换
@Override
public boolean onNavigationItemSelected(MenuItem item) {
RxDrawer.close(mBinding.drawerLayout)
.doOnNext(o -> {
switch (item.getItemId()) {
case R.id.navigation_first:
FirstActivity.launch(MainActivity.this);
break;
case R.id.navigation_second:
SecondActivity.launch(MainActivity.this);
break;
case R.id.navigation_third:
ThirdActivity.launch(MainActivity.this);
break;
}
}).subscribe();
return false;
}
说明:
使用 Java 8(Lambda表达形式),最新的 Java 9都已经开始 Release 前的最后测试。跟上时代的步伐,不要被落下。
点击 Item 的时候分别切换到三个新的 Activtiy,这三个 Activity 非常简单,所以就不在赘述。
</br>
最后是点击返回键的时候的处理
@Override
public void onBackPressed() {
super.onBackPressed();
if (mBinding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
mBinding.drawerLayout.closeDrawer(GravityCompat.START);
} else {
finish();
}
}
</br>
综上,将上一篇文章进行改造,使用现阶段最流行的开发技术。所有的改动点都已经罗列出来。如有不明确的点可以和我交流。