Android 开发经验Tips(2)

作者: 燊在锦官城 | 来源:发表于2016-09-02 15:50 被阅读273次

    1. as并不能直接复制so文件到libs下面使用,必须在工程build.gradle添加

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    

    表示我们不编译jni代码,直接从libs里面复制so库。
    另外,发现as运行aar的时候会导致很小的项目也需要编译很久,不知道有什么解决办法。

    2. setTag是android的view类中很有用的一个方法

    public void setTag (int key, Object tag)
    

    可以用它来给空间附加一些信息,在很多场合下都得到妙用。但是这里的key需要保证唯一性
    如果只需要设置一个tag,那么直接调用setTag(Object tag)方法就可以轻松搞定,如果一定需要使用多个tag绑定,那么需要先在res/values/ids.xml中添加一个id

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item type="id" name="phone_pic_info_img"></item> <item type="id" name="tag_second"></item>
    </resources>
    

    3. TextView的文字也可以设置按下效果

    1.新建 color/text_color_selector.xml

        <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:color="@color/white" android:state_pressed="true"></item>
            <item android:color="@color/dail_black" android:state_pressed="false"></item>
        </selector>
    

    2.添加至需要的xml里

    <android:textColor="@color/text_color_selector">
    

    4. 禁止EditText自动获取焦点

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

    设置光标不可见

    cursorVisible
    

    5. UTF-8编码获取字符串长度

    str = str.replaceAll("[^\\x00-\\xff]", "**");
    return str.length();
    

    6. 获取控件宽高建议使用的方法

    • 重写Activity的onWindowFocusChanged方法,在该方法中获取
    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        //此处可以正常获取width、height等  
    } 
    
    • 将一个runnable添加到Layout队列中:View.post()
    view.post(new Runnable() {  
        @Override  
        public void run() {  
            view.getHeight();  
        }  
    });
    

    7. getApplication()和getApplicationContext()

    两个方法得到的context内存地址是相同的, 但是作用域不同。
    getApplication()方法只有在Activity和Service中才能调用的到,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法了。

    8. 处理返回时关闭输入法的同时关闭dialog

    重写EditText的onKeyPreIme方法,并设置回调来更新程序的UI

        @Override
        public boolean onKeyPreIme方法,并设置回调来更新程序的UI(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (listener != null) {
                    listener.back(this);
                }
            }
            return false;
        }
    

    9. Fragment中运行时权限的特殊处理

    • 在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的 onRequestPermissionsResult
    • 如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方 法,onRequestPermissionsResult不会回调回来,建议使用 getParentFragment().requestPermissions方法,这个方法会回调到父Fragment中的onRequestPermissionsResult,加入以下代码可以把回调透传到子Fragment
     @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          List<Fragment> fragments = getChildFragmentManager().getFragments();
          if (fragments != null) {
              for (Fragment fragment : fragments) {
                  if (fragment != null) {
                      fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
                  }
              }
          }
      }
    

    10. BitmapDrawable建议开启的效果

    android:antialias:是否开启图片抗锯齿功能。开启后会让图片变得平滑,同时也会一定程度上降低图片的清晰度,建议开启;
    android:dither:是否开启抖动效果。当图片的像素配置和手机屏幕像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果,建议开启。
    android:filter:是否开启过滤效果。当图片尺寸被拉伸或压缩时,开启过滤效果可以保持较好的显示效果,建议开启;

    11. 优化列表卡顿

    public void onScrollStateChanged(AbsListView absListView, int scrollState)
        {
            switch (scrollState) {
                case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                    // 手指触屏拉动准备滚动,只触发一次
                    mIsViewIdle = false;
                    break;
                case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                    // 持续滚动开始,只触发一次
                    mIsViewIdle = false;
                    break;
                case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                    // 整个滚动事件结束,只触发一次,在此刷新列表
                    mIsViewIdle = true;
                    mAdapter.notifyDataSetChanged();
                    break;
                default:
                    break;
            }
        }
    

    然后在getView()方法中,仅当列表静止(mIsViewIdle = true;)时加载图片

    12. 代码中动态添加radiobutton的间隔设置

    设置间隔需要把setLayoutParams()放到addView之后,才有效果

    RadioGroup.LayoutParams bt_params = new RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.dp2px(50,this));
    bt_params.setMargins(0,ScreenUtil.dp2px(10,this),0,0);
    radioGroup.addView(radioButton);
    radioButton.setLayoutParams(bt_params);
    

    参考:

    http://mouxuejie.com/blog/2016-08-20/AndroidShareGroup-weekly-03/
    http://www.jianshu.com/p/94e0f9ab3f1d
    http://www.w2bc.com/article/android-6-0-runtime-permission
    《android 开发艺术探索》——任玉刚

    其他相关文章

    Android 开发经验Tips(1) http://www.jianshu.com/p/c2c8ccd53636

    相关文章

      网友评论

        本文标题:Android 开发经验Tips(2)

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