
Android
文章平均质量分 60
满足自定义需求,开发工具类软件
一名程序媛呀
这个作者很懒,什么都没留下…
展开
-
Android数据库操作Greendao主键设置
在使用Greendao操作数据库时,对于主键的定义不是很明确,正常我们在使用数据库时会有大概三种情况下的主键定义。ID主键,唯一值主键,复合主键。第一种greendao就有,特别强调一个坑就是Long类型,第二种和第三种则可借助`indexes`的`unique`唯一索引来当作主键。原创 2022-11-18 16:55:26 · 2338 阅读 · 1 评论 -
Android自定义公共引入库(多个项目引入同一自定义框架类库)
Android开发快捷的一个地方就是可以引入别人写好的类库模块,供我们高效开发和使用。有时候我们自已开发的项目多了,也会有自己的一些类库包,但毕竟还在开发期,需要经常变更,所以还没办法直接上传到Maven中进行简单的参考引用。这时候就要用一些小技巧,把我们自己的公共类库引入到不同的专案中,需要修改时,只要修改公共类库一份代码,其他专案重新编译即可生效。原创 2022-11-10 15:15:59 · 967 阅读 · 0 评论 -
Android列表GridView定制长按弹出选择模式
在使用列表显示数据时,特别如GridView显示表格式数据时,经常需要多选文件进行操作,移动端一般为长按弹出选择模式并调出操作栏,然后多选后执行操作栏的相关功能。首先,改写数据类,在数据类中增加以上两个字段,用来控制列表项是否显示选择框,以及是否选中的状态,方便后续操作。然后,Item中增加选择框的图片。然后,Adapter增加选择模式的判断。最后,Activity中代码控制。最最后编写相应的控制按钮的事件功能即可,记得点击完按钮,退出选择模式。原创 2022-09-26 15:27:30 · 1414 阅读 · 0 评论 -
Android10剪贴板Clipboard的适配和解决方案
Android10(Q)开始对剪贴板增加了限制,当应用没有获取到焦点的时候,无法获取剪贴板内容。对于以上限制来说,于普通用户是百利而无一害的,毕竟我们在用手机的时候,复制个东西都可能被别人知道,想想还是挺可怕的。对于开发人员来说,想要再监听剪贴板的变化就要做出一些牺牲和适配了。方案一:在onResume中,通过post延时到界面拥有焦点时读取剪切板。方案二:借助悬浮窗开启前台服务监听。原创 2022-09-22 17:00:32 · 6600 阅读 · 1 评论 -
Android全屏显示和屏幕旋转的处理
全屏隐藏状态栏设置FLAG_FULLSCREEN或者调用全屏样式,设置windowNoTitle和android:windowFullscreen。默认当用户手机重力感应器打开后屏幕旋转时Activity的生命周期会重新加载,添加属性android:configChanges,有些应用需要固定屏幕方向可通过AndroidManifest属性控制,也可代码中强制设置为横竖屏。如果手机关闭了重力感应器依然希望`Activity`响应屏幕旋转则设置SCREEN_ORIENTATION_FULL_SENSOR。原创 2022-09-15 16:21:00 · 1735 阅读 · 0 评论 -
Android分区存储解决方案
Android 10增加了文件分区的功能,文件的访问特别是根目录下的访问受限,Android10不再允许直接读取文件根目录,即使动态申请也无效。但为了过度,可以使用临时的方案,即在`application`节点下增加`android:requestLegacyExternalStorage="true"`可关闭文件分区功能,但可能后期被取消(Android11强制开启分区存储,File操作方式将无效)。最好迁移到比较稳妥的 MdeiaStore 或者 SAF 方式中。原创 2022-09-08 11:36:43 · 1622 阅读 · 0 评论 -
Java Socket 循环接收数据readLine()阻塞问题解决办法
解决方案一 加换行符。上面提到的`readLine()`要换行符才知道传送完成,所以这个只能是服务器端发送数据给客户端时,结尾一定要加个`\r`或`\n`又或者使用 `println()` 发送数据,如果服务器客户端都是你维护,那这个解决方案最简单高效。解决方案二 使用Read() 方法。解决方案三 DataInputStream 这种方法好是好,但没有阻塞等待,会一直循环。(突然发现阻塞也是好东西呀)。...原创 2022-08-16 15:59:44 · 4106 阅读 · 0 评论 -
Xamarin利用VisualStudio开发Android项目
正常开发Android项目首选的是google自家的Android Studio,但有时候我们需要本地连接SqlServer等C#便捷功能时,Xamarin或许可以帮个忙,让用C#的你不用再重新学个新东西。有利有弊,没有好坏,只看需求和当下情况。重点是配置好Android SDK 还有 Emulator模拟器,至于具体项目开发时,业务逻辑还是C#来写的,用户界面上还是Android的那一套,两者的结合或许能碰撞出火花。...原创 2022-06-20 16:33:06 · 1642 阅读 · 0 评论 -
Android正则表达式匹配替换提取
正则基本语法在这里就不提了,一搜一堆,这里主要提下在Android中的具体应用。主要也就两个类,一个是 Pattern 类, 一个是 Matcher 类。Pattern类用于正则表达式的规则解析, Matcher 类用于处理匹配结果。原创 2022-04-25 16:31:44 · 3353 阅读 · 0 评论 -
从零开始写一个Android待办事项ToDoListApp
记录下待办事项,时不时的去看一下,勾选掉已经完成,未完成暴露在面前就能分清轻重缓急而不至于漏掉。本着借鉴和越简单越好的精神,直接使用RecyclerView列表控件来完成待办事项的展示和记录。有时一个问题的处理可能需要的周期比较长,需要分步进行,再加上个子项目的功能。已经完成的事情可能还需要回查,那就除了待办列表外,再加上个已完成的列表在需要的时候可以展示。原创 2022-03-25 15:13:25 · 5653 阅读 · 1 评论 -
Android图表HelloCharts的简单实例
效果图,数据可平移查看历史。直接在布局中加入相应的图表控件。图表上每一点的数据 PointValue(float x, float y) 第一个参数表示点的位置,第二个参数表示点上的数据。如果是多条折线,则需相同位置定义不同的PointValue。Line定义线条上的数据和颜色等,构造函数传入包含PointValue的列表,多条折线分别绑定不同的点数据列表。Axis定义X轴和Y轴的显示。包含了点数据列表的折线添加到 LineChartData 中并绑定给图表控件。实现平移必须设置视图Viewport大小。原创 2022-01-04 14:24:09 · 3944 阅读 · 5 评论 -
Android列表拖动排序侧滑删除
列表数据显示越来越多的使用RecyclerView来实现,借助ItemTouchHelper实现长按拖动,滑动删除也更加方便,自定义Callback,定义一个接口来回调Adapter中绑定的具体事件,重点重写几个方法getMovementFlags ,onMove ,onSwiped ,isItemViewSwipeEnabled ,在Callback中构造函数中传入继承了上面接口的Adapter以取得具体回调事件。Adapter中继承接口并实现具体方法内容。原创 2021-12-30 16:37:31 · 2246 阅读 · 0 评论 -
Java简单聊天室Socket服务器客户程序
要创建Socket连接,必须知道服务器在哪里以及用哪个端口来收发数据,也就是IP地址和端口号。使用 BufferedReader 从 Socket 上读取数据,用 PrintWriter 写数据到 Socket 上。服务端有一对Socket,服务器应用程序对特定端口创建出ServerSocket等待用户请求,服务器创建出与客户端通信的新的Socket。取得所有连线,群发消息,利用多线程循环监听客户端发来的消息,如果获取到消息就发送给所有用户。客户端开启新线程循环接收服务器消息。原创 2021-12-27 15:46:53 · 1059 阅读 · 0 评论 -
Activity活动页面跳转与Android页面传值
Android开发少不了的就是页面之间的跳转,或者想要呼叫打开其他应用等。Intent是Android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的运作,还可以在不同组件之间传递数据。显示Intent启动和隐式Intent启动,根据 action 和 category 来启动。使用隐式 Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,如网页浏览等。根据包名打开软件,根据类名打开界面。跳转界面传回返回值。Intent.putExtra 传值,Bundle 传值原创 2021-12-08 13:33:21 · 2415 阅读 · 0 评论 -
代码控制约束布局ConstraintLayout
实例化布局,同其他布局一样,new 一个根布局出来用来放置控件。控件的定位和约束控制需要借助 `ConstraintLayout.LayoutParams` 来设置,在设置约束时,要知道所参考的控件的 ID 值,如果是自定义的控件,记得给控件加上 `setId()` 。定位参考父布局,首先要拿到根布局的ID值,在xml中我们直接使用 parent 在代码里,也有相对应的ID值`ConstraintLayout.LayoutParams.PARENT_ID`。原创 2021-12-02 14:55:49 · 5715 阅读 · 0 评论 -
Android通过代码添加和调整布局控件
在实际开发中,有时候布局控件的添加和修改是需要动态调整的,参数的设置和方法的调用显得非常重要,可能xml布局文件中一个小功能,通过代码需要绕一圈来实现,如:margin 边距。动态添加布局。动态添加控件,重点在于控件的定位需要根据id值来控制其他的控件的参数设置根据需要来设定即可,基本上同xml布局控件时差不多。有时我们需要通过代码来调整控件的大小,需要借助其 LayoutParams 来实现动态调整其 width 和 height 的值。动态变更控件的位置,同样需要借助其 LayoutParams 来实现原创 2021-11-25 16:38:48 · 4129 阅读 · 0 评论 -
Android图片切片热点区域点击
Web的图片热点区域点击有时在Android某些界面也需要,可目前还没发现有好的控件可以实现这个功能,能想到的有两个方案:一个是图片当背景,然后画透明控件,然后通过布局控制来放到相应的位置上然后绑定控件的点击监听事件。有个问题就是有时位置会跑掉。另一个方案就是图片切片,然后组合,只要给需要的切片图片绑定点击监听事件即可。这种方案可行性较高。根据图片的具体尺寸来调整控件的大小使图片填充整个控件,通过控件链来达到图片的组合。原创 2021-11-24 17:01:28 · 1763 阅读 · 0 评论 -
Android弹窗ListPopupWindow的简单应用
常用的弹窗有菜单,或者Dialog,但更加人性化和可自定义的还是PopupWindow。如果只是展示列表数据或者弹窗列表选择,直接使用ListPopupWindow即可,因为里面已经有一个列表控件了,所以,不用再绑定布局,与普通的弹窗不一样的地方在于这里面是一个列表,所以要绑定Adapter进行展示。如果想要更加多样化的那就自定义一个布局,使用PopupWindow即可,也不复杂。继承BaseAdapter自定义Adapter丰富布局样式原创 2021-11-22 15:29:21 · 2908 阅读 · 0 评论 -
Android下选择文字自定义颜色切换样式 - RadioButton
在使用RadioButton作tab切换时,需要设置文本颜色切换,不然都不知道当前点击的是哪个,通过代码等引入样式时需要先自定义好颜色选择样式文件。res 目录下建立 color 目录, Resource type选择 Color 类型,上面的名称输入Color,也可以自定义,color 目录下建立 selector 样式文件,Activity引用通过 setTextColor() 方法引入,要使用 getColorStateList() 而不能用 getColor() 否则文本颜色不会切换原创 2021-11-10 15:17:07 · 2760 阅读 · 0 评论 -
ViewModel和MVP中的Presenter结合使用
ViewModel的简单使用,前面文章已经有提过,这里结合MVP一起使用,达到更高的解耦效果。定义ViewModel,Presenter中进行Model数据的访问,这里借助GreenDao对Sqlite进行数据库操作,如果是本地数据,直接写一个方法获取本地数据即可,Activity中实现数据的绑定和观察,借助LiveData变量的 setValue() 方法将 Presenter中获取到的Model数据赋值给ViewModel中的LiveData变量原创 2021-11-05 15:53:46 · 548 阅读 · 0 评论 -
ViewModel的简单实例
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,数据持久,生命周期贯穿整个Activity,解耦合,可以Activity和其下Fragment之间数据共享。原创 2021-11-05 15:45:45 · 2584 阅读 · 0 评论 -
Android代码架构模式MVP的一点总结
最近想给之前写的一个app增加功能,翻开代码发现很多地方写了注释也要研究半天才能回想起当初为什么要这么设计。最初写的时候想的更多是怎么把功能实现了,至于代码结构倒没考虑太多,反正也要改,干脆把代码理一理吧,就想到应用比较成熟的代码架构会合理一些。对比了下MVC,MVP,MVVM等最后还是决定用MVP来改写,后期可扩展和学习的地方也多些。原创 2021-10-25 17:01:39 · 144 阅读 · 0 评论 -
Android图片压缩
Android应用选择图库图片后直接保存数据库,原图太大数据库很快会变肥。图片压缩之后再保存成了必经之中,加之很多时候我们只需要一个缩略图知道大概内容而已。首先打开图片库获取选择的图片,然后执行压缩算法,首先是尺寸压缩,再进行一次质量压缩。原创 2021-08-25 16:38:00 · 144 阅读 · 0 评论 -
Android图片ImageView双击缩放并拖动移动位置
借助 Matrix 的缩放功能来达到图片缩放的目的,第一个参数为横向缩放值,第二个参数为纵向缩放值,第三个第四个参数为参考坐标。同上使用 Matrix 来实现图片移动。控件双击功能的实现,按下时的距离和抬起时的距离很小时,视作点击动作,如果两次点击动作的时间间隔很小时,视作双击动作。切换图片后恢复初始状态。原创 2021-05-19 15:13:34 · 1695 阅读 · 10 评论 -
Android中WakeLock的简单运用
永久锁或者超时锁根据自己的需要随便申请哪个都行,如果不确定就申请一个永久锁,在你的任务完成后记得执行释放就好。如果是延时执行的任务,可以申请一个超时锁,超时时间就用你的延时时间。如果是通过`acquire(long timeout)`方法申请的超时锁,则会在到达时间后自动去释放,如果是通过`acquire()`方法申请的永久锁,则必须进行显式的释放,否则由于系统一直持有`wakelock`锁,将导致无法进入休眠状态,从而导致耗电过快等功耗问题。PARTIAL_WAKE_LOCK允许屏幕、按键灯灭,也不会释放原创 2021-04-14 15:09:42 · 3658 阅读 · 0 评论 -
AlarmManager实例之后台音乐定时关闭
常用的定时任务有Timer, Handler, AlarmManager。Timer有一个明显的问题,就是它并不适合用于需要长期在后台运行的定时任务。手机的休眠策略而让CPU进入睡眠状态,极有可能导致Timer中的定时任务停止或者无法正常运行。Handler的postDelay方法存在同样的问题,依赖于线程,只要进程被杀死,相关的定时操作也就无效了。AlarmManager它通过pendingIntent具有唤醒未启动进程的功能,即可以保证每次需要执行的定时任务的时候CPU都能正常工作。原创 2021-04-13 14:41:17 · 452 阅读 · 0 评论 -
Android多媒体播放MediaPlayer的简单实例
OnCompletionListener播放完毕的监听事件,比如播放下一曲等。需要随同程式一起发布的音频档案,统一放置于 res > raw 文件夹下,在程式中引用时通过 R.raw. 进行调用。实例——列表循环,检查音乐目录是否存在,取得本地音乐文件列表,如果是当前音乐,执行暂停/继续动作,当前音乐播放完成后,执行下一曲并列表循环,定时关闭。若出现mediaplayer called in state 之类的问题,都是由于执行步骤有误所造,MediaMetadataRetriever获得音乐信息。原创 2021-04-07 16:41:57 · 1667 阅读 · 0 评论 -
Android小部件Widget的简单应用和常见问题
widget支持的控件有限。如果小部件中使用到了列表项如 ListView,GridView 等,在绑定数据时需要使用 RemoteViewsService 并提供一个 RemoteViewsFactory 实例来填充数据 而非 Adapter。PendingIntent.FLAG为0代表该 PendingIntent 不带数据,FLAG_UPDATE_CURRENT表示更新之前,且每次requestCode不一样。设定TextView值,设定控件点击事件,设定列表数据并绑定item点击事件。原创 2021-03-24 15:41:28 · 1236 阅读 · 0 评论 -
Android打开手机相册选择图片加载与压缩和Sqlite存取
打开手机相册选择图片,调用手机相册管理应用,在结果返回中取出选择的图片。如果不需要压缩,则直接decodeStream转成Bitmap即可。如果需要压缩,则在取到uri之后先执行压缩,再存储和赋值给ImageView。图片压缩时先执行了尺寸压缩,再执行质量压缩,达到相对最佳的效果和大小。存储到数据库,因为Sqlite里想要存储图片的话只能使用BLOB数据类型,即是二进制类型,读取数据库中的图片栏位通过BitmapFactory.decodeByteArray转成Bitmap。原创 2021-03-23 13:20:47 · 398 阅读 · 0 评论 -
Android RecyclerView与viewBinding结合使用
定义ViewHolder类,构造方法里的传值类型为viewBinding实例。onCreateViewHolder 返回viewBinding实例的ViewHolder,onBindViewHolder方法中直接使用ViewHolder中的viewBinding实例取得控件。原创 2021-03-18 16:48:10 · 3301 阅读 · 1 评论 -
Android属性动画ObjectAnimator和ValueAnimator的简单应用
Android动画分为四种:alpha(渐变透明度),scale(渐变尺寸伸缩),translate(画面转换位置移动),rotate(画面转移旋转)。ofFloat方法第一个参数为要控制的控件,第二个参数为动画的类型,第三个之后的参数为动画所需要的值,可以设置多个值让他反复变化。属性动画,是继逐帧动画和补间动画之后Android引入的更方便自定义的动画类。ValueAnimator 是 ObjectAnimator 的父类。原创 2021-03-17 13:13:44 · 1023 阅读 · 0 评论 -
Android借助Glide加载图片缩略图
Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。支持拉取,解码和展示视频快照,图片,和GIF动画。虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。图片地址如果是uri则传入uri地址,如果是文件路径,则传入文件路径。最好是通过uri,因为高版本的android会慢慢舍弃掉文件访问权限而导致获取不到文件地址。原创 2021-03-16 11:23:58 · 3598 阅读 · 0 评论 -
Android数据集BaseAdapter结合viewBinding优化
正常使用Listview或者GridView或者其他需要数据集的时候,一般都是继承BaseAdapter进行重写getview方法来获取我们想要的布局,如果数据量比较大的时候,原有的写法可能会造成一些卡顿,当然,数据量少是没啥感觉的。不过记好的代码习惯还是要保持的。代码变化不多,重点就是通过view的tag值来取得之前缓存的数据,不用每次都重新加载实例。还有一种常规的优化方法就是通过ViewHolder来保存缓存信息。原创 2021-03-03 10:05:36 · 1253 阅读 · 0 评论 -
Android延时执行事件的方法
为了让用户体验更好,有些事件需要等一等再执行,或者有时候需要稍后自动隐藏,或者是为了关闭服务能够彻底而不至于重启时有些命令还没跑完等,总之延时执行的用处还是挺大的。下面是几种常用的延时执行的方法,Handler的方法比较推荐,也是效能挺好的一个方法。Timer有些时候用处更大,看个人需求。因为Timer不仅可以延时执行,还可以定期执行,比如写一些定时器之类的。Thread也是一种方法,但是直接让线程休眠来达到延时,不推荐,但有时候就需要这样的操作,所以也写出来了。原创 2021-03-02 11:49:32 · 3236 阅读 · 0 评论 -
Android日期时间常规操作
取得当前系统时间毫秒数,格式化当前时间,取得当前年 / 月 / 日 / 时 / 分 / 秒,增加天数,日期比较,比较两个日期先后,计算两个日期相关天数,取得月份的所有天数,一周的开始为星期天,一周的开始为星期一原创 2021-02-25 16:53:10 · 424 阅读 · 0 评论 -
android控件双击+拖动的实现
之前写过控件单击+拖动,在实际开发中,有时候想要拖动到一定位置之后不用了要双击关闭。同样是重写ontouch事件。先定义一个变量来记录点击时间,这个最好放在外面当成全局变量用。通过时间来判断是否执行了双击。原创 2021-02-23 15:58:25 · 229 阅读 · 0 评论 -
android自定义局部透明遮罩-新手引导说明
大致思路就是自定义一个View,然后设置一个遮罩背景,再绘制一个圆圈用于透明显示下面的内容,如果想要说明文字啥的,就再绘制,空白画布,想干嘛干嘛啦。有个重点就是画笔画出来的圆圈要透明显示下面的内容,而不是背景色,这个要借助PorterDuffXfermode来实现。写个方法来改变所绘制的圆圈的位置。然后当成一个控件view来用就行了原创 2021-02-21 15:51:48 · 2544 阅读 · 2 评论 -
android底部上滑锁屏
各种测试,各种查资料,总算解决了底部上滑锁屏功能的实现。一个底部三大金钢折腾死个人。最后借助的还是AccessibilityService实现。因为我想实现的底部导航栏一定要显示在屏幕最底端,就算有三大金刚navigationbar,也要置于其顶层。为什么不用 TYPE_APPLICATION_OVERLAY 因为底部导航栏三大金钢挡住无法接收触发事件。原创 2021-02-06 13:32:36 · 1109 阅读 · 2 评论 -
Android自定义垂直 SeekBar
android 本身只有一个水平的 seekbar,开发需要使用垂直的seekbar就只能自己实现了,好在可以直接继承水平seekbar,修改几个重载事件即可。onDraw事件中旋转画布,由水平变垂直。measure事件中重新计算控件尺寸,对换宽高值。切记加上尺寸变更时的事件,变更对换宽高值。最后重载一下滑动事件,重新计算progress值。以上即可实现垂直的seekbar,但我在实际使用时,发现显示不出来,拉大尺寸发现本身是有显示出来的,但是位置什么的都不对,感觉内部padding值很大。自定义外观解决。原创 2021-02-02 08:27:17 · 4935 阅读 · 12 评论 -
android控件单击+拖动的实现
setOnClickListener 可以接收控件的单击动作,无返回值,要想拖动控件,就要利用 setOnTouchListener 自己定义了。通过按下时的坐标和移动时的坐标之间的差值,来计算移动的距离,然后更改控件的位置以达到拖动的目的。因 Touch 事件执行完成后如果返回false则会继续执行单击事件,不是我们想要的。如果直接返回true代表处理完了事件,不再执行单击事件,也不是我们想要的。这时候就要判断什么时候返回true,什么时候返回false,以达到同时实现单击 + 拖动的目的。原创 2021-01-26 08:15:49 · 666 阅读 · 2 评论