|
2 | 2 |
|
3 | 3 | * 码云地址:[Gitee](https://gitee.com/getActivity/AndroidCodeStandard)
|
4 | 4 |
|
5 |
| -* 鸿洋力推:[荐一份 Android 代码规范建议文档](https://mp.weixin.qq.com/s/Zv1zVom69RFrMJ1q8tP8Lw) |
| 5 | +* 鸿洋力荐:[荐一份 Android 代码规范建议文档](https://mp.weixin.qq.com/s/Zv1zVom69RFrMJ1q8tP8Lw) |
6 | 6 |
|
7 | 7 | * 做开源几年了,被很多人夸过,你的代码写得比较规范,[甚至有人质疑自己代码的写法](https://github.com/getActivity/AndroidProject/issues/55),但是迟迟没有出一个代码规范,说来惭愧,只是因为我早几年写的代码还不够规范,不敢出来误导大家,而代码规范是后续才慢慢养成的,在这个过程中,我不仅参考了大公司出的代码规范文档,也研究了很多关于谷歌源码的编码规范,同时我也在无时不刻在思考,如何能写出让别人更好理解的代码,自打入行以来,我就在一直在这个问题上面探索。
|
8 | 8 |
|
|
20 | 20 |
|
21 | 21 | * 2021 年 3 月 11 日:[新增版本命名规范](https://github.com/getActivity/AndroidCodeStandard/commit/68f242c839ae040aaf4624fb8243137366b89cc9)
|
22 | 22 |
|
23 |
| -* 2021 年 2 月 23 日:[补充代码规范原则、补充参数传递规范](https://github.com/getActivity/AndroidCodeStandard/commit/1a1ad4a7c26ff75e588b689c51ab126fe32c78a1) |
| 23 | +* 2021 年 2 月 23 日:[<br>补充代码规范原则<br>补充参数传递规范](https://github.com/getActivity/AndroidCodeStandard/commit/1a1ad4a7c26ff75e588b689c51ab126fe32c78a1) |
24 | 24 |
|
25 | 25 | * 2021 年 2 月 21 日:[<br>补充多模块规范<br>补充代码硬编码规范<br>补充资源硬编码规范<br>补充 Color ID 命名规范<br>补充写代码规范文档的原因<br>纠正公开成员变量命名方式<br>添加谷歌代码样式指南链接](https://github.com/getActivity/AndroidCodeStandard/commit/be4847c2c476031484bac97dec036228900e2f60)
|
26 | 26 |
|
|
70 | 70 |
|
71 | 71 | * [参数传递规范](#参数传递规范)
|
72 | 72 |
|
| 73 | +* [代码美观性要求](#代码美观性要求) |
| 74 | + |
73 | 75 | * [第三方框架使用规范](#第三方框架使用规范)
|
74 | 76 |
|
75 | 77 | * [多模块规范](#多模块规范)
|
|
116 | 118 |
|
117 | 119 | #### 代码规范原则
|
118 | 120 |
|
119 |
| -* 在讲之前,我们先想一个问题,代码规范的出现是为了什么?不就为了让我们更好地进行团队协作和项目维护吗?没错的,所以代码规范原则应该围绕这两点进行。 |
| 121 | +* 在讲之前,我们先想一个问题,代码规范的出现是为了什么?不就为了让我们更好地进行团队协作和项目维护吗?没错的,所以代码规范原则应该围绕这两个目标进行。 |
120 | 122 |
|
121 | 123 | * **特事特办**:代码规范文档只能解决 **99.99%** 场景下的问题,特殊情况应该要特殊处理,违背者需要给出**合理的解释**,建议在代码中直接**用注释注明**,这样可以**减少沟通成本**,否则在一般情况下应当要遵守代码规范文档上的约束。
|
122 | 124 |
|
@@ -735,13 +737,222 @@ new VideoPlayActivity.Builder()
|
735 | 737 | .start(getAttachActivity());
|
736 | 738 | ```
|
737 | 739 |
|
| 740 | +#### 代码美观性要求 |
| 741 | + |
| 742 | +* 第一个大括号应当统一放在表达式后面,而不应该换行处理,例如: |
| 743 | + |
| 744 | +```java |
| 745 | +// 不规范写法示例 |
| 746 | +if (AppConfig.isDebug()) |
| 747 | +{ |
| 748 | + ...... |
| 749 | +} |
| 750 | +``` |
| 751 | + |
| 752 | +```java |
| 753 | +// 规范写法示例 |
| 754 | +if (AppConfig.isDebug()) { |
| 755 | + ...... |
| 756 | +} |
| 757 | +``` |
| 758 | + |
| 759 | +* 代码之间应当有适当的空格,空格不用多也不能少,恰到好处即可,例如: |
| 760 | + |
| 761 | +```java |
| 762 | +// 不规范写法示例 |
| 763 | +public static boolean isAppInstalled(Context context ,String packageName ){ |
| 764 | + try { |
| 765 | + context.getPackageManager().getApplicationInfo(packageName,0); |
| 766 | + return true; |
| 767 | + }catch( PackageManager.NameNotFoundException e ){ |
| 768 | + e.printStackTrace(); |
| 769 | + return false ; |
| 770 | + } |
| 771 | +} |
| 772 | +``` |
| 773 | + |
| 774 | +```java |
| 775 | +// 规范写法示例 |
| 776 | +public static boolean isAppInstalled(Context context, String packageName) { |
| 777 | + try { |
| 778 | + context.getPackageManager().getApplicationInfo(packageName, 0); |
| 779 | + return true; |
| 780 | + } catch (PackageManager.NameNotFoundException e) { |
| 781 | + e.printStackTrace(); |
| 782 | + return false; |
| 783 | + } |
| 784 | +} |
| 785 | +``` |
| 786 | + |
| 787 | +* 适当换行有助于提升代码的可读性,在单行代码较长的情况下可以考虑换行,例如: |
| 788 | + |
| 789 | +```java |
| 790 | +// 不规范写法示例 |
| 791 | +ScaleAnimation animation = new ScaleAnimation(1.0f, 1.1f, 1.0f, 1.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); |
| 792 | +textView.startAnimation(animation); |
| 793 | +``` |
| 794 | + |
| 795 | +```java |
| 796 | +// 规范写法示例 |
| 797 | +ScaleAnimation animation = new ScaleAnimation(1.0f, 1.1f, 1.0f, 1.1f, |
| 798 | + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); |
| 799 | +textView.startAnimation(animation); |
| 800 | +``` |
| 801 | + |
| 802 | +* 链式写法不能只用一行代码,而是应当遵守一句 API 换一行的策略,例如: |
| 803 | + |
| 804 | +```java |
| 805 | +// 不规范写法示例 |
| 806 | +GlideApp.with(this).load(url).circleCrop().into(imageView); |
| 807 | +``` |
| 808 | + |
| 809 | +```java |
| 810 | +// 规范写法示例 |
| 811 | +GlideApp.with(this) |
| 812 | + .load(url) |
| 813 | + .circleCrop() |
| 814 | + .into(imageView); |
| 815 | +``` |
| 816 | + |
| 817 | +* 方法参数的排序,上下文参数应当统一放在最前面,而回调监听应当统一放在最后面,例如: |
| 818 | + |
| 819 | +```java |
| 820 | +public void openSystemFileChooser(Activity activity, FileChooserParams params, ValueCallback<Uri[]> callback) { |
| 821 | + ...... |
| 822 | +} |
| 823 | +``` |
| 824 | + |
| 825 | +* 变量和方法的排序,应当根据重要程度、API 类型、执行顺序这几点来摆放,例如: |
| 826 | + |
| 827 | +```java |
| 828 | +// 变量排序示例 |
| 829 | +public class BaseDialog { |
| 830 | + |
| 831 | + public static class Builder<B extends BaseDialog.Builder<?>> |
| 832 | + |
| 833 | + /** 宽度和高度 */ |
| 834 | + private int mWidth = WindowManager.LayoutParams.WRAP_CONTENT; |
| 835 | + private int mHeight = WindowManager.LayoutParams.WRAP_CONTENT; |
| 836 | + |
| 837 | + /** 是否能够被取消 */ |
| 838 | + private boolean mCancelable = true; |
| 839 | + /** 点击空白是否能够取消 前提是这个对话框可以被取消 */ |
| 840 | + private boolean mCanceledOnTouchOutside = true; |
| 841 | + |
| 842 | + /** 背景遮盖层开关 */ |
| 843 | + private boolean mBackgroundDimEnabled = true; |
| 844 | + /** 背景遮盖层透明度 */ |
| 845 | + private float mBackgroundDimAmount = 0.5f; |
| 846 | + |
| 847 | + /** Dialog 创建监听 */ |
| 848 | + private BaseDialog.OnCreateListener mCreateListener; |
| 849 | + /** Dialog 显示监听 */ |
| 850 | + private final List<BaseDialog.OnShowListener> mShowListeners = new ArrayList<>(); |
| 851 | + /** Dialog 取消监听 */ |
| 852 | + private final List<BaseDialog.OnCancelListener> mCancelListeners = new ArrayList<>(); |
| 853 | + /** Dialog 销毁监听 */ |
| 854 | + private final List<BaseDialog.OnDismissListener> mDismissListeners = new ArrayList<>(); |
| 855 | + /** Dialog 按键监听 */ |
| 856 | + private BaseDialog.OnKeyListener mKeyListener; |
| 857 | + } |
| 858 | +} |
| 859 | +``` |
| 860 | + |
| 861 | +```java |
| 862 | +// 方法排序示例 |
| 863 | +public class BaseDialog { |
| 864 | + |
| 865 | + public static class Builder<B extends BaseDialog.Builder<?>> |
| 866 | + |
| 867 | + /** |
| 868 | + * 设置宽度 |
| 869 | + */ |
| 870 | + public B setWidth(int width) { |
| 871 | + ...... |
| 872 | + } |
| 873 | + |
| 874 | + /** |
| 875 | + * 设置高度 |
| 876 | + */ |
| 877 | + public B setHeight(int height) { |
| 878 | + ...... |
| 879 | + } |
| 880 | + |
| 881 | + /** |
| 882 | + * 是否可以取消 |
| 883 | + */ |
| 884 | + public B setCancelable(boolean cancelable) { |
| 885 | + ...... |
| 886 | + } |
| 887 | + |
| 888 | + /** |
| 889 | + * 是否可以通过点击空白区域取消 |
| 890 | + */ |
| 891 | + public B setCanceledOnTouchOutside(boolean cancel) { |
| 892 | + ...... |
| 893 | + } |
| 894 | + |
| 895 | + /** |
| 896 | + * 设置背景遮盖层开关 |
| 897 | + */ |
| 898 | + public B setBackgroundDimEnabled(boolean enabled) { |
| 899 | + ...... |
| 900 | + } |
| 901 | + |
| 902 | + /** |
| 903 | + * 设置背景遮盖层的透明度(前提条件是背景遮盖层开关必须是为开启状态) |
| 904 | + */ |
| 905 | + public B setBackgroundDimAmount(float dimAmount) { |
| 906 | + ...... |
| 907 | + } |
| 908 | + |
| 909 | + /** |
| 910 | + * 设置创建监听 |
| 911 | + */ |
| 912 | + public B setOnCreateListener(BaseDialog.OnCreateListener listener) { |
| 913 | + ...... |
| 914 | + } |
| 915 | + |
| 916 | + /** |
| 917 | + * 添加显示监听 |
| 918 | + */ |
| 919 | + public B addOnShowListener(BaseDialog.OnShowListener listener) { |
| 920 | + ...... |
| 921 | + } |
| 922 | + |
| 923 | + /** |
| 924 | + * 添加取消监听 |
| 925 | + */ |
| 926 | + public B addOnCancelListener(BaseDialog.OnCancelListener listener) { |
| 927 | + ...... |
| 928 | + } |
| 929 | + |
| 930 | + /** |
| 931 | + * 添加销毁监听 |
| 932 | + */ |
| 933 | + public B addOnDismissListener(BaseDialog.OnDismissListener listener) { |
| 934 | + ...... |
| 935 | + } |
| 936 | + |
| 937 | + /** |
| 938 | + * 设置按键监听 |
| 939 | + */ |
| 940 | + public B setOnKeyListener(BaseDialog.OnKeyListener listener) { |
| 941 | + ...... |
| 942 | + } |
| 943 | + } |
| 944 | +} |
| 945 | +``` |
| 946 | + |
| 947 | +* 代码美观性虽然不会干扰到业务的正常进行,但是对一个程序员来讲,它是对技术的一种追求和热爱,同时也是工匠精神的体现。 |
| 948 | + |
738 | 949 | #### 第三方框架使用规范
|
739 | 950 |
|
740 | 951 | * 集成一些第三方框架或者 SDK,必须注明作用和出处,以便出现问题时能够快速核查和反馈。
|
741 | 952 |
|
742 | 953 | ```groovy
|
743 | 954 | // 权限请求框架:https://github.com/getActivity/XXPermissions
|
744 |
| -implementation 'com.hjq:xxpermissions:9.8' |
| 955 | +implementation 'com.hjq:xxpermissions:10.6' |
745 | 956 | ```
|
746 | 957 |
|
747 | 958 | * 尽量不要选择功能两套相同的框架,应当引用最合适的一套框架进行开发。
|
@@ -1256,7 +1467,7 @@ bottom_out_dialog.xml
|
1256 | 1467 | android:textSize="18dp" />
|
1257 | 1468 | ```
|
1258 | 1469 |
|
1259 |
| -``` |
| 1470 | +```xml |
1260 | 1471 | <!-- 规范写法示例 -->
|
1261 | 1472 | <TextView
|
1262 | 1473 | android:layout_width="wrap_content"
|
|
0 commit comments