android学习笔记

AS最常用的快捷键

1.Ctrl+E,可以显示最近编辑的文件列表
2.Shift+Click可以关闭文件
3.Ctrl+[或]可以跳到大括号的开头结尾
4.Ctrl+Shift+Backspace可以跳转到上次编辑的地方
5.Ctrl+F12,可以显示当前文件的结构
6.Ctrl+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择
7.Ctrl+N,可以快速打开类
8.Ctrl+Shift+N,可以快速打开文件
9.Alt+Q可以看到当前方法的声明
10.Ctrl+W可以选择单词继而语句继而行继而函数
11.Alt+F1可以将正在编辑的元素在各个面板中定位
12.Ctrl+P,可以显示参数信息
13.Ctrl+Shift+Insert可以选择剪贴板内容并插入
14.Alt+Insert可以生成构造器/Getter/Setter等
15.Ctrl+Alt+V 可以引入变量。例如把括号内的SQL赋成一个变量
16.Ctrl+Alt+T可以把代码包在一块内,例如try/catch
17.Alt+Up and Alt+Down可在方法间快速移动
18.shift+f10 run的快捷键
19.Ctrl+Alt+F 成员变量
20.Ctrl+Alt+C 静态常量
21.Ctrl+Alt+F 局部变量
22,ctrl+h 查看类的继承关系
23,alt+ctrl+o 清理无用的import包
27, alt+7 查看类的方法

获取应用签名:
cmd

keytool -list -keystore xxx.jks

android studio FileHeader

/*** @FileName: ${PACKAGE_NAME}.${NAME}.java* @author: villa_mou* @date: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}* @version V1.0 <描述当前版本功能>* @desc */

Space
官方注释如下:

Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts.
Space 是一个用于创建视图之间空隙的轻量级 View。在 onDraw() 方法中不执行任何绘制,所以 android:background 属性对他来说不起作用。通常我们使用 View 创建视图间的空隙,在不考虑背景色的情况下,Space 其实效率更高。注意,由于是 API 14 引入的控件,如果需要向前兼容的话,需要使用到 support v4 包。

view.performClick()

**view.performClick()**

自动调用 View 点击事件。通常按钮等控件只有在用户点击时才能触发其点击事件,该方法可以由某些特殊条件触发模拟用户点击行为。类似的还有 performLongClick() 方法。


设置安全窗口,禁用系统截屏

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)

设置安全窗口,禁用系统截屏。防止 App 中的一些界面被截屏,并显示在其他设备中造成信息泄漏。(常见手机设备系统截屏操作方式为:同时按下电源键和音量键。)
比如支付宝 App 的“向商家付款”的包含付款二维码的界面。(补充说明一点,微信付款界面不是这么做的,采用的是在 onResume() 生命周期方法中实时刷新付款二维码,与支付宝在安全方法采取的手段不同。)


拦截 Back 键,使 App 进入后台而不是关闭

  @Overridepublic void onBackPressed() {Intent launcherIntent = new Intent(Intent.ACTION_MAIN);launcherIntent.addCategory(Intent.CATEGORY_HOME);startActivity(launcherIntent);}

使用 Back 键返回桌面,但不关闭当前应用,而是使之进入后台,就像按下 Home 键一样。

这个技巧厉害了。通常为了防止出现用户误按 Back 键退出 App 的情况,我们会在应用首页的 Activity 中监听返回键操作,使用 Toast 弱提示甚至 Dialog 强提示的方式给到用户一个再次确认的操作,但无法阻止用户通过返回键逐步关闭应用。

然而,如果用这个方法拦截 App 最后一个 Activity(常见为首页界面),既没有阻碍用户操作(回到桌面),又没有关闭掉我们的应用(后台运行中),间接提高 App 的存活时间,真乃暗度陈仓。并且据我实验,微信、支付宝、微博等 App 都是这么做的,大家不妨一试。


android:fillViewport

android:fillViewport

