「Android」开发小技巧合集

  • 沉浸式标题栏
    • 修改主题样式颜色
    • 隐藏标题栏进行自主设置
    • 状态栏设置代码
  • 圆型图片
  • 设置APP图标
  • 修改APP名称
  • 创建不同分辨率图片文件夹
  • 更改项目名称
  • Button字母大小写
  • TextView 字体样式
  • EditText 输入时调用数字键盘
  • CheckBox变为圆形
  • 自定义Switch样式
    • 原生样式与自定义样式对比
    • 设计
      • 选择器
      • 滑块和轨道样式
  • 导入不同gradle版本的项目
  • 日期相关处理
    • 获取系统时间
    • 将毫秒转为时间字符串
    • 将日期字符串毫秒
  • 复用布局文件
  • GenyMotion模拟器

沉浸式标题栏

在我们日常开发中,常常有需求需要让标题栏与状态栏背景颜色一直,此总结出二种方式

修改主题样式颜色

在style.xml文件直接修改主题样式颜色,在对应的属性下修改其颜色

最后就可以根据设定的颜色得到相对应的样式

隐藏标题栏进行自主设置

当我们不需要系统标题栏时,我们可以将系统标题栏隐藏,然后使用我们自己设定的标题栏,并设定系统状态栏向下寻找第一个元素作为自己的背景颜色

  1. 首先,我们在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>
  1. 然后在清单文件中对需要使用的活动进行声明样式
android:theme="@style/NotTitleBar"
  1. 然后我们将系统状态栏设置为透明,不同的版本所需要的声明有一点不一样,所以需要对版本进行判定
 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);}
  1. 然后创建一个标题栏,最后进行引用;因为背景颜色为白色,所以状态栏自主向下取一颜色作为背景颜色,所以会导致状态栏图标为白色,从而导致用户体验不佳,但也可以设置为不为白色,状态栏就不会透明,此处是为了引出下一个内容,在作此示例

  1. 设置系统状态栏图标颜色为黑色

状态栏设置代码

到此,标题栏和状态栏的爱恨情仇也就告一段落了,我封装了一个对状态栏进行设置的工具类,可以隐藏状态栏,对状态栏图片颜色设置为深色,设置状态栏背景颜色等功能

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>

创建不同分辨率图片文件夹

在我们日常开发时,需要对不同手机分辨率,不同图片分辨率进行适配,需要创建多个不同分辨率的文件夹进行存储

  1. 右击res->new->android resource directory

  1. 左侧选择density->然后资源类型选择drawable(mipmap根据需求)->下一步

  1. 选择需要的分辨率即可

更改项目名称

更改项目文件夹名称,并不能改变项目文件内的目录名称

  1. 修改包名称

  1. .idea目录->modules.xml文件->将fileurl和filepath后面的iml名称修改成自己想要的

  1. 找到项目内的xxx.iml文件,然后将id改成需求改的名称

  1. 最后进行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两个属性建立两个选择器,因为有开和关两种状态,然后在分别建立两种开和关滑块和轨道的样式

选择器

  1. 滑块选择器
<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>
  1. 轨道选择器
<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>

滑块和轨道样式

  1. 滑块开状态样式
<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>
  1. 滑块关状态样式
<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>
  1. 轨道开样式
<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>
  1. 轨道关样式
<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模拟器和雷电模拟器

  1. 雷电模拟器
    如果你刚入门,可以先尝试使用雷电模拟器,安装、使用简单
  2. GenyMotion模拟器
    GenyMotion使用android开发者又爱又恨,因为GenyMotion的配置相对于较为复杂,不同的电脑或许出现不同的问题,我认为最大的问题就是GenyMotionvirtual box版本一致,因为只有版本一致了,你才能迎接后面的问题。

我的GenyMotion和virtual box版本如下

 GenyMotion版本为Version 3.2.1virtual box版本为6.1.34

