使用开发技巧

  • 在parent布局中添加 android:animateLayoutChanges="true" 属性,在子控件显示或者隐藏时会有默认动画(注:必须为ViewGroup的子控件)
    代码中动态添加自定义动画
    linearLayout为 必须为ViewGroup的子控件
linearLayout = (LinearLayout) findViewById(R.id.linearlayout);
mButtonAdd.setOnClickListener(this);
LayoutTransition transition=new LayoutTransition();
transition.getDuration(2000);
transition.setAnimator(LayoutTransition.APPEARING, AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.animator_scale));
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
transition.setAnimator(LayoutTransition.DISAPPEARING, transition.getAnimator(LayoutTransition.DISAPPEARING));
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,transition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));
linearLayout.setLayoutTransition(transition);
  • Service是系统组件,本身没有UI界面,一般是无法直接弹窗的,所以我们打主意的就是系统自带的UI,瞧如下代码:
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, R.style.oaThemeByLgp);
        String[] split = curtailName.split("¥");
        StringBuilder sb=new StringBuilder();
        for (int i = 0; i < split.length; i++) {
            sb.append(split[i]);
            if (i

这一段代码是我内部邮件的开启多线程上传多文件业务,如果其中一个线程文件上传失败,会提醒用户,这个提醒就是系统的Dialog,由用户使用此Dialog决定此封邮件是否有效,如果用户选择无效,则后台不记录相关数据,并记录下上传成功的id,稍后调用后台接口清除这些冗余文件。

  • 如果无法引用本地aar包,爆出错误# Warning:Project app: Only Jar-type local dependencies are supported
    那么就创建个本地仓库并添加依赖
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile(name:'guideview-release', ext:'aar')
//    compile project(':guideview')
}
repositories {
    mavenCentral()
    flatDir{
        dirs 'libs'
    }
}
  • 充分利用命名空间 xmlns:tools="http://schemas.android.com/tools"
    参考文章:https://android.jlelse.eu/android-tools-attributes-listitem-sample-data-rocks-bbf49aaa9f07
    举例TextView与ListView:
  1. TextView中我们开发时想要在 XML 中预览数据可以直接通过tools里面某些方法实现, 但是直接在 XML 中写死有时就会很尴尬,譬如从网络或者数据库获取数据有延迟, 用户就先看到了我们预设的假数据。避免尴尬可以这么干 将 android:text="看不到我,看不到我"替换为 tools:text="老板驾到"
    当然据传这里面的数据也是可以自定义的,就是Android3.0以后的
    image.png

    不过我实验没成功,在输入时引用提示,不知道是编译器原因还是什么,需要了解的可以自行百度。
  2. ListView中有时候需要看到具体布局效果,这就非常尴尬:
    可以使用tools:listitem="@layout/item_grid_bag"类似这些个属性去做预览
    这个是引用前布局:


    image.png

    引用后布局后:


    image.png

    因为我这个列表项布局就是一个框框背景图,所以预览图没毛病,并非效果问题。
  • 屏蔽引用jar包某些内容
    我们知道有时两个jar包会冲突,编译不会通过,但是又无法解压jar包手动删除,这个时候屏蔽就变得尤其重要那么屏蔽方式是怎样的呢,其实很简单在引用时配置一下就好了,如下图,此为屏蔽jar包内含有某包名的类


    QQ图片20180521111722.png
  • ScrollView 属性android:fillViewport="true"
    场景:譬如你在阅读某个协议,等阅读完显示按钮,点击我同意,普通状况不加下是这样的


    Screenshot_2018-06-01-15-05-07-745_com.biabia.clu.png

    加了之后是这样的


    Screenshot_2018-06-01-15-04-44-172_com.biabia.clu.png

    当然如果字数够的话确实能达到我们理想效果,按钮随着文字滑动一直到底部才显示出来
    Screenshot_2018-06-01-15-28-57-746_com.biabia.clu.png

    当然应用场景不会仅局限于这样的,像新闻点赞啥的底部含有按钮的都可以使用此属性
  • onHiddenChanged()方法解决Fragment 切换时数据刷新问题
    场景:当Fragment使用show()与hide()切换时Fragment是不走生命周期的,数据将无法通过生命周期方法进行刷新,这时就可以通过覆写onHiddenChanged()方法去解决,可能此处有人会疑惑,不可见时不是调用onPause么?但是这个指的是Activity,一个Activity里面不管有几个Fragment其初始化后生命周期都跟随Activity动而动,当使用show()与hide()时,其实两个Fragment对于周期来说都是未发生状态改变的,所以无法通过通常想的在onResume里刷新数据,不信可以试试切换打印周期。

  • 在主题中使用windowBackground属性给Activity作为背景可以避免启动时白屏,但是如果背景图过大,会造成UI界面操作卡顿,内存始终忽高忽低,所以在设置完此主题后,在第一个Activity或者BaseActivity onCreate后加上getWindow().setBackgroundDrawableResource(android.R.color.transparent)

    
  • Application的Context在申请SYSTEM_ALERT_WINDOW权限的情况下可以弹起Dialog

使用的系统Window,普通情况下会报错,或者使用

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST)

主要是系统弹窗有级别限制,从普通的App弹窗级别升级为系统弹窗,譬如Toast。

  • AS控制台打印中文乱码
    打开AS安装路径,找到studio64.exe.vmoptions文件在里面添加-Dfile.encoding=UTF-8
各位老铁觉得还实用不妨点个赞吧
待续....

你可能感兴趣的:(使用开发技巧)