Android

A collection of 7 posts

Android

Android TextView 设置跑马灯效果

为TextView设置这些属性: ellipsize = TextUtils.TruncateAt.MARQUEE transformationMethod = SingleLineTransformationMethod.getInstance() setHorizontallyScrolling(true)只有在TextView得到了焦点或处于selected状态时,才会开始滚动。 为方便使用,可以继承TextView并重写isFocused()方法,让TextView认为焦点一直有获取到: override fun isFocused() = true默认情况下,TextView只滚动3次 。 可以修改marqueeRepeatLimit为-1,以实现无限滚动。当然,也可以指定滚动次数。 marqueeRepeatLimit = -1TextView需要在绘制完成后,设置的文本才能滚动。 如果设置文本的操作是异步的,存在绘制完成前就设置了文本的可能,那就会出现一开始不滚动,关屏重开、弹出输入法等操作之后才开始滚动的情况。 这种情况则需要使用post来设置文本: tv.post { tv.text = content }

Android

Gradle 3.4.0以上版本自定义apk输出目录和输出文件名

因为需要实现自动化打包,所以需要自定义输出目录(绝对路径)和文件名。 但是搜索了很久,都没有找到有效的办法,很多都是旧版Gradle才能用的语法,新版Gradle编译不通过。 终于还是找到了可用的方法,在module层的build.gradle增加如下代码: android { applicationVariants.all { variant -> variant.outputs.all { output -> variant.packageApplicationProvider.get().outputDirectory = new File("path/to/output/dir") outputFileName = "output_file_name.apk" } } }需要注意: 1.如果是多种build type或多种flavor同时打包,记得在输出文件夹路径或文件名中引用相关变量。 2.

Android

Bundle的数据大小限制

使用Intent去启动另一个 Activity,同时带上extra,包含一个Parcelable对象的数组。数组内的数据是不固定的,与业务有关。 开发时只测试了少量数据时的表现,一切正常,结果今天发现,数据量到达2500条左右时,无法启动目标Activity,并且还会发生异常。 于是改成了临时存储在一个静态map里,并将key作为extra,在目标Activity中取出并删除,避免了这个问题。

Android

NestedScrollView嵌套RecyclerView的问题

NestedScrollView嵌套RecyclerView,或者ScrollView嵌套RecyclerView并开启nestedScrolling,会导致RecyclerView创建所有item的ViewHolder,数量巨大时会非常卡。 如果需要解决,最好是只使用RecyclerView,通过viewType来创建不同的ViewHolder。 要注意的是,使用RecyclerView时,未显示的View会被回收,需要注意保存状态,比如输入框的文字;或者使用 RecyclerView.recycledViewPool.setMaxRecycledViews(viewType, 0) 来禁用指定viewType的回收。

Android

将App从后台切换回前台

使用极光推送的过程中, 发现每次点击通知的时候, 都会重启一遍App 猜测原因是极光推送识别到我的主Activity是BootActivity, 但是实际上在启动到MainActivity的时候, 它就已经finish了, 导致极光认为我程序已经关闭, 所以重启了一次 解决方法也很简单, 极光提供了通知点击的广播, BroadcastReceiver注册之后, 点击通知的事件就由开发者接管, 因此在onReceive里面添加如下代码, 就可以让app回到前台而不会重启: context.startActivity(Intent(context, MainActivity::class.java) .setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or Intent.FLAG_ACTIVITY_NEW_TASK)) 注意代码中给Intent定义的Activity不是BootActivity 这样设置之后, 点击推送时, 如果app正在后台运行, 就跟从最近任务里打开的效果一样; 如果不在后台运行, 就会启动代码中定义的MainActivity 所以最好不要在BootActivity中定义任何初始化操作, 不然点击通知的时候就会跳过这些初始化,