设为首页 加入收藏

TOP

Android Weekly Notes Issue #221(二)
2017-10-13 10:30:56 】 浏览:10039
Tags:Android Weekly Notes Issue #221
时, 如果用户尝试竖直滚动, touch事件实际上是被child吃掉的.

还是从onInterceptTouchEvent()的代码可以看出:

if (mScrollState == SCROLL_STATE_SETTLING) {
    getParent().requestDisallowInterceptTouchEvent(true);
    setScrollState(SCROLL_STATE_DRAGGING);
}

当child处于SETTLING状态时, child会要求它的parent不要拦截touch事件.

这在通常情况下是好的.
但是在作者的使用场景里, 他们的root中没有其他竖直滚动和拖拽的child, 所以他们又继承了刚才那个BetterRecyclerView, 写了一个requestDisallowInterceptTouchEvent()为空实现的View作为root.

他们的sample demo在这里: manidesto/scrolling-demo.

Update Dependencies. Code. Repeat.

每一个Android开发可能都需要对他们的项目进行(更新依赖, 编码, 重复)这样的循环工作, 如果你想要你的所有项目都有同样的版本号, 这样是很浪费时间的.

原文作者就经历了这样的情景, 他想要把他这个目录Android-Examples下的所有项目都更新一下. 这个目录里全是那种很小的简单例子, 但都是可独立运行的工程.
每当gradle-plugin, support library或者google play services要更新版本号, 保持这些工程全部都updated是一项很难的工作.

所以原作者想要放弃原先逐个更新的土办法, 更有效率地来更新依赖版本号.
首先想到的就是在gradle里定义一个变量, 然后双引号加$引用这个变量.
为了让所有的module都采用同一变量, 可以在根项目的build.gradle文件里定义变量, 即使用ext块.
但是到此, 只能统一管理在同一个project下的各个modules的依赖版本.

如果跨projects呢?
首先, 作者在存放这些projects的根目录下建了一个gradle文件, 然后把变量都定义在那里.
然后如何应用到各个project呢?于是原作者找啊找, 找到了这块: gradle Subproject configuration
他给每个工程的根build文件加了个这个:

// This is added to apply the gradle file to each module under the project
subprojects {
    apply from: '../../dependencies.gradle'
}

这样以后在每个工程的module里面都可以直接引用变量了.

但是, 这对于android-gradle-plugin的版本是不管用的.

这是因为上面应用的配置只对subproject起作用, 对每一个root project是没有应用到的.
所以作者在每一个项目的root build.gradle中, 在buildscript块又加了它的依赖配置文件:

buildscript {
    // This is added to apply the gradle file to facilitate providing variable values to root build.gradle of the project
    apply from: '../dependencies.gradle'
    ..
    dependencies {
        classpath "com.android.tools.build:gradle:$androidPluginVer"
        ..
    }
}

好啦, 至此, 所有的依赖配置问题就解决了, 以后改版本号只需要改一个地方就可以应用到所有项目.

DI 101 - Part 2

作者上一篇的文章里介绍了Dagger的基本使用.
这篇还是教程类文章, 讲:

多个Modules:

写了一个Retrofit 2的ApiModule, 和一个Realm的DatabaseModule.

多个对象:

有时候我们需要提供一个类的不同对象, 我们可以用@Named注解, 然后用不同的字符串来区分它们.

文中的例子是这样:

@Provides
@Named(IMAGE_URL)
String provideImageUrl() {
  return ImageApiService.ENDPOINT;
}

@Provides
@Named(URL)
String provideBaseUrl() {
  return RestApiService.ENDPOINT;
}

@Provides @Singleton @Named(REST_API_RETROFIT)
Retrofit provideRetrofit(@Named(URL) String baseUrl, OkHttpClient client) { ... }

@Provides @Singleton @Named(IMAGE_API_RETROFIT)
Retrofit provideImageRetrofit(@Named(IMAGE_URL) String baseUrl, OkHttpClient client) { ... }

Inject interfaces without provide methods on Dagger 2

用dagger2注入接口, 返回实现类的对象, 比较常规的方法是在Module里面写一个@Provides标注的providesXXX()方法, 返回值类型是接口, 实际返回的是实现类的对象, 比如:

@Module
public class HomeModule {

  @Provides
  public HomePresenter providesHomePresenter(){
    return new HomePresenterImp();
  }
}

但是如果我们想给实现类加一个依赖UserService呢?

我们当然可以把UserService作为参数传给这个provide方法, 然后传到实现类的构造函数中, 在里面存一个字段.

又或者, 我们可以使用@Binds注解, 像这样:

@Module
public abstract class HomeModule {

  @Binds
  public abstract HomePresenter bindHomePresenter(HomePresenterImp   
    homePresenterImp);
}

这是一个抽象类中的抽象方法, 这个方法的签名意思是告诉dagger, 注入HomePresenter接口(返回值)时, 使用HomePresenterImpl(方法参数)实现.

然后, 在HomePresenterImpl类的构造函数上加一个@Inject就可以了.

这样我们就不需要在provide方法上加依赖参数了.

Introducing ExpandableRecyclerView

本文介绍expandable-recycler-view, 一个开源的库, 可以展开和折叠RecyclerView中的组.

RecyclerView作为ListView的升级版, 却也减少了一些功能比如OnItemClickListe

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android 创建自己的Camera App 下一篇Android 常见对话框

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目