Android 进阶之路Android开发程序员

【 Android 】优雅的实现 Navigation 栏目切换

2017-05-14  本文已影响187人  Tyhoo_Wu

本文是对 优雅的实现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>
综上,将上一篇文章进行改造,使用现阶段最流行的开发技术。所有的改动点都已经罗列出来。如有不明确的点可以和我交流。

上一篇下一篇

猜你喜欢

热点阅读