ScrollView 的一个属性,用于设置内容部分是否填满屏幕,主要针对内容不足以填满屏幕的情况。这里推荐一个使用技巧,参考我之前写的文章:Android 日常开发中,两个非常实用的布局技巧。


Android 开发中,每个界面(Activity 或 Fragment)的 View 的 id 应当避免重复

(像 ListView 的 itemView 这种原本就带有复用机制的View除外)。因为 View 状态的保存与恢复与 id 息息相关, 如果一个界面有多个相同的id, 在状态恢复时可能出错。详情请看: android中正确保存view的状态
一般情况下,我们不会去可以制造 id 重复的情况,但如果我们同一个界面使用了很多相同的组件,而这个组件内部有定义 id, 就有可能造成这种 View 状态混乱的情况


解决如何去掉5.0以上版本button背景有阴影的问题

style=”?android:attr/borderlessButtonStyle”

SparseArray
目前有很多地方从性能优化方说使用SparseArray来替换hashMap,来节省内存,提高性能。

ArrayMap<K,V> in place of HashMap<K,V>
ArraySet<K,V> in place of HashSet<K,V>
SparseArray<V> in place of HashMap<Integer,V>
SparseBooleanArray in place of HashMap<Integer,Boolean>
SparseIntArray in place of HashMap<Integer,Integer>
SparseLongArray in place of HashMap<Integer,Long>
LongSparseArray<V> in place of HashMap<Long,V>

Context.runOnUiThread的缺点

不少人在子线程中更新View时喜欢使用Context.runOnUiThread,这个方法有个缺点,就是一但Context生命周期结束,比如Activity已经销毁时,一调用就会崩溃。

设置activity全屏的方式
设置全屏方法有2种:1.通过代码设置,2通过manifest文件设置。用代码设置全屏时app在我们应用运行后,可能会看到短暂的状态栏,然后才全屏,而第二种方法是不会有这种情况的,所以推荐第二种。

//方法1:
//无title
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN,WindowManager.LayoutParams. FLAG_FULLSCREEN);
//必须在setContentView()之前调用
setContentView(R.layout.main);
//方法2:
<activity android:name="." android:theme="@android:style/Theme.NoTitleBar.Fullscreen" //全屏主题android:label="@string/app_name" />

onNewIntent(intent)

mainactivity设置为singletask,通过Intent启到一个Activity,如果系统已经存在一个实例,
不调用onCreate方法,而是调用onNewIntent方法

snackbar使用的问题

使用SnackBar的时候,不要使用view.getRootView()作为snackbar的view,华为荣耀7 会出问题。

lines =1出现的问题

设置TextView单行显示的时候不要用Lines=1,而要用singleLine="true"
,因为魅族部分手机在设置Lines=1的时候,然后TextView的值全为数字的时候, 你就会懵逼了.

android:animateLayoutChanges 让布局产生动画

android:animateLayoutChanges 这是一个非常酷炫的属性。在父布局加上 `android:animateLayoutChanges="true"` 后,
如果触发了layout方法(比如它的子View设置为GONE),系统就会自动帮你加上布局改变时的动画特效!!

setUserVisibleHint

