Skip to content

Repository files navigation

Android工具库

封装自己常用的一些Android的组件或工具

目录

依赖

需要先引用JitPack仓库源

<dependency>
<groupId>com.github.stars-one</groupId>
<artifactId>xAndroidUtil</artifactId>
<version>0.1</version>
</dependency>
implementation 'com.github.stars-one:xAndroidUtil:0.1'

全局配置工具类

使用此工具类可以不用关注配置项的保存或进入APP的初始化读取配置

1.新建常量池

classConstants {
companionobject {
valSP_USER_NAME="username"
}
}

2.配置配置项

classGlobalData {
companionobject {
//设置默认值val userName =GlobalDataConfig(Constants.SP_USER_NAME, "")
}
}

3.使用

在需要用的地方使用下面取值

val value =GlobalData.userName.currentValue()

数值变更调用此方法:

val value =GlobalData.userName.setValue("myname")

新增监听回调功能,用法如下:

GlobalData.userName.addCallBack{
//里面你的逻辑,如val valueResult =GlobalData.userName.currentValue
}

当配置的数据发生变更,都会执行一次回调

2.Remix图标

Remix Icon图标封装在Android中,方便快速调用

基于Remix的3.2.0版本

在xml使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<site.starsone.xandroidutil.view.RemixIconTextView
android:layout_width="wrap_content"android:layout_height="wrap_content"app:iconName="home-5-fill" />
</LinearLayout>

代码中使用:

val tvHome = findViewById<RemixIconTextView>(R.id.tvHome)
tvHome.iconName ="home-5-fill"

3.工具类方法

PS: 位于XAndroidMethod类中

  • openUrlByDefaultBrower 使用默认浏览器打开网址
  • openUrlByBrower 弹窗选择浏览器打开链接
  • showTipDialog 显示提示框(有个不再提示的选项)

4.主题样式

  • ripple_common_bg.xml 水波纹背景

5.SlantedTextView

一个倾斜的TextView,适用于标签效果,搬运HeZaiJin/SlantedTextView: Android slanted TextView.

预览效果

xml使用

<com.haozhang.lib.SlantedTextView
android:layout_width="80dp"
android:layout_height="80dp"
android:gravity="center"
app:slantedBackgroundColor="@color/secondary_text"
app:slantedLength="40dp"
app:slantedMode="left"
app:slantedText="IOS"
app:slantedTextColor="@color/primary"
app:slantedTextSize="16sp"
/>

Java使用

SlantedTextView stv = (SlantedTextView) findViewById(R.id.test);
stv.setText("PHP")
.setTextColor(Color.WHITE)
.setSlantedBackgroundColor(Color.BLACK)
.setTextSize(18)
.setSlantedLength(50)
.setMode(SlantedTextView.MODE_LEFT);

属性说明

SlantedMode模式可选项

6.日志查看功能

移植了getActivity / Logcat开源库的功能,稍微调整了下样式

通过下面的代码跳转到页面,可看到效果

startActivity(LogcatActivity::class.java)

7.扩展方法

  • Long.toDateString long类型转时间字符串
  • Long.toUnitString 字节转为对应的单位
  • Long.toUnitStringNew 字节转为对应的单位
  • Long.toUnitStringNewWithUnit 字节转为对应的单位,得到Pair类型结果的数值和单位分开
  • Long.fillZero 前置补0
  • Int.fillZero 前置补0
  • Date.toDateString date类型转时间字符串
  • Double.toFix double保留几位小数
  • String.parseJsonToList json字符串转List对象
  • String.parseJsonToObject json字符串转Object对象
  • File.getMimeType 获取文件的mimeType
  • StateListDrawable.getXStateDrawable 获取selector中某个状态的drawable
  • ColorStateList.getColorForState 获取selector中某个状态的color
  • ComponentActivity.startActivityForResult 打开新Activity并可以在回调中直接接收返回叔叔
  • TextView.showHighText TextView设置关键字高亮

8.XActivityUtil

  • joinQqGroup() 跳转qq的加入群的页面方法,需要传个qq群号
  • openFile() 打开文件

9.FloatingActionBtnMenu 悬浮按钮组菜单

用了第三方,感觉他们的api使用有些麻烦,自己抽空实现了一个简单的垂直排列的悬浮按钮

效果

使用

1.xml中添加组件

<site.starsone.xandroidutil.view.FloatingActionBtnMenu
android:id="@+id/fabMenu"android:layout_width="match_parent"android:layout_height="match_parent"app:iconBgColor="@color/design_default_color_error"app:iconColor="@color/design_default_color_secondary"
/>
  • iconBgColor 主按钮的背景色
  • iconColor 主按钮的图标色

也可以通过方法setMainBtnStyle()修改

