- 在学习和开发的过程中总会有一些小感悟,小技巧,这些小东西有一个共同点就是,总结起来篇幅短形成不了常规的文章,但是很重要,于是我把它们总结在这里,慢慢更新叭;
- 至于篇幅大的技巧,我会写成文章, 把链接贴在这里**Android笔记汇总目录(Updating)**
请大家多多指教啦~
##关于程序设计模式 ######关于接口与实现
-
Java程序设计中,
-
我们可以抽象一个接口
(类比onClickListener), 把后续需要实现的方法 在这个接口中 写成抽象方法(只有方法名声明,没有方法体), -
在需要用到这些方法的地方,即定义一个接口实现类
(类比Activity), 我们用这个接口实现类去implement这个接口, 实现接口中的方法, 此时需要注意的是, 这里一般只实现,不调用; 以及, 我们这个接口实现类已经是抽象接口的一个子类了, 关于向上转型的思想, 接口实现类实例可以当成接口类型对象来用; -
定义一个业务实现类
(类比View.class), 设置一个全局接口实现类实例对象 通过一个接收方法接收一个接口实现类实例并 将这个传过来的接口实现类实例设置给全局接口实现类实例对象, 从而通过这个全局接口实现类实例对象, 我们能在业务实现类各种调用实现了的抽象接口中的方法;
-
-
实际上来说,这种设计模式可以
类比于Android系统的Click监听机制, 同样的,也可以类比于MVP设计模式: (下图详情来自文章: Android实战 | 详解MVC、MVP模式并分别实现登录界面案例)
##关于定时任务
######循环定时任务用什么方法合适
- 其实我觉得现在主要用的也就是两种方法,
第一种:handler.postDelayed();
第二种:AlarmManger+BroadcastReceiver;
-
感觉资源的话可能是要看实际情况? 看看主线程比较闲还是子线程开得少, 因为 handler是基于消息机制运行在子线程的, 然后 AlarmManger+BroadcastReceiver是基于四大组件的Service和Broadcast,依赖于Android系统服务,占用的是主线程的资源;
-
然后就编码角度的话我觉得毫无疑问是handler.postDelayed()比较简单, 就几行代码,后者要配置的东西多点
-
#UI
- ####一个常用的简单的Button自定义样式模板
- btn_press_state.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/btn_radius_unpressed"/>
<item android:state_pressed="true" android:drawable="@drawable/btn_radius_pressed"/>
</selector>
- btn_radius_pressed.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp"></corners>
<solid android:color="@color/colorPrimaryDark"></solid>
</shape>
- btn_radius_unpressed.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp"></corners>
<solid android:color="@color/colorPrimary"></solid>
</shape>
- ####一条线
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/layout_dividerLine"
android:layout_height="wrap_content"
android:orientation="vertical" >
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/style_devider_line_color"/>
</LinearLayout>
----
<color name="style_devider_line_color">#CDCAC8</color>
----
<include layout="@layout/divider_line" />
- ####一个灰色边框
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/white" />
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
</shape>
##关于AS
如下这种文件特别多但是总大小很小的情况下,确定文件安全的话,别在AS里面复制粘贴,几百多个检查进程会卡死你的PC,直接在OS平台复制粘贴就好了!!!!!!!!!!
##有趣博文
#####项目开发
#####零碎知识
#####软文
#关于RecycleView
###bug
- 之前好好的项目,今天一上来一打开,居然这样了:
无法识别第三方库RecycleView。。。 跑到app/gradle配置文件下面,把下面这行代码剪切(删)了,再重新添加,同步一下,就解决了。。。挺无语的
- 包括如果这种v4啊v7的包爆红了
也是对gradle做下“改动”操作(随便对某段依赖删了又加), 重新同步一下就解决了, 是个很无语的小问题
###实战心得
-
RecycleView的item我们写在一个xml布局文件里面, 使用时, 在
onCreateViewHolder中把整个xml文件内容作为一个View实例加载进来, 一般这个View实例的内容 仅是一个View或者是一个包含了很多View的ViewGroup, 把这些View或者和ViewGroup都分别指定成一个个实例, 作为ViewHolder的全局对象存储在ViewHolder中;在
onBindViewHolder中,拿到数据(或者与RcView绑定的数据列表), 把数据注入到item布局的各个View中, 这时候便用到刚刚准备好的ViewHolder了; -
点击事件同样在
onCreateViewHolder中编写(下面是例程):接收并处理:
######点击前往例程出处
#BUG/DeBug汇集
####1. !!!!!空指针 !!!!!
TinkerUncaughtHandler catch exception:java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
#####***可能原因汇集
- 布局xml文件中
<View>组件写错成<view> 变量未实例化, 如组件忘记findViewById实例化, 如适配器忘记实例化, 或者List<xxx> list;忘记= new ArrayList<>();实例化等等;
####2. 组件“消失”
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns: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="com.ui.personalCenter.DetailActivity">
<include
layout="@layout/layout_include_toolbar"></include>
<com.widget.RecyclerView
android:id="@+id/rcv_product_detail_of_vm_coin_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:layout_marginBottom="46dp"
android:clipToPadding="false"/>
</LinearLayout>
上面这个布局,include标签下的toolbar宽度是“match_parent”,
那么这个布局中,RecycleView是不会显示的,
为什么?
唉,
你的LinearLayout没有加 android:orientation="vertical"啊,
所以**默认是水平方向。。。**
RecycleView排在宽度是“match_parent”的toolbar的右边呢,
还能显示出来吗
####3.调试数据 3.1 getxxxExtra()的时候一定要把数据类型写对! 一个int的Extra, 你写个getStringExtra()肯定get不到啊!!!!
3.2 调试log时,巧妙使用提示语言,
以便利用logcat过滤器索引log打印内容:
3.3 数据和数据变量的初始化代码,
一定要放在数据和数据变量的使用代码之前,
先
初始化再使用,注意函数的调用顺序!!
不然顺序颠倒,
使用了未初始化的数据和数据变量,
绝对是null!!!
####4.RecycleView没显示
- 所以的
初始化adapter了吗? - 所以你
初始化RecycView了吗? - 所以你给
RecycleView设置LayoutManager了吗? - 所以你adapter设置
数据了吗? - 所以你给初始化好的
RecycleView实例set设置了有数据的adapter了吗? - 注意代码顺序,
先初始化RecycView、adapter实例,
再给给
RecycleView设置LayoutManager, 最后给RecycleView设置adapter!!!adapter设置数据放在初始化adapter实例后即可!!!
mRecyclerView = findViewById(R.id...);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new MyAdapter();
mRecyclerView.setAdapter(mAdapter);