Android 知识点记录

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 局部变量
22,ctrl+h 查看类的继承关系

android studio FileHeader
/**
* @FileName: P A C K A G E N A M E . {NAME}.java
* @author: villa_mou
* @date: Y E A R {MONTH}- D A Y {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,来节省内存,提高性能。

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

  @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);

在xml中给recyclerView配置manager

 <android.support.v7.widget.RecyclerView
            android: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算出高度,经测试,这样是最可靠的,代码地址http://blog.csdn.net/jys1115/article/details/43525979“>这里写链接内容


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


自定义控件中测量文字的高度
这里写图片描述

1
        Paint.FontMetrics fm = mTextPaint.getFontMetrics();
        int mTxtHeight = (int) Math.ceil(fm.leading- fm.ascent);
 2
   val 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() {
                    @Override
                    public 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() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                    }
                });

打开参数提示补全
这里写图片描述
方法
这里写图片描述


productFlavors

  • 两种复写方式
   productFlavors {
        flavor1 {
            //方式1
            applicationIdSuffix ".flavor1"//appId=“com.sihaiwanlian.hu.flavor1”
//            versionNameSuffix "_flavor"//versionName="1.0_flavor"
        }

        flavor2 {
            //方式2
            applicationId "com.sihaiwanlian.flavor2"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "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的颜色和大小

      <CheckBox
                android: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这两条属性,不然的话效果出不来:


TortoiseSVN没有svn.exe(找不到SVN.exe)
这里写图片描述

猜你喜欢

转载自blog.csdn.net/villa_mou/article/details/77648769