2.设置按钮组菜单项和点击监听器

有2个方法来快速构建子项

  • buildItemsByMenuData() 通过menu菜单资源
  • buildItemsByListData() 通过list数据

使用buildItemsByMenuData方法:

需要定义个mymenu.xml的菜单文件

val fabMenu = findViewById<FloatingActionBtnMenu>(R.id.fabMenu)
val list =listOf(
FloatingActionBtnMenu.MenuItemData("", R.drawable.ic_baseline_adb_24),
FloatingActionBtnMenu.MenuItemData(
"sec", R.drawable.ic_baseline_adb_24,
FloatingActionBtnMenu.MenuItemStyle()
)
)
fabMenu.buildItemsByMenuData(R.menu.mymenu) {
//按钮的点击监听器when (it) {
R.id.menuFirst -> {
ToastUtils.showShort("点击了first")
}
R.id.menuSec -> {
ToastUtils.showShort("点击了sec")
}
}
}

使用buildItemsByListData方法:

val fabMenu = findViewById<FloatingActionBtnMenu>(R.id.fabMenu)
val list =listOf(
FloatingActionBtnMenu.MenuItemData("", R.drawable.ic_baseline_adb_24),
FloatingActionBtnMenu.MenuItemData(
"sec", R.drawable.ic_baseline_adb_24,
FloatingActionBtnMenu.MenuItemStyle()
)
)
fabMenu.buildItemsByListData(list) {
when (it) {
0->ToastUtils.showShort("点击了first")
1->ToastUtils.showShort("点击了sec")
}
}

样式修改

样式数据实体类为MenuItemStyle,解释如下:

/** * @param textColor 左侧文本颜色 * @param textBgColor 左侧文本背景色 * @param iconColor 右侧图标颜色 * @param iconBgColor 右侧图标背景色*/data classMenuItemStyle(
@ColorInt valtextColor:Int = ColorUtils.getColor(R.color.black),
@ColorInt valtextBgColor:Int = ColorUtils.getColor(R.color.white),
@ColorInt valiconColor:Int = ColorUtils.getColor(R.color.white),
@ColorInt valiconBgColor:Int = ColorUtils.getColor(R.color.purple_700)
)

使用buildItemsByMenuData()方法来构建的话,可以使用第二个参数,接收一个List来设置每个item的样式颜色,注意要和menu资源文件的item项数要保持一致!

而使用buildItemsByListData()方法来构建的话,FloatingActionBtnMenu.MenuItemData实体类里的第三个参数可附加样式

单独使用

考虑到自己APP的需求,有时候可能APP只会有个添加功能,就懒得改回使用FAB了,索性就让这个组件支持单个使用(即点击后不会弹出多个按钮了)

使用的话很简单,设置一下点击事件即可(不创建多个菜单子项就可以了),如下代码所示

val fabMenu = findViewById<FloatingActionBtnMenu>(R.id.fabMenu)
fabMenu.setMainBtnClickListener{
//点击操作...
}

10.设置项组件

可自动保存设置项数值的组件,无需关注保存和读取逻辑

PS: showTip属性是后续新增的,3个都可以使用

1.SettingItemRadioGroup 单选按钮设置项

支持GlobalData的Int和String类型

<site.starsone.xandroidutil.view.SettingItemRadioGroup
android:id="@+id/sirb"android:layout_width="match_parent"android:layout_height="wrap_content"app:tip="提示说明"app:text="下载模式"/>
object MyGlobalData {
val mode =GlobalDataConfig("mymode", 1)
}
val sItemRb = findViewById<SettingItemRadioGroup>(R.id.sirb)
sItemRb.setData(SettingItemRadioGroupDataInt(listOf(
Pair(1,"模式1"),
Pair(2,"模式2"),"下载模式","提示文本"
),MyGlobalData.mode))
  • setRbOrientation() 设置排列方向

2.SettingItemSwitch 开关设置项

<site.starsone.xandroidutil.view.SettingItemSwitch
android:id="@+id/siSwtich"android:layout_width="match_parent"android:layout_height="wrap_content"app:tip="提示说明"app:text="测试开关"/>
object MyGlobalData {
val openFlag =GlobalDataConfig("openFlag", true)
}
val siSwtich = findViewById<SettingItemSwitch>(R.id.siSwtich)
siSwtich.setData(SettingItemSwitchData(MyGlobalData.openFlag))

3.SettingItemTextInt 数字输入设置项

点击整个item会弹出对话框,让用户输入数字

