美文网首页
Android Tips(6)

Android Tips(6)

作者: 燊在锦官城 | 来源:发表于2018-09-06 16:22 被阅读26次

    1. 在引用的module中使用aar

    导入test.aar包需要在引用module的build.gradle中加入:

    repositories{
        flatDir{
            dirs 'libs'
        }
    }
    
    dependencies {
        compile(name:'test', ext:'aar')
    }
    

    还需在主工程的build.gradle中加入:

    //使用aar必须要在module里说明
    repositories {
        flatDir {
            dirs project(':moduleName').file('libs')
        }
    }
    

    moduleName为引用module的名称
    否则会报出Error:Failed to resolve: 的错误。

    2. 把数值换算成角度

    使用Math.cos或者Math.sin等函数时,入参的角度Angle应该做换算(/ 180 * Math.PI)

    Math.cos(Angle / 180 * Math.PI)
    

    3. 点击ViewGroup时其子控件也变成pressed状态

    让某个view自己能处理touch事件,也即设置clickable、longClickable为true;

    4. 设置编辑框弹出输入法的一种办法

    private EditText searchEdit;
    searchEdit.setCursorVisible(false);
    searchEdit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if(hasFocus){               
                        searchEdit.setCursorVisible(true);//点击后显示光标,弹出输入法
                    }
                }
            });
    

    在他的父级设置

    android:focusableInTouchMode="true"
            android:focusable="true"
    

    5. 编辑框切换设置不可编辑和可编辑

        /**
         * 设置编辑框不可编辑
         * @param editText
         */
        public static void setEditTextNotEdit(EditText editText){
            editText.setCursorVisible(false);
            editText.setFocusable(false);
            editText.setFocusableInTouchMode(false);
        }
    
        /**
         * 编辑框获取焦点
         * @param editText
         */
        public static void getEditFocus(EditText editText) {
            editText.setFocusable(true);
            editText.setFocusableInTouchMode(true);
            editText.setCursorVisible(true);
            editText.requestFocus();
            editText.requestFocusFromTouch();
            editText.setSelection(editText.getText().toString().length());
        }
    

    6. 切换设置图片变灰和正常色彩

        /**
         * 设置图片灰度
         * @param imageView
         * @param isNeedGray true:变灰 false:变回正常
         */
        public static void setImageSaturation(ImageView imageView, boolean isNeedGray) {
            ColorMatrix matrix = new ColorMatrix();
            // //饱和度 0灰度
            if (isNeedGray){
                matrix.setSaturation(0);
                ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
                imageView.setColorFilter(filter);
            }else{
                imageView.setColorFilter(null);
            }
        }
    
    

    7. 不同方式切换Fragment时,生命周期的回调的区别

    • add hide show 方式来切换Fragment
    载入Fragment1 
    Fragment1 onCreate 
    Fragment1 onCreateView 
    Fragment1 onStart 
    Fragment1 onResume 
    切换Fragment2: 
    (Fragment1不走任何生命周期,但会调onHiddenChanged方法) 
    Fragment2 onCreate 
    Fragment2 onCreateView 
    Fragment2 onStart 
    Fragment2 onResume 
    回到Fragment1: 
    (Fragment2不走任何生命周期,但会调onHiddenChanged方法) 
    
    • 通过replace 方式来切换Fragment
    载入Fragment1生命周期与上面相同: 
    Fragment1 onCreate 
    Fragment1 onCreateView 
    Fragment1 onStart 
    Fragment1 onResume 
    切到Fragment2: 
    这次的Fragment1走生命周期了 
    Fragment1 onPause 
    Fragment1 onStop 
    Fragment1 onDestoryView 
    Fragment1 onDestory 
    Fragment2 onCreate 
    Fragment2 onCreateView 
    Fragment2 onStart 
    Fragment2 onResume 
    真实打印出来Fragment1走了onDestory,被完全回收了! 
    再切回到Fragment1 
    Fragment1 onCreate 
    Fragment1 onCreateView 
    Fragment1 onStart 
    Fragment1 onResume 
    Fragment2 onPause 
    Fragment2 onStop 
    Fragment2 onDestoryView 
    Fragment2 onDestory 
    Fragment1因为已经被回收,又走onCreate,Fragment2被回收。 
    
    • 通过ViewPager 方式来切换Fragment
    初始化时的生命周期: 
    D/FragmentA: onCreate 
    D/FragmentA: onCreateView 
    D/FragmentB: onCreate 
    D/FragmentB: onCreateView 
    D/FragmentC: onCreate 
    D/FragmentC: onCreateView 
    切换到FragmentB: 
    (不走任何生命周期,只会调用setUserVisibleHint方法) 
    D/FragmentB: setUserVisibleHint 
    切换到FragmentC: 
    (不走任何生命周期,只会调用setUserVisibleHint方法) 
    D/FragmentC: setUserVisibleHint 
    

    8. getActivity().isFinishing()的作用

    用户打开activity时,当有线程回调未执行,用户点击了返回,会导致上下文空指针,此时应该增加防御 if(!getActivity().isFinishing())

    9 . 获取LinearLayout的宽度和高度

    在调用这两个方法之前,必须调用View.measure方法先测量组件宽度和高度

    linearlayout.measure(0,0);  
    //获取组件宽度  
    int width = linearlayout.getMeasuredWidth();  
    //获取组件高度  
    int height = linearlayout.getMeasuredHeight();  
    

    10. NestedScrollView嵌套常见问题

    嵌套滑动不激活。

    mRecycleView.setNestedScrollingEnable(false);
    

    11. AppCompat 主题中 Button 的默认 style 导致的图片变形问题

    默认 style 是"Base.Widget.AppCompat.Button"有最小宽高,具体属性参数如下:

     <style name="Base.Widget.AppCompat.Button" parent="android:Widget">
            <item name="android:background">@drawable/abc_btn_default_mtrl_shape</item>
            <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
            <item name="android:minHeight">48dip</item>
            <item name="android:minWidth">88dip</item>
            <item name="android:focusable">true</item>
            <item name="android:clickable">true</item>
            <item name="android:gravity">center_vertical|center_horizontal</item>
     </style>
    

    解决方案

     <style name="MyButton_Style" parent="Base.Widget.AppCompat.Button">
            <item name="android:minHeight">0dip</item>
            <item name="android:minWidth">0dip</item>
        </style>
    

    在values/styles.xml文件的AppTheme style节点中添加如下代码:

    <item name="android:buttonStyle">@style/MyButton_Style</item>
    

    12. Android v26版本AppBarLayout和v25的区别

    • v25: AppBarLayout、CollapsingToolbarLayout和RecyclerView共存时,无法通过fling快速展开AppBarLayout. 但是没有回弹现象
    • v26: 解决v25的问题,但是AppBarLayout会出现回弹(bounce)的现象

    参考

    相关文章

      网友评论

          本文标题:Android Tips(6)

          本文链接:https://www.haomeiwen.com/subject/zfbxgftx.html