使用FragmentPagerAdapter+ViewPager时,切换回上一个Fragment页面时(已经初始化完毕),
不会回调任何生命周期方法,也不会走onHiddenChanged()方法,所以在viewPage配合fragment搭建页面的情况下,
切换页面时候,只能使用setUserVisibleHint方法。
  @Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser);if (isVisibleToUser) {// 相当于onResume()方法} else {// 相当于onpause()方法}}

适配三星Galaxy S8及S8+黑边问题

开发者只需在App的AndroidManifest.xml文件 中添加如下代码:

<meta-data android:name="android.max_aspect" android:value="2.1" />

优化键盘隐藏功能,点击屏幕任何位置隐藏键盘

 @Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_UP) {View v = getCurrentFocus();//如果不是落在EditText区域,则需要关闭输入法if (HideKeyboard(v, ev)) {InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);}}return super.dispatchTouchEvent(ev);}// 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘private boolean HideKeyboard(View view, MotionEvent event) {if (view != null && (view instanceof EditText)) {int[] location = {0, 0};view.getLocationInWindow(location);//获取现在拥有焦点的控件view的位置,即EditTextint left = location[0], top = location[1], bottom = top + view.getHeight(), right = left + view.getWidth();//判断我们手指点击的区域是否落在EditText上面,如果不是,则返回true,否则返回falseboolean isInEt = (event.getX() > left && event.getX() < right && event.getY() > top&& event.getY() < bottom);return !isInEt;}return false;}

设置EditText输入的文字全部变成大写或小写

public class AllCapTransformationMethod extends ReplacementTransformationMethod {  private char[] lower = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};  private char[] upper = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};  private boolean allUpper = false;  public AllCapTransformationMethod(boolean needUpper) {  this.allUpper = needUpper;  }  @Override  protected char[] getOriginal() {  if (allUpper) {  return lower;  } else {  return upper;  }  }  @Override  protected char[] getReplacement() {  if (allUpper) {  return upper;  } else {  return lower;  }  }
}

使用

editText.setTransformationMethod(newAllCapTransformationMethod(true));

完美解决RecyclerView和ScrollView滑动边缘阴影效果

android:overScrollMode="never"

scrollView滚动到底部和顶部

滚到到底部:

mRootScrollView.fullScroll(ScrollView.FOCUS_DOWN);

滚动到顶部:

mRootScrollView.fullScroll(ScrollView.FOCUS_UP);
mRootScrollView.scrollTO(0,0);

在xml中给recyclerView配置manager

 <android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:overScrollMode="never"app:layoutManager="LinearLayoutManager"/>

NestedScrollView嵌套RecyclerView导致滑动不流畅的问题
禁用RecyclerView的滑动事件

 fragmentLeftrecyclerview.setNestedScrollingEnabled(false);

类继承之间的调用顺序 父类static成员 -> 子类static成员 -> 父类普通成员初始化和初始化块 -> 父类构造方法 -> 子类普通成员初始化和初始化块 -> 子类构造方法

在activity中调用 moveTaskToBack (boolean nonRoot)方法即可将activity 退到后台,注意不是finish()退出。


view的isShown方法,只有当view本身以及它的所有祖先们都是visible时,isShown()才返回TRUE。
而平常我们调用if(view.getVisibility() == View.VISIBLE)只是对view本身而不对祖先的可见性进行判断。

Activity.recreate重新创建Activity。有什么用呢?可以在程序更换主题后,立马刷新当前Activity,
而不会有明显的重启Activity的动画。

onTrimMemory

在Activity中重写此方法,会在内存紧张的时候回调(支持多个级别),便于我们主动的进行资源释放,避免OOM。


图片的资源文件官方推荐只把launcher放在mipmap文件夹下面,而app用到的资源文件建议放在drawable下面。

在Android 4.0以后,在Manifest.xml中静态注册的广播,程序安装后必须启动一次才能接收到广播,
比如你的应用监听开机启动的广播,必须要你的程序被运行过才能监听到

测试app的时候,我们大都想要将debug和release版本同时安装到手机里,可以通过在gradle中修改applicationid来实现:

