![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
程序员老林
这个作者很懒,什么都没留下…
展开
-
ArrayList源码分析一
前言我们知道如果在一个已知数组 int[] array ={1,2,3,4}里面再追加一个元素5,我们不能直接把元素添加到数组后面,因为数组的长度是不可以改变的,常见的方法是创建一个新的数组,而且需要把原来数组里面的元素一个一个的拷贝进来,然后在新数组后面添加元素。这个过程非常的麻烦,既要创建新的数组又要移动数组的元素。如果我们想要删除一个索引下面的元素;例如一个数组 int[] array ={1,2,3,4},我想把索引2下面的元素3删除掉,数组长度变成3,使数组变成 int[] array =原创 2020-10-12 19:25:45 · 108 阅读 · 0 评论 -
Handler发送消息的方式
方式1:使用 Handler.sendMessage()此处以 匿名内部类 的使用方式为例步骤1:在主线程中 通过匿名内部类 创建Handler类对象 private Handler mhandler = new Handler(){ // 通过复写handlerMessage()从而确定更新UI的操作 @Override public void handleMessage(Message ms原创 2020-08-13 10:12:22 · 5839 阅读 · 0 评论 -
集成Tinker热修复
Tinker是什么Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用Tinker来更新你的插件。它主要包括以下几个部分:gradle编译插件:tinker-patch-gradle-plugin 核心sdk库:tinker-android-lib 非gradle编译用户的命令行版本:tinker-patch-cli.jar为什么使用Tinker当前市面的热补丁方案有很多,其中比较...原创 2020-07-08 10:04:10 · 584 阅读 · 0 评论 -
集成AndFix热修复
补丁文件的生成使用apkpatch命令生成apatch包bug版本打包生成old.apk 修复后的版本再打包生成new.apk如果没有配置环境变量,可以直接到apkpatch文件夹内部,才可以使用这个命令。我是没有配置环境变量的,先看下apkpatch命令有哪些参数提供了2个命令,第一个命令 usage: apkpatch -f 是用来生成一个patch文件第二个命令usage: apkpatch -m 是用来将多个patch文件合并成一个接下来看下ap...原创 2020-07-06 15:39:29 · 197 阅读 · 0 评论 -
Kotlin学习之泛型函数和星投影
泛型函数和Java类型,除了泛型类,函数本身也是支持泛型的。 fun <T> getValue(item: T): T { return item }普通的函数是没有<T>这部分内容的,表示这个是泛型函数,拥有一个泛型类型T。 val item = getValue<Int>(100)星投影对于Foo <out T : TUpper>,其中T是一个具有上界TUpper的协变类型参数,F...原创 2020-07-03 17:36:59 · 380 阅读 · 0 评论 -
Kotlin学习之泛型详解
Kotlin:声明处协变 ,在类型参数声明处提供Java:使用处协变,具体使用的时候才声明协变我们随便定义一个泛型如下:class B<T extends CharSequence>{ }这个表示在实例化B的时候你提供的泛型T必须是CharSequence或者CharSequence的子类,这个和Java的使用处协变不是一回事。我们说的使用处协变是下面这种形式B<? extends ...>两种方式不要混为一谈。举个例子:inter原创 2020-07-02 18:00:51 · 371 阅读 · 0 评论 -
MVP与Jetpack组合应用
搭建MVC框架public class MainActivity extends AppCompatActivity { private ListView listView; private ArrayList<String> list = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea原创 2020-07-02 14:02:35 · 2638 阅读 · 2 评论 -
Kotlin学习之泛型(协变和逆变实战)
首先看看在Java中@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main4); List<Cat> cats = new ArrayList<>(); List<? extends Animal> anima.原创 2020-06-30 19:43:14 · 234 阅读 · 2 评论 -
Kotlin学习之泛型(协变及逆变)
首先看看在Java中的泛型List<Object> list1;这样声明,表示我可以给list1放置任何类型的对象。List<String> list2;这样表明,list2只可以放置类型是String的对象。但是在java中这样是不允许的List<String> list1 = new ArrayList();List<Object> list2 = list1 ; //编译失败这意味着List<String&g.原创 2020-06-23 18:46:27 · 233 阅读 · 0 评论 -
跳转高德地图的一个carsh
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW cat=[android.intent.category.DEFAULT] dat=amapuri://route/plan/?dlat=30.241878&dlon=120.440527&dname=杭州萧山机场T1&dev=0&t=0 }at and.原创 2020-06-01 14:47:17 · 1006 阅读 · 0 评论 -
Handler源码分析
public class MainActivity extends AppCompatActivity { private Handler handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what) { .原创 2020-05-12 10:07:41 · 233 阅读 · 0 评论 -
ThreadLocal的工作原理
ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,对于其他线程来说则无法获取到数据。对于Handler来说,它需要获取当前线程的Looper,很显然Looper的作用域就是线程并且不同线程具有不同的Looper,这个时候通过ThreadLocal就可以轻松实现Looper在线程中的存取。看下ThreadLocal在Handler的使用主线程Looper.prepare()的源码public fin原创 2020-05-11 14:47:04 · 199 阅读 · 0 评论 -
自定义View绘制一个圆
继承View重写onDraw方法首先实现一个很简单的自定义控件,绘制一个圆。public class CircleView extends View { private Paint paint; public CircleView(Context context) { super(context); init(); } public CircleView(Context context, @Nullable Attribute原创 2020-05-09 10:59:30 · 693 阅读 · 0 评论 -
自定义ViewGroup
package com.example.customviewpager;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.view.ViewGroup;public class CustomImageContainer extends ViewGroup { public C.原创 2020-05-08 17:45:10 · 91 阅读 · 0 评论 -
自定义ViewGroup实现ViewPager
1.scrollBy()和scrollTo()的区别:scrollBy(x, y)源码:public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y);}可以看到scrollBy()方法中就是调用了scrollTo()方法,但是传递给scrollTo()方法的参数是在当前View的偏移量的基...原创 2020-05-08 16:29:12 · 232 阅读 · 0 评论 -
Android中的IPC方式
本章开始介绍各种跨进程通信方式。具体方式有很多,比如可以通过在Intent中附加extras来传递信息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外,ContentProvider天生就是支持跨进程访问的,因此我们也可以采用它来进行IPC。此外,通过网络通信也是可以实现数据传递的,所以Socket也可以实现IPC。使用Bundle(最简单的进程通信方式)我们知...原创 2020-05-05 17:06:20 · 158 阅读 · 0 评论 -
RxView防抖,解决多次点击问题
//多次点击只产生一次请求,防抖动 btn_order_pay.setOnClickListener { RxView.clicks(btn_order_pay) .throttleFirst(1, TimeUnit.SECONDS) ...原创 2020-04-22 13:36:39 · 2476 阅读 · 0 评论 -
拍照、下载apk的Android版本的适配问题(Android6.0 Android7.0 Android8.0)
在官方7.0的以上的系统中,尝试传递file://URI可能会触发FileUriExposedException。google提供了FileProvider,使用它可以生成content://Uri来替代file://Uri使用FileProvider兼容拍照(1)声明provider<provider android:name="android.support.v4...原创 2020-03-03 16:00:14 · 453 阅读 · 0 评论 -
侧滑删除
实现效果点击删除按钮: mAdapter.setOnRightItemClickListener(new SwipeAdapter.onRightItemClickListener() { @Override public void onRightItemClick(View v, int position) {原创 2018-01-06 15:29:35 · 272 阅读 · 0 评论 -
PopupWindow 一般商城都用得到 有综合排序
效果图:PopupWindow的知识点//方法一: public PopupWindow (Context context) //方法二: public PopupWindow(View contentView) //方法三: public PopupWindow(View contentView, int width, int height) //方法四: public PopupWi...原创 2018-01-08 15:53:48 · 424 阅读 · 0 评论 -
PopupWindow里面动态添加内容的应用
效果图如下:核心代码: private void showDialog() { LayoutInflater layoutInflater = LayoutInflater.from(this); View bordView = layoutInflater.inflate(R.layout.goods_select_pop_up, null); ...原创 2018-04-26 10:38:18 · 2249 阅读 · 0 评论 -
RecyclerView 最新添加的item在最上面
效果图如下:核心代码如下: findViewById(R.id.add).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GoodItemInfo goodItemInfo...原创 2018-04-26 11:40:26 · 6249 阅读 · 0 评论 -
营销活动标签 在TextView末尾加标签 使用SpannableStringBuilder实现
1、每个item只有一个标签的情况核心代码: public void setTagEnd(String tag, String content) { StringBuffer contentBuffer = new StringBuffer(content); int fromIndex = contentBuffer.length(); con...原创 2018-06-27 18:15:04 · 455 阅读 · 0 评论 -
CoordinatorLayout的使用 AppBarLayout
核心代码 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/exchange...原创 2018-07-10 11:44:59 · 178 阅读 · 0 评论 -
Android 平板开发关闭一个Fragment的方法
关闭一个Fragment 的方法:方法一:回退栈的方法,通过tag,关闭特定的FragmentpopBackStack(arg0,arg1)arg0:回退fragment的标记tagarg1:是否包含该fragment.(0不包含,1包含)示例: private void finishFragment() { List<Fragment>...原创 2018-09-13 15:08:49 · 2561 阅读 · 0 评论 -
Android 平板开发回退栈的管理
我的平板开发分为5个模块为了方便对各个模块里面的Fragment 的管理所以我给新建的每一个Fragment设置了type,在BaseFragment中加入了如下的方法。 public enum FragmentType { CASH, MEMBER, ORDER, STATISTIC, SETTIGN } public abstract Fragme...原创 2018-09-13 15:17:14 · 193 阅读 · 0 评论 -
RecyclerView 实现网格布局 item四周有分割线 展示分类信息
效果如下:每一个item核心代码:public class HistoryItemView extends LinearLayout { private ScrollViewWithRecyclerView historyRv; private Context context; private List<String> data; pr...原创 2019-05-12 19:28:39 · 1046 阅读 · 0 评论 -
标签控件 流式布局 实现单选 多选
单选效果图: 以setAdapter形式注入数据 mFlowLayout.setAdapter(new TagAdapter(mVals) { @Override public View getView(FlowLayout parent, int position, String s)原创 2018-01-05 09:51:32 · 1528 阅读 · 0 评论