Android

共计 36 篇文章

AndroidStudio 升级Gradle5.0 Databinding报错

前天AS出了新版本3.4,故升级。与之匹配升级的还有Gradle Plugin 3.4,Gradle5.1.1。升级后,build程序的时候,就报错了 DataBinderMapperImpl.java:54: error: cannot find symbole: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.

RecyclerView 点击事件处理

RecyclerView不像ListView那样,提供了setOnItemClickListener,所以一般情况需要我们自己定义一个接口实现这个功能。我一般会通过Adapter去暴露出来一个接口,便于上层获取位置和点击事件。 首先在Adapter中新建一个接口 public static interface OnItemClickListener { void onItemClicked(View v, int postion); } 创建一个对应的实例,并且提供set/get方法 private OnItemClickListener onItemClickListener; public OnItemClickListener getOnItemClickListener() { return onItemClickListener; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.

GoogleCast集成简介

最近由于需要维护这一方面的东西,随即看了一下网络文档。发现中文圈还比较少。这篇就作为我的记录。详细的信息建议在在Google Cast官方文档里面查看,非常的全。Google Cast之前叫做Google Chromecast,可以把它理解成为一个SDK。硬件可以实现这样的SDK,例如国外的一些盒子,FireTV,PCCW的盒子以及谷歌自己的Chromecast硬件设备。**它的作用就是能将手机,Pad,浏览器的内容投射到连接有Chromecast设备的屏幕上。**挺方便的,在家看个YouTube或者在工作场所需要投屏展示内容的时候,都非常的便利。 Google Cast 分为两端:sender和receiver。就拿U2B举例子,在Android手机安装的软件叫做sender,在盒子里相应接收响应请求的叫做receiver。一般来Google自家的程序会有一个默认的由谷歌开发的receiver,当然还可以通过API自定义一个可以处理定制化的sender消息的receiver,例如TED的receiver。 Receiver的结构挺有意思,其实就是一个能运行Chrome的硬件设备,

Android show/hide softKeyboard

最近项目中需要有一个地方隐藏键盘和显示键盘。其实是一个比较简单的问题,但是由于我们项目架构的原因。一个Activity中内嵌了很多个Fragment,通过事件去驱动不同的Fragment展现出来。举个例子,注册流程实际上是一个Activity,然后其中包含了ResetPasswordFragment,forgetPasswordFramgent,loginFragment等等。如果用户在Login界面的EditView输入账号密码的时候,通过back键恢复到了上一个Activity的时候,键盘是无法隐藏掉的。 为了解决这个问题,我的第一次解决的方案是这样。通过在VM层中添加一个变量hideSoftKeyboard,然后给XML设定一个自定义的BindingAdapter,传入这个变量。 @BindingAdapter("showSoftKeyboard") public static void showSoftKeyboard(View view, Boolean showSoftKeyboard) { if (!showSoftKeyboard) { InputMethodManager

RxJava ignoreElement改造成Completable

这两天被一个RxJava的操作符给坑了,就是ignoreElement()。我们在Post一个请求的时候,例如上传用户信息到API当中。 public Observable<Void> delete(String profileId) { return accountApi.deleteProfileById(profileId, null) .ignoreElements(); } 如果这样写的话,会导致上在调用这个delete接口的时候,无法执行**onNext()**里面的逻辑,为什么会这个样子,具体文档里面给的图 很简单明了就可以知道。可以看看ignoreElements这个Operator怎么实现的: public static <T> OperatorIgnoreElements&

EidtText点击事件第一次不生效

这两天在开发一个功能的时候,发现项目的UX要求EditText点击出来一个AlterDialog。在一顿setOnClickListener操作之后,我发现了一个小问题。在点击的时候,需要点第二次才会show出来这个Dialog。原因是EditText这个控件需要在第一次点击的时候获取焦点,第二次点击才触发OnClick事件。非常合理,因为EditText的作用是为了输入文字,所以需要先获取焦点。 查了下资料,发现改为onTouchListener就可以解决问题,只不过这里需要注意下OnTouch会调用两次,在手指按下和释放的时候。因此,需要添加一个flag来消除这个操作。 view.setOnTouchListener(new View.OnTouchListener() { int touch_flag = 0; @Override public boolean onTouch(View view, MotionEvent

DialogFragment can not perform this action after onSaveInstanceState

最近在Fibric上面监控到了这样的一个Bug,可以看到是调用**DialogFragment.show()**报的异常。 Caused by java.lang.IllegalStateException Can not perform this action after onSaveInstanceState android.support.v4.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:2053) android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.

Fragment二次进入刷新

对于Activity来说我们想要去做用户Back后的逻辑很容易,直接从生命周期的**onRestart()**中做处理就好,例如用户从ActB返回到AtcA中,我们想要把统计分析数据上传一份到第三方统计平台中。但是对于Fragment来说,它的生命周期其实是依附于外层的Activity的,这样对于上面这个简单的需求就需要换一个思路处理。 假设我们现在有1个Activity和2个Fragment,当用户从ActivityA->FragmentA->FragmentB时,这时,我如果想获得这三个View的打开的状态的话,想一想我们可以怎么做。Activity简单,放在**onCreate()**里面就可以。返回的话就需要对于中间这个FragmentA做一下判断,确保它的第二次打开不会上传上去。因此,我们可以设置一个变量来记录当前Fragment初始化与否。 private boolean isFirstLoading = true; /** * 在Fragment可见的时候刷新数据 */ @Override public

Android全屏幕隐藏NavigationBar

有时候针对一个视频播放页面,需要将NavigationBar隐藏掉,这样有更加好的用户体验。我最近在做ExoPlayer相关的一个视频播放的需求,发现默认情况下,这个Player是没有隐藏掉NavigationBar的,这就导致了在点击屏幕暂停播放的时候,会拉伸缩放视频比例,上下留有黑边。等到NavigationBar被隐藏的时候,视频又会重新填充进整个屏幕。体验不是很好,所以需要改造一下NavigationBar。 原理很简单,就是通过获取getWindow().getDecorView(),然后设置setSystemUiVisibility就可以实现。但是要注意API版本,直接看代码片段。 protected void hideBottomUIMenu(){ if (Build.VERSION.SDK_INT > 11 && Build.VERSION.

截取部分Url链接

早上做一个Feature的时候,需要这样的一个操作,将给定的一个URL字符串,转换成Application中的Path路径,方便Router做跳转。最开始我是打算通过正则来去写的,最后想一想普通的String转换就能做到。 假设输入路径为 https://www.google.com/testUrl/ThisisatestHttps://www.google.cn/notatallhttp://www.baidu.com预期想要得到的结果为 /testUrl/Thisisatest/notatall/代码很简单,如下 private String convertUrlToPath(String url) { url = url.