AndroidSmallTips(Updating)

98 阅读5分钟
  • 在学习和开发的过程中总会有一些小感悟,小技巧,这些小东西有一个共同点就是,总结起来篇幅短形成不了常规的文章,但是很重要,于是我把它们总结在这里,慢慢更新叭;
  • 至于篇幅大的技巧,我会写成文章, 把链接贴在这里**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);