本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
前言
距离安卓项目结束已经过去了好几天,之后很长一段时间我应该都不会再写和安卓有关的项目了。今天偶然翻到之前写的笔记,想了想还是决定整理出来,希望对后来要完成课设的学弟学妹们有帮助。
(因为课设用到的一些包、组件都是旧的,而且不允许用框架,必须写原生Java或者Kotlin,所以以下一些经验不适用于实际项目开发。)
构建原生安卓应用
- 不希望图标在res目录下的每个文件夹都出现一次的话就用 vector assert
- 在newInstance()里面new了fragment之后记得setArgument并且在oncreate()里面get(官方模板写法由来),否则可能会在旋转屏幕时触发空指针异常
- 官方推荐使用FragmentContainerView关联activity和fragment。
有两种方式,一是静态添加到xml文件。
二是动态添加,在xml文件中不要指明目标的最后一行,在activity中首次创建实例时再动态添加。
- Gradle每次都会下载哪怕是同一版本的文件:即使是同一版本,gradle-wrapper.jar的url路径也不同(是由哈希方法产生的),基数会在32~36之间变化:
private String getHash(String string) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] bytes = string.getBytes();
messageDigest.update(bytes);
return new BigInteger(1, messageDigest.digest()).toString(36);
} catch (Exception e) {
throw new RuntimeException("Could not hash input string.", e);
}
}
- xml文件中,为什么会同时出现android:和tools:后接同一个属性?
tools可理解为是预览界面用的。
改了tools后的相关属性,在split或者design那里能立即看到效果,但是它在app正式运行的时候不会存在。android:则相反,正在写界面时看不到,但是正式运行时以它为准。
- 为安卓应用添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
!!! 注意!!! 没有搜索结果第一条写的尾标签。不要被误导了!!!
- RecyclerView:展示尽可能多的内容的同时,使消耗内存尽可能小
原理:当下滑屏幕的时候,上面的view的空间没有被destroy,而是被重新利用以显示当前的。(有种即时渲染的意味)
列表(或网格)中每个单独的元素由viewholder定义,viewholder创建之初是不含数据的,是recyclerview将数据绑定到上面。这个viewholder用于定义列表项的功能表现。
要为viewholder配一个适配器(重写以下三个方法:onCreateViewHolder()、onBindViewHolder()、getItemCount())
- 想要在xml页面中包含另一页面部分(如导航栏),可以用类似以下的写法
(即复用组建的时候不需要重复粘贴代码,include即可)
<include layout="@layout/layout_bottom_navigation_view"/>
- 从网上找了个组件库,用上去之后发现4年前已经停止维护了,该库封装的组件的某个方法已于今年被弃用,大家用组件库的时候一定要看清楚啊!
勘误:官方文档显示:
BottomNevigationView中,被弃用的是:setOnNavigationItemReselectedListener和setOnNavigationItemSelectedListener,截至目前应该换成setOnItemSelectedListener,网上有些文章好像说反了。
底部导航栏配合fragment使用有三种方式:
- FrameLayout + FragmentTransaction
- ViewPager
- 配合nevigation
activity转换为fragment只需要注意以下三点转换:
- 将activity的onCreate()中的代码放到fragment的OnCreateView()
- 将原来的下述表达修改为下下述:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_set);
View view = View.inflate(getActivity(),R.layout.fragment_set,null);
3.将原来的this替换为getActivity()
4.在原来的findViewById前加上view.