「Android」开发小技巧合集相关推荐

  1. Qt开发经验小技巧合集

    一.开发经验 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时 ...

  2. [存档]Div+Css布局中经常使用的小技巧合集

    CSS网页布局开发中,会有很多小技巧,这里再扩展一下您所想要得到的知识,相信您会有很多收获! 一.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值. 二.同一个的c ...

  3. IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集

    idea IntelliJ IDEA必装插件 有不知道怎么安装的吗?File-->settings打开设置面板,找到plugins,输入想要安装的插件回车即可 plugins面板 1.背景图片 ...

  4. UIUX17个小技巧合集

    17个小提示让你的设计瞬间升级 [文末有福利] 我了解设计一个既漂亮又实用的界面的过程 - 通常较长,而且需要反复修改.大多数设计师都有类似的经历. 不过,多年的经验积累下来,我发现一些比较通用的小技 ...

  5. android linux 优化,【「Android」UE手游研发中,如何做好Android内存优化?】|Linux|DEX|腾讯游戏|_傻大方...

    傻大方提要:[「Android」UE手游研发中,如何做好Android内存优化?]编者按在大年夜多半人的印象里,用UE引擎制造出来的游戏实际占用内存会比较高.腾讯游戏学院专家Leonn,将和大年夜家分 ...

  6. 华为手机音量键技巧合集,很少有人全部掌握的7个技巧,你会用吗

    华为手机音量键技巧合集,很少有人全部掌握的7个技巧,你会用吗 本文专门为花粉所写,或者说目前正在使用华为手机以及打算入手华为手机的用户们,所提供的华为音量键技巧合集.很少有人能够全部掌握这6个关于音量 ...

  7. Android应用开发-小巫CSDN博客客户端UI篇

    Android应用开发-小巫CSDN博客客户端UI篇 上一篇是给童鞋们介绍整个项目的概况,从这篇博文开始,后续也会详细介绍整个客户端的开发,但不会贴很多代码,我会贴核心代码然后提供实现思路,想看里面更 ...

  8. Android应用开发-小巫CSDN博客客户端之获取评论列表

    Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文详细内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能,获取评论列表,这个功能的实现跟前面获取文章列 ...

  9. Android应用开发-小巫CSDN博客客户端之嵌入有米广告

    Android应用开发-小巫CSDN博客客户端之嵌入有米广告 上一篇博客给大家介绍如何集成友盟社会化组件,本篇继续带来干货,教大家如何嵌入广告到应用中去.小巫自称专业对接30年,熟悉各大渠道SDK的接 ...

最新文章

  1. 【oracle】dblink创建
  2. Tensorflow tf.keras.models.load_model() 打开h5文件失败
  3. 新生代农民工必看:模拟器eNSP安装教程(附下载链接)
  4. 46. Permutations
  5. fastapi 响应模型 / 响应状态码 / 表单参数
  6. linux内存不足+段错误,在linux下代码运行出现段错误,求大神
  7. Intel IPP安装和安装测试
  8. ubuntu-12.04.2忘记管理员密码(图解)
  9. throw er; Unhandled 'error' event Error: listen EADDRINUSE的解决方法
  10. wpf之windows设置WindowStyle为None
  11. 运行Wlmadmin无法访问计算机,网络许可证管理员指引.PDF
  12. DataWhale组队学习——DCIC赛事 task1
  13. MATLAB中findpeaks函数使用
  14. ch340g电路图5v和3.3v供电电路
  15. linux 密码修改下次,Linux 强制使用者下次登入修改密码
  16. 新冠造成的经济崩溃对女性影响最大
  17. 182_赵陈雄_java核心编程实验
  18. 基于FMC 接口的Xilinx FPGA XC7K325T PCIeX8 接口卡
  19. proxmox 控制台无法连接_Proxmox VE网络配置
  20. 谷歌浏览器如何截全屏图片?

热门文章

  1. 面试 -> 使用一个循环合并两个有序数组为1个有序数组
  2. 企业信息化建设-内部系统集成
  3. 考研经验---复试篇
  4. 2 RRC 三种状态
  5. 【MC】​《我的世界》命令方块指令大全​
  6. 自然语言处理之知识图谱
  7. Go Toolchains
  8. [漏洞复现]织梦CMS前台任意用户修改密码
  9. 中国银行业对外开放报告
  10. 服务器内存型号说明,服务器内存条型号