「Android」开发小技巧合集
「Android」开发小技巧合集
- 沉浸式标题栏
- 修改主题样式颜色
- 隐藏标题栏进行自主设置
- 状态栏设置代码
- 圆型图片
- 设置APP图标
- 修改APP名称
- 创建不同分辨率图片文件夹
- 更改项目名称
- Button字母大小写
- TextView 字体样式
- EditText 输入时调用数字键盘
- CheckBox变为圆形
- 自定义Switch样式
- 原生样式与自定义样式对比
- 设计
- 选择器
- 滑块和轨道样式
- 导入不同gradle版本的项目
- 日期相关处理
- 获取系统时间
- 将毫秒转为时间字符串
- 将日期字符串毫秒
- 复用布局文件
- GenyMotion模拟器
沉浸式标题栏
在我们日常开发中,常常有需求需要让标题栏与状态栏背景颜色一直,此总结出二种方式
修改主题样式颜色
在style.xml文件直接修改主题样式颜色,在对应的属性下修改其颜色
最后就可以根据设定的颜色得到相对应的样式
隐藏标题栏进行自主设置
当我们不需要系统标题栏时,我们可以将系统标题栏隐藏,然后使用我们自己设定的标题栏,并设定系统状态栏向下寻找第一个元素作为自己的背景颜色
- 首先,我们在style.xml文件中创建一个样式,并设置其为没有标题栏
<style name="NotTitleBar" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style>
- 然后在清单文件中对需要使用的活动进行声明样式
android:theme="@style/NotTitleBar"
- 然后我们将系统状态栏设置为透明,不同的版本所需要的声明有一点不一样,所以需要对版本进行判定
public static void setStatusBarHide(Window window){if (Build.VERSION.SDK_INT >= 21) {View decorView = window.getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.setStatusBarColor(Color.TRANSPARENT);}
- 然后创建一个标题栏,最后进行引用;因为背景颜色为白色,所以状态栏自主向下取一颜色作为背景颜色,所以会导致状态栏图标为白色,从而导致用户体验不佳,但也可以设置为不为白色,状态栏就不会透明,此处是为了引出下一个内容,在作此示例
- 设置系统状态栏图标颜色为黑色
状态栏设置代码
到此,标题栏和状态栏的爱恨情仇也就告一段落了,我封装了一个对状态栏进行设置的工具类,可以隐藏状态栏,对状态栏图片颜色设置为深色,设置状态栏背景颜色等功能
public static void setStatusBarHide(Window window){if (Build.VERSION.SDK_INT >= 21) {View decorView = window.getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.setStatusBarColor(Color.TRANSPARENT);}}public static void setStatusBarColor(Window window, Context context, int color){window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(context.getResources().getColor(color));}/*** 设置状态栏黑色字体图标,* 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android** @return 1:MIUUI 2:Flyme 3:android6.0*/private static int getStatusBarLightMode(Window window) {int result = 0;if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {if (MIUISetStatusBarLightMode(window, true)) {result = 1;} else if (FlymeSetStatusBarLightMode(window, true)) {result = 2;} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);result = 3;} else {//5.0return 4;}}return result;}/*** 已知系统类型时,设置状态栏黑色字体图标。* 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android*/public static void setStatusBarLightMode(Window window) {int type = getStatusBarLightMode(window);if (type == 1) {MIUISetStatusBarLightMode(window, true);} else if (type == 2) {FlymeSetStatusBarLightMode(window, true);} else if (type == 3) {window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);} else {//5.0window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);}}/*** 清除MIUI或flyme或6.0以上版本状态栏黑色字体*/private static void StatusBarDarkMode(Window window) {int type = getStatusBarLightMode(window);if (type == 1) {MIUISetStatusBarLightMode(window, false);} else if (type == 2) {FlymeSetStatusBarLightMode(window, false);} else if (type == 3) {window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);}}/*** 设置状态栏图标为深色和魅族特定的文字风格* 可以用来判断是否为Flyme用户** @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return boolean 成功执行返回true*/private static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {try {WindowManager.LayoutParams lp = window.getAttributes();Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");darkFlag.setAccessible(true);meizuFlags.setAccessible(true);int bit = darkFlag.getInt(null);int value = meizuFlags.getInt(lp);if (dark) {value |= bit;} else {value &= ~bit;}meizuFlags.setInt(lp, value);window.setAttributes(lp);result = true;} catch (Exception e) {}}return result;}/*** 设置状态栏字体图标为深色,需要MIUIV6以上** @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return boolean 成功执行返回true*/private static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {Class clazz = window.getClass();try {int darkModeFlag = 0;Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");darkModeFlag = field.getInt(layoutParams);Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);if (dark) {extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体} else {extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体}result = true;} catch (Exception e) {}}return result;}}
圆型图片
在开发时,我们常常需要将图片转位圆型,例如qq图像等,更偏向于扁平化,贴近用户体验;在此推荐一个第三方API,根使用原生ImageView
一样
<de.hdodenhof.circleimageview.CircleImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:src="@drawable/testcirccle"android:layout_gravity="center"/>
设置APP图标
右击res目录
->New
->ImageAsset
然后进入此界面,图标分为前景和背景,前景和背景都可以是图片或者颜色,一般前景为图片,背景为颜色,然后在选择本地中的图片作为APP图标,然后可以根据需求调整大小,最后一直点下一步就可以获取一个精美的APP图标
修改APP名称
我们只需在value
目录下找到string.xml
资源文件,然后在里面找到属性id为app_name
的子项,然后在其后面对应的APP名称即可完成修改
<resources><string name="app_name">小星星</string>
</resources>
创建不同分辨率图片文件夹
在我们日常开发时,需要对不同手机分辨率,不同图片分辨率进行适配,需要创建多个不同分辨率的文件夹进行存储
- 右击
res
->new
->android resource directory
- 左侧选择
density
->然后资源类型
选择drawable(mipmap根据需求)->下一步
- 选择需要的分辨率即可
更改项目名称
更改项目文件夹名称,并不能改变项目文件内的目录名称
- 修改包名称
.idea
目录->modules.xml
文件->将fileurl和filepath后面的iml名称修改成自己想要的
- 找到项目内的xxx.iml文件,然后将
id
改成需求改的名称
- 最后进行setting.gradle文件,修改name为自己想要的,然后点击同步即可完成整个项目名称修改
Button字母大小写
默认Button输入英文内容为大写,将此属性设置为false
可恢复大小写
android:textAllCaps="false"
TextView 字体样式
三个样式属性分别代表:加粗
、原样式
、斜体
android:textStyle="bold"android:textStyle="normal"android:textStyle="italic"
EditText 输入时调用数字键盘
将输入方式改为phone
或者number
android:inputType="phone"
android:inputType="number"
CheckBox变为圆形
因为 CheckBox默认为圆形,有时需求需要改变其形状
在其下方引用此代码即可变为圆形
style="@style/Widget.AppCompat.CompoundButton.RadioButton"
自定义Switch样式
原生样式与自定义样式对比
- 关
开
设计
通过对Switch空间的thumb和track两个属性建立两个选择器,因为有开和关两种状态,然后在分别建立两种开和关滑块和轨道的样式
选择器
- 滑块选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/open_thumb"/>
<item android:drawable="@drawable/shut_thumb"/>
</selector>
- 轨道选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/open_track"/><item android:drawable="@drawable/shut_track"/>
</selector>
滑块和轨道样式
- 滑块开状态样式
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><sizeandroid:width="30dp"android:height="30dp" /><corners android:radius="15dp" /><!-- 变化率 --><gradientandroid:endColor="#eeeeee"android:startColor="#eeeeee" /><strokeandroid:width="1dp"android:color="#2196F3" />
</shape>
- 滑块关状态样式
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><sizeandroid:width="30dp"android:height="30dp" /><corners android:radius="15dp" /><!-- 变化率 --><gradientandroid:endColor="#eeeeee"android:startColor="#eeeeee" /><strokeandroid:width="1dp"android:color="#A8A7A7" /></shape>
- 轨道开样式
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><!-- 高度30 此处设置宽度无效--><size android:height="30dp" /><!-- 圆角弧度 15 --><corners android:radius="15dp" /><!-- 变化率 定义从左到右的颜色不变 --><solid android:color="#2196F3" /></shape>
- 轨道关样式
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><sizeandroid:width="30dp"android:height="30dp" /><corners android:radius="15dp" /><gradientandroid:endColor="#eeeeee"android:startColor="#eeeeee" /><strokeandroid:width="1dp"android:color="#A8A7A7" />
</shape>
导入不同gradle版本的项目
删除gradle
文件,(windows系统还需删除.idea文件),然后找到一个在本地已成功运行的项目,找到其gradle版本号
进行复制,在回到需要运行的项目,打开其build.gradle
文件更改为运行成功项目的版本
,最后先用as打开一个已成功运行的,最后通过在那个项目中使用import project
,即可运行成功
日期相关处理
获取系统时间
public static String getCurrentDate() {Date d = new Date();mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());return mSimpleDateFormat.format(d);}
将毫秒转为时间字符串
public static String getDateToString(long time) {Date d = new Date(time);mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());return mSimpleDateFormat.format(d);}
将日期字符串毫秒
public static long getStringToDate(String time) {mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());Date date = new Date();try {date = mSimpleDateFormat.parse(time);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}return date.getTime();}
复用布局文件
在日常开发中,我们常常希望去复用一个布局文件,而不是每一次都是复制重复的,例如标题栏,我们希望建立一个标题栏布局文件之后,希望在不同活动都能进行复用
使用include即可将一个布局文件进行导入,无需重新复制代码,导致代码冗余,而且代码层次结构高,一目了然
<include layout="@layout/titlebar" />
GenyMotion模拟器
因为as自带的avd消化的内存较多,大部分开发中更愿意去使用第三方模拟器,此推荐二款好用的模拟器GenyMotion
模拟器和雷电
模拟器
- 雷电模拟器
如果你刚入门,可以先尝试使用雷电模拟器,安装、使用简单 GenyMotion
模拟器
GenyMotion使用android开发者又爱又恨,因为GenyMotion的配置相对于较为复杂,不同的电脑或许出现不同的问题,我认为最大的问题就是GenyMotion
和virtual box
版本一致,因为只有版本一致了,你才能迎接后面的问题。
我的GenyMotion和virtual box版本如下
GenyMotion版本为Version 3.2.1virtual box版本为6.1.34
「Android」开发小技巧合集相关推荐
- Qt开发经验小技巧合集
一.开发经验 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时 ...
- [存档]Div+Css布局中经常使用的小技巧合集
CSS网页布局开发中,会有很多小技巧,这里再扩展一下您所想要得到的知识,相信您会有很多收获! 一.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值. 二.同一个的c ...
- IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集
idea IntelliJ IDEA必装插件 有不知道怎么安装的吗?File-->settings打开设置面板,找到plugins,输入想要安装的插件回车即可 plugins面板 1.背景图片 ...
- UIUX17个小技巧合集
17个小提示让你的设计瞬间升级 [文末有福利] 我了解设计一个既漂亮又实用的界面的过程 - 通常较长,而且需要反复修改.大多数设计师都有类似的经历. 不过,多年的经验积累下来,我发现一些比较通用的小技 ...
- android linux 优化,【「Android」UE手游研发中,如何做好Android内存优化?】|Linux|DEX|腾讯游戏|_傻大方...
傻大方提要:[「Android」UE手游研发中,如何做好Android内存优化?]编者按在大年夜多半人的印象里,用UE引擎制造出来的游戏实际占用内存会比较高.腾讯游戏学院专家Leonn,将和大年夜家分 ...
- 华为手机音量键技巧合集,很少有人全部掌握的7个技巧,你会用吗
华为手机音量键技巧合集,很少有人全部掌握的7个技巧,你会用吗 本文专门为花粉所写,或者说目前正在使用华为手机以及打算入手华为手机的用户们,所提供的华为音量键技巧合集.很少有人能够全部掌握这6个关于音量 ...
- Android应用开发-小巫CSDN博客客户端UI篇
Android应用开发-小巫CSDN博客客户端UI篇 上一篇是给童鞋们介绍整个项目的概况,从这篇博文开始,后续也会详细介绍整个客户端的开发,但不会贴很多代码,我会贴核心代码然后提供实现思路,想看里面更 ...
- Android应用开发-小巫CSDN博客客户端之获取评论列表
Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文详细内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能,获取评论列表,这个功能的实现跟前面获取文章列 ...
- Android应用开发-小巫CSDN博客客户端之嵌入有米广告
Android应用开发-小巫CSDN博客客户端之嵌入有米广告 上一篇博客给大家介绍如何集成友盟社会化组件,本篇继续带来干货,教大家如何嵌入广告到应用中去.小巫自称专业对接30年,熟悉各大渠道SDK的接 ...
最新文章
- 【oracle】dblink创建
- Tensorflow tf.keras.models.load_model() 打开h5文件失败
- 新生代农民工必看:模拟器eNSP安装教程(附下载链接)
- 46. Permutations
- fastapi 响应模型 / 响应状态码 / 表单参数
- linux内存不足+段错误,在linux下代码运行出现段错误,求大神
- Intel IPP安装和安装测试
- ubuntu-12.04.2忘记管理员密码(图解)
- throw er; Unhandled 'error' event Error: listen EADDRINUSE的解决方法
- wpf之windows设置WindowStyle为None
- 运行Wlmadmin无法访问计算机,网络许可证管理员指引.PDF
- DataWhale组队学习——DCIC赛事 task1
- MATLAB中findpeaks函数使用
- ch340g电路图5v和3.3v供电电路
- linux 密码修改下次,Linux 强制使用者下次登入修改密码
- 新冠造成的经济崩溃对女性影响最大
- 182_赵陈雄_java核心编程实验
- 基于FMC 接口的Xilinx FPGA XC7K325T PCIeX8 接口卡
- proxmox 控制台无法连接_Proxmox VE网络配置
- 谷歌浏览器如何截全屏图片?