android {buildTypes {debug {applicationIdSuffix '.debug'versionNameSuffix '-DEBUG'}release {//...}}
}

当WebView与ScrollView嵌套使用,并且WebView有字体放大缩小的功能时,当切换webview的字体后,webview的高度并不能很好的计算出来,这时候可以通过注入的方式,让js算出高度,经测试,这样是最可靠的,代码地址这里写链接内容


在assert文件夹下存放单个文件的大小不能超过1M,如果读取超过1M的文件会报 “Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)” 的IOException。如果一定要存储,可以分割文件,再去合并文件


自定义控件中测量文字的高度

1Paint.FontMetrics fm = mTextPaint.getFontMetrics();int mTxtHeight = (int) Math.ceil(fm.leading- fm.ascent);2val baseLineY = Math.abs(mTextPaint.ascent() + mTextPaint.descent()) / 2

在receiver或者service里面弹自定义弹窗

                AlertDialog.Builder builder = new AlertDialog.Builder(context);LayoutInflater inflater = LayoutInflater.from(context);View view = inflater.inflate(R.layout.dialog_notification, null);View btnSure = view.findViewById(R.id.dialog_btnSure);View btnRefuse = view.findViewById(R.id.dialog_btnRefuse);final Dialog dialog = builder.create();dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);dialog.show();//自定义布局应该在这里添加,要在dialog.show()的后面dialog.getWindow().setContentView(view);btnSure.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(context, MainActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);dialog.dismiss();}});btnRefuse.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});

打开参数提示补全

方法


productFlavors

  • 两种复写方式
   productFlavors {flavor1 {//方式1applicationIdSuffix ".flavor1"//appId=“com.sihaiwanlian.hu.flavor1”
//            versionNameSuffix "_flavor"//versionName="1.0_flavor"}flavor2 {//方式2applicationId "com.sihaiwanlian.flavor2"minSdkVersion 15targetSdkVersion 26versionCode 1versionName "1.0"}}

  • 名字必须和gradle里面一样

  • 包名必须和main里面一样

  • main里面不能和flavor里面出现相同的文件

  • 运行方法

  • 选择之后点击run即可


android studio升级3.0之后出现的问题

 Cannot choose between the following configurations of project :libzxing:- debugApiElements- debugRuntimeElements- releaseApiElements- releaseRuntimeElements

解决方法
这里写链接内容


设置checkBox的颜色和大小

      <CheckBoxandroid:scaleX="1.5"android:scaleY="1.5"android:theme="@style/MyCheckBox"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
    <style name="MyCheckBox" parent="Theme.AppCompat.Light"><item name="colorControlNormal">@color/_333</item><item name="colorControlActivated">@color/barcolor</item></style>

Android设置TextView显示一行或多行
注意TextView中必须加上android:ellipsize和android:maxLines这两条属性,不然的话效果出不来:android:ellipsize="end"android:maxLines="2"

TortoiseSVN没有svn.exe(找不到SVN.exe)

记一下一个大坑
recyclerView的findViewHolderForAdapterPosition为空的问题,如果recyclerView的item不可见的时候调用该方法就为null;又如视频播放横竖屏切换的时候如果回来视频全屏切换回来直接调用也为null


Android报错installation failed with message invalid file
很有可能是你的文件挪动了位置,clean一下或者删除build文件很有可能能解决问题


android webView.loadData 乱码解决

webView.getSettings().setDefaultTextEncodingName("UTF -8");//设置默认为utf-8
webView.loadData(htmlData, "text/html", "UTF -8");//API提供的标准用法,无法解决乱码问题
webView.loadData(htmlData, "text/html; charset=UTF-8", null);//这种写法可以正确解码

xml编写的时候出现不换行的现象解决:

Settings->Editor->CodeStyle->XML->Android
勾选第一个,对AndroidXML文件允许使用自定义格式化

Recylerview的item是 ImageView 和 TextView构成,当数据改变时,我们会调用 notifyDataSetChanged,这个时候列表会刷新,为了使 url 没变的 ImageView 不重新加载(图片会一闪),我们可以用

setHasStableIds(true);

使用这个,相当于给ImageView加了一个tag,tag不变的话,不用重新加载图片。但是加了这句话,会使得 列表的 数据项 重复!! 我们需要在我们的Adapter里面重写 getItemId就好了。

@Override
public long getItemId(int position) {if (mList == null || mList.isEmpty()) {return super.getItemId(position);}return mList.get(position).hashCode();
}

记录Android jetpack MVVM使用DataBinding 表达式多条件判断&&检查验证EditText表单数据

Android 知识点记录相关推荐

  1. Android --- 知识点记录

    1.api与implementation的区别 https://www.jianshu.com/p/8962d6ba936e 2.通知栏提示 app 更新的进度,更新完可以访问授权进行安装.适配 8. ...

  2. Android开发中的一些小知识点记录(101-120)

    编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/118554522 Android开发中的一些小知识点记录(1-20 ...

  3. Android知识点 431 -- recovery 强制执行恢复出厂设置(Rescue Party)

    转载原文:https://www.cnblogs.com/codeking100/p/10339258.html 返回知识列表:Android知识点list 1 Incremented rescue ...

  4. Android知识点大扫描

    Android知识点大扫描 什么是 3G 3G,全称为3rd Generation,中文含义就是指第三代数字通信. 所谓3G,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统. 3G只是 ...

  5. C++部分知识点记录

    文章目录 反问 为什么想要加入国微芯? 自己的优势/岗位匹配度在哪? EDA(电子设计自动化) 前言 <C++ Primer>知识点记录 1.声明一个返回数组指针的函数(P205) 2.头 ...

  6. Android知识点 400 -- /data/tombstones

    原文地址 https://www.cnblogs.com/CoderTian/p/5980426.html 返回知识列表 Android知识点list tombstone一般是由Dalvik错误.状态 ...

  7. javaweb基础知识点记录2

    javaweb基础知识点记录 1.在service方法中,首先获得请求的方法名,然后根据方法名调用对应的doXXXX方法,比如说请求参数为GET,那么就会去调用doGet方法,请求参数为POST,那么 ...

  8. javaweb基础知识点记录1

    javaweb基础知识点记录 1.当我们通过在浏览器的输入栏中直接输入网址的方式访问网页的时候,浏览器采用的就是GET方法向服务器获取资源. 2.我们可以将Servlet看做是嵌套了HTML代码的ja ...

  9. Android知识点汇总以及常见面试题

    Android知识点汇总以及常见面试题 1. 链表和数组的区别 2. List Hash 数组的区别 3. 用过哪些三方SDK 4. Android四大组件 5. 堆和栈的区别 6. Activity ...

最新文章

  1. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
  2. 如何用Swift实现一个好玩的弹性动画
  3. python非贪婪、多行匹配正则表达式例子[转载]
  4. 操作系统原理:中断,异常,系统调用
  5. 详解Attention、Tacotron、WaveNet、LPCNet声码器等前沿方法
  6. Qt5.12编译MySQl5.1.37驱动
  7. linux制作一键恢复,Linux/Centos Mondo 一键部署、镜像恢复,快速部署
  8. Intelij 添加php注释
  9. C语言辅导试题答案,C语言试题含答案).doc
  10. Javascript 构造endwith方法
  11. Redis面试 - 集群模式
  12. 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
  13. IOS9 微信sdk升级指南
  14. LeetCode-删除中间节点
  15. decltype关键字
  16. javascript 分割字符串
  17. 25 个很棒的 Python 脚本合集(迷你项目) - PDF 下载
  18. 建筑智能化资质升级需要的企业工程业绩
  19. FS4066耐高压1到4节内置MOS的锂电池充电管理芯片
  20. 记忆翻牌游戏——react算法学习

热门文章

  1. 什么是互联网+ 与 什么是 +互联网
  2. cmd控制台连接MySQL数据库_如何利用CMD连接本机mysql数据库
  3. 消灭星星类游戏java语言_javascript实现消灭星星小游戏简单版
  4. vue 获取当前日期的第二天
  5. 前端全局变量和局部变量
  6. java 注销后不能后退_注销了,就别再来找我
  7. Yar的RPC的应用-php
  8. cad怎样弄出放线的坐标_CAD如何将坐标做成全站仪数据
  9. 单挂/组队·单/双哈比·法师/狼猎·开源
  10. 计算机丛书之计算机安全全本阅读,电脑办公 Windows 10 Office 2016 从新手到高手...