Android 知识点记录

来源:互联网 发布:淘宝如何找货源 编辑:程序博客网 时间:2024/06/09 19:06

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/Setter15.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 局部变量

android studio FileHeader
/**
* @FileName: PACKAGENAME.{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() 方法。


Linkify.addLinks()

Linkify.addLinks()

我们知道对于 TextView 文本控件中的内容,通过 android:autoLink 属性可以为其添加诸如 web、phone 等固定模版的超链接点击事件。但毕竟系统模版有限,而利用 Linkify.addLinks() 方法可以添加一些应用内自定义模版,比如新浪微博中的 “@XXX” 格式的超链接跳转等,都可以通过自定义正则表达式来匹配处理。


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

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


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

  @Override  public 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启动之后在显示视图之间时间太长导致的。
1、优化方式可以通过精简layout文件、多线程处理数据载入等。
2、但是有些Activity的layout文件可能比较大,如果不能动态载入,在显示之前解析xml的时间可能耗时比较长比如500-1000ms。
这个时候Activity会先显示默认的黑色背景图,所以会出现黑屏的情况。对于这种情况我们可以在Application的Theme中添加

 <item name="android:windowIsTranslucent">true</item> 

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

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


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


xml中抽取style

这里写图片描述


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


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方法。

  @Override    public 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" />

为什么子线程有的时候可以更新ui
这里写图片描述


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

 @Override    public 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的位置,即EditText            int left = location[0], top = location[1], bottom = top + view.getHeight(), right = left + view.getWidth();            //判断我们手指点击的区域是否落在EditText上面,如果不是,则返回true,否则返回false            boolean 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);