<site.starsone.xandroidutil.view.SettingItemTextInt
android:id="@+id/siText"android:layout_width="match_parent"android:layout_height="wrap_content"app:tip="提示说明222"app:text="测试开关223"app:showTip="false"
/>
object MyGlobalData {
val mode =GlobalDataConfig("openFlag", 3)
}
val siText = findViewById<SettingItemTextInt>(R.id.siText)
siText.setData(SettingItemTextDataInt(MyGlobalData.mode,dialogTip ="输入数字,此选项重启才会生效",showTip =true))

11.BadgeObservableData 小红点封装类

com.google.android.material.bottomnavigation.BottomNavigationView联用,方便更新小红点数据

//从底部导航栏得到小红点组件对象val badgeDrawable = bottomNav.getOrCreateBadge(R.menu.menuAdd)
//将小红点组件对象转为我们的实体类val badgeObservableData = badgeDrawable.toBadgeObservableData()
//更新小红点的数量,会自动更新数据,且包含了主线程切换操作
badgeObservableData.data =20

toBadgeObservableData(zeroHide) 是一个扩展方法

提供了个zeroHide参数,如果为false的话,当小红点上的数值为0,则会有下面的效果(下载中那个菜单);为true的话,则是直接隐藏小红点的显示

12.侧滑菜单布局SuperSlidingPaneLayout

复制于jenly1314/SuperSlidingPaneLayout: SuperSlidingPaneLayout 是基于SlidingPaneLayout扩展修改,新增几种不同的侧滑效果。,更新为androidx版本

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<site.starsone.xandroidutil.view.SuperSlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/sPanelLayout"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"app:mode="default_"app:compat_sliding="false"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<!-- 注意顺序,一定是目录布局,然后再到内容 --><!-- 侧边栏目录布局 -->
<includelayout="@layout/main_drawer"android:layout_width="match_parent"android:layout_height="match_parent"/>
<!-- 内容布局 -->
<includelayout="@layout/main_content"android:layout_width="match_parent"android:layout_height="match_parent"/>
</site.starsone.xandroidutil.view.SuperSlidingPaneLayout>

13.FlowLayout自定义布局

参考视频定制TagFlowLayout实现单选多选效果1_Android多种方式实现流式布局-慕课网写的一个自定义流式布局

使用的示例xml:

<?xml version="1.0" encoding="utf-8"?>
<com.example.myapplication.view.FlowLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/flowlayout"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:maxLines="10"android:maxRows="11"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".FlowLayoutTestActivity">
<Buttonandroid:layout_width="wrap_content"android:layout_margin="4dp"android:layout_height="wrap_content"android:text="helo"/>
</com.example.myapplication.view.FlowLayout>

14.SelectImageView组件

需求来源: 项目中经常会有个根据点击从而对图片进行切换,比如勾选功能(之前的解决方法就是写个selector,然后更改imageview的isSelected属性来实现)

不过还是觉得每次要创建一个selector文件比较麻烦,于是想通过直接在xml中使用2个图片来优化流程,于是就有了此组件

组件里面已经包含了点击事件,使用的时候不需要再去设置,如果想要设置,也提供了个方法setOnClick

<!-- 正常使用,点击切换图标的选中状态 -->
<site.starsone.xandroidutil.view.SelectImageView
android:layout_width="wrap_content"android:layout_height="wrap_content"app:selectImg="@drawable/ic_baseline_adb_24_gray"app:normalImg="@drawable/ic_baseline_adb_24_rose"
/>
<!-- 选中才展示图标的效果 ,使用透明色 -->
<site.starsone.xandroidutil.view.SelectImageView
android:layout_marginStart="16dp"android:layout_width="wrap_content"android:layout_height="wrap_content"app:selectImg="#00000000"app:normalImg="@drawable/ic_baseline_adb_24_rose"
/>
<!-- 着色效果 -->
<site.starsone.xandroidutil.view.SelectImageView
android:layout_marginStart="16dp"android:layout_width="wrap_content"android:layout_height="wrap_content"app:selectImgTint="#03bbf3"app:selectImg="@drawable/ic_baseline_adb_24_gray"app:normalImg="@drawable/ic_baseline_adb_24_rose"
/>

15.通用Recyclerview的item装饰ItemDecoration

ItemDecorationVertical

可实现垂直线性布局中间item的分割间距效果,效果图如下

val itemDero =ItemDecorationVertical(12)
mrecyclerview.addItemDecoration(itemDero)

ItemDecorationGrid

可实现网格布局item的分割间距效果,效果图如下

//每行3个val itemDero =ItemDecorationGrid(3,12) {outRect, space, position -> }
mrecyclerview.addItemDecoration(itemDero)

BlankItemDecoration

适用于线性布局的recyclerview,给每个item增加一个空白分割效果

16. NetWorkUtil网络工具类

  • ping(host:String) 向某个域名发起ping请求

About

封装自己常用的一些Android的组件或工具

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages