实习随笔| 周记(五)

作者: 厘米姑娘 | 来源:发表于2018-07-27 16:45 被阅读60次

    本周知识清单如下:ps文末有惊喜链接↓↓↓

    • UI小课堂
      • TextView行间距、字间距
      • EditText有光标不弹出软键盘
      • EditText限定输入字符的类型、最大数量
      • 指定Dialog宽高
      • 资源文件&系统文件
    • Java基础之泛型&反射
    • 一点小感悟

    1.UI小课堂

    a.TextView行间距、字间距

    • 设置行间距的两个属性:
      • android:lineSpacingExtra:设置行间距,如10dp。值为正数表示增加行间距,为负数表示减少行间距,为0则没有变化
      • android:lineSpacingMultiplier设置行间距的倍数,如1.5。值大于1.0表示增加行间距,小于1.0表示减少行间距
    • 设置字间距的属性:android:textScaleX,水平方向放大,相当于把文字拉长;可以通过加空格的方式增加字间距

    b.EditText有光标不弹出软键盘

    网上很多方法都不好使,亲测以下方法有用,不仅有光标闪烁还不会弹出软键盘。

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
            try {
                Class<EditText> cls = EditText.class;
                Method setSoftInputShownOnFocus;
                setSoftInputShownOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
                setSoftInputShownOnFocus.setAccessible(true);
                setSoftInputShownOnFocus.invoke(mEditText, false);
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    c.EditText限定输入字符的类型、最大数量

    • 限定输入字符的类型两种方式
      • 在代码中设置EditText.setInputType()
      • 在布局中设置android:inputType
    //例如,限定只能输入数字
    mEditText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
    //或者,在布局文件添加属性
    android:inputType="number"
    

    关于输入类型可见文章:EditText输入类型InputType值

    • 限定输入字符的最大数量两种方式
      • 在代码中设置EditText.setFilters()
      • 在布局中设置android:maxLength
    //比如,允许输入的最大字符量为11,等效于android:maxLength="10"
    mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)});
    

    更多属性可见EditText属性大全详解

    d.指定Dialog宽高

    Dialog有限制的最大宽高,可能会导致在布局设置的宽高大小失效,这里提高两种解决办法。

    • 代码设置,特别注意以下代码一定要在Dialog.show()之后
    WindowManager.LayoutParams params = mDialog.getWindow().getAttributes();
    params.width = 840;//单位为px
    mDialog.getWindow().setAttributes(params);
    

    推荐阅读源码分析Dialog自定义大小无效

    • style文件设置
    //R.style.CustomDialog
    <style name="CustomDialog" parent="Theme.AppCompat.Dialog">
         <!-- dialog  宽度与屏幕比例-->
         <item name="android:windowMinWidthMinor">80%</item>
         <!-- dialog 背景颜色,默认是白色-->
         <item name="android:colorBackground">@android:color/transparent</item>
    </style>
    
    //创建dialog时用有style参数的构造函数
    AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.CustomDialog);
    

    e.资源文件&系统文件

    引用资源文件&系统文件有两种方式,一种是在布局文件:

    @type/name:表示引用自定义的资源

    //引用strings资源文件里名为content对应的语句
    android:text="@string/content"
    

    @android:type/name:表示引用系统的public资源

    //引用系统资源文件里的颜色black
    android:textColor="@android:color/black"
    

    @*android:type/name:表示引用系统的所有资源

    :表示引用主题属性

    //引用当前主题资源中名为borderlessButtonStyle的属性值
    style="?android:attr/borderlessButtonStyle"
    

    @+:表示创建或引用资源。如果资源不存在表示创建、如果已存在表示引用。

    • @+id/资源ID名:新建一个资源ID
    • @id/资源ID名:引用已定义的资源ID,包括系统ID
    • @android:id/资源ID名:引用系统ID,等效于@id/资源ID名

    另一种是在代码中,通过Context.getResources().getXXX(资源ID)获取相应的资源,并将它作为参数传入相应的setXXX()方法中从而设置控件的属性。

    //设置字体颜色
    mTextView.setTextColor(getResources().getColor(R.color.colorPrimary));
    //如果R.color.colorPrimary对应颜色是#FF0000,那么等效写法为
    mTextView.setTextColor(Color.parseColor("#FF0000"));
    

    2.Java基础之泛型&反射

    a.泛型

    • 含义:是JDK1.5的新特性,本质是参数化类型,即所操作的数据类型被指定为一个参数,使用时通过传参来指定具体的类型。
    • 好处安全简单。具体体现在提供编译时的强类型检查,而不用等到运行;可避免类类型强制转换;增强代码可读性。
    //不使用泛型需要强制转换
    List list = new ArrayList();
    list.add("hello");
    String s = (String) list.get(0)
    //使用泛型可避免强制转换
    List<String> list = new ArrayList<String>();
    list.add("hello");
    String s = list.get(0);
    

    以上例子也能看到在集合类使用泛型的情况很普遍,而且相比于数组具有动态的特点。

    • 类型:通过创建位置的不同,分可为
      • 泛型类public class 类名<泛型类型1,…>
      • 泛型方法public <泛型类型1,…> 返回类型 方法名(泛型类型1 参数名1,…)
      • 泛型接口public interface 接口名<泛型类型1,…>

    下面分别举例说明。

    //泛型类:把泛型定义在类上 
    public class ObjectTool<T> { 
          private T obj; 
          public T getObj() { 
             return obj; 
          } 
          public void setObj(T obj) { 
               this.obj = obj;
         }
    }
    //测试
    public class ObjectToolDemo { 
        public static void main(String[] args) { 
            ObjectTool<String> ot1 = new ObjectTool<String>();    
            ot1.setObj(new String("minmin")); 
            System.out.println("姓名是:" + ot1.getObj()); //姓名是:minmin
            ObjectTool<Integer> ot2 = new ObjectTool<Integer>();    
            ot2.setObj(new Integer(21)); 
            System.out.println("年龄是:" + ot2.getObj()); //年龄是:21
       }
    }
    
    //泛型方法:把泛型定义在方法上
    public class ObjectTool {  
          public <T> T show(T t) {
              if (t != null){
                  return t;
              }else{
                  return null;
              }
    }
    //测试
    public class ObjectToolDemo { 
            public static void main(String[] args) { 
                ObjectTool ot = new ObjectTool(); 
                System.out.println(ot.show("minmin"));//minmin
                System.out.println(ot.show(21));//21
           }
      }
    
    //泛型接口:把泛型定义在接口上
    public interface ObjectTool<T,U> {
        void show(T t,U u);
    }
    class ObjectToolTest implements ObjectTool<String,Date> {
        @Override  
        public void show(String str,Date date) {
            System.out.print(str);
            System.out.print(date);
        }
    }
    //测试
    public class ObjectToolDemo {
        public static void main(String[] args) {  
            ObjectToolTest test = new ObjectToolTest();
            test.show("Hello",new Date());//Hello当前时间
        }    
    }
    
    • 泛型变量的类型限定:使用extends关键字,限定的是形式参数

    public class ObjectTool<T extends Number>表示只接受Number类或其子类的参数

    • 通配符?的边界限定:并配合extendssuper关键字,限定的是实际参数
      • 未受限List<?> :等效于List<? extends Object>
      • 上边界限定List<? extends Number> :表示不确定参数类型,但一定是Number类或其子类的类型
      • 下边界限定List<? super Number> :表示不确定参数类型,但一定是Number类或其父类的类型

    List<? extends Number> list =new ArrayList<Integer>();表示创建元素对象都是Integer的List

    • 泛型擦除:清除泛型类型参数的相关信息,并且在必要的时候添加类型检查和类型转换的方法。即泛型java代码->普通java代码
    //擦除前
    class Pair<T> {
        private T value;
        public T getValue() {
            return value;
        }
        public void setValue(T  value) {
            this.value = value;
        }
    }
    //擦除后
    class Pair {
        private Object value;
        public Object getValue() {
            return value;
        }
        public void setValue(Object  value) {
            this.value = value;
        }
    }
    
    • 使用限制
    //不能用基本类型实例化泛型
    Pair<int, char> p = new Pair<>(8, 'a');  // error
    Pair<Integer, Character> p = new Pair<>(8, 'a'); // ok
    
    //不能用static修饰泛型类型
    public class MobileDevice<T> {
        private static T os; // error
    }
    
    //不能对参数化类型使用Casts,除非是无界通配符类型
    List<Integer> li = new ArrayList<>();
    List<?> list = li; // ok
    List<Number> ln = (List<Number>) li; // error
    
    //不能对参数化类型使用instanceof,除非是无界通配符类型
    public static <E> void rtti(List<E> list) {
        if (list instanceof ArrayList<Integer>) {  // error
        }
        if (list instanceof ArrayList<?>) {  // OK
        }
    }
    
    //不能创建参数化类型的数组
    ArrayList<String>[] arrayOfList = new ArrayList<String>[3]; // error
    
    //不能创建、捕捉或抛出参数化类型的对象
    class MathException<T> extends Exception {}    // error
    class QueueFullException<T> extends Throwable {} // error
    
    public static <T extends Exception, J> void execute(List<J> jobs) {
        try {
        } catch (T e) {   // error
        }
    }
    
    //不能重载参数类型为相同原始类型的方法,因为擦除后是一样的
    public class Example { // error
        public void print(List<String> list) {}
        public void print(List<Integer> list) {}
    }
    

    b.反射

    • 含义:在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任何一个对象都能够调用它的任何一个方法和属性。
    • 功能:动态性
      • 在运行时判断任意一个类所具有的属性和方法
      • 在运行时判断任意一个对象所属的类
      • 在运行时构造任意一个类的对象
      • 在运行时调用任意一个对象的方法
      • 生成动态代理
    • java.lang.Class:实现反射的基础
      • 原因
        • JVM每创建一个类都会产生一个对应Class对象,并把它保存在同名.class文件。有关类加载机制
        • Java反射包java.lang.reflect中的所有类都没有public构造方法,只能通过Class类获得这些类的实例
      • 获取Class对象的方法
        • .class:通过类的类型,基本类型可以使用
        • Object.getClass():通过对象实例,注意基本数据类型无法使用
        • Class.forName():通过类的全限定名,注意基本数据类型无法使用
    Class c1 = Test.class; 
    Class c2 = test.getClass();// test是Test类的一个对象
    Class c3 = Class.forName("com.catchu.me.reflect.Test"); 
    

    更多获取方法见Java反射

    • java.lang.reflect.Member:反射操作的对象。提供三个实现类可在运行时改变对象状态:
      • Constructor :对应类成员中的构造函数
      • Field :对应类成员中的变量
      • Method :对应类成员中的方法

    在Class提供多种方法可以获取给定类的Constructor、Field和Method,方法如下图:

    应用Java反射完全解析


    3.一点小感悟

    也是前几天发现秋招号角已经吹响许久了,然而新一期开发排期比较紧,产品迭代也很快,这次还要独立开发和维护新增的一整块功能,加上实习以来没睡过一天懒觉,周末不是约玩就是去公司,身体也开始抗议,突然有些焦灼和紧张。

    所以写文的进度也只好放慢下来,暂时完结《深入理解Java虚拟机》的读书笔记板块,也差不多把想看的章节整理完毕,后续闲时再把余下的补全;目前计划就是把之前Retrofit的坑填好,当然这不会是最后一个框架;周记大概不能叫周记了,半月记?月记?但是实习学到的看到的都会在小本本里记好,差不多攒够了就会发出来。

    这阵子事业部陆陆续续了开了三次大型会议 ,让我更了解目前新零售在做什么、为什么做、要怎么做,清楚整个新零售事业群的组织架构以及我们闪购事业部的产品服务,还有身为"工程师"而不是"码农"的我们要有什么样的素质和品质,每次都有格局放大、眼界放宽的成长。

    忙碌的工作不时地组团听个技术分享会、抽个晚上团建海底捞、下午再来个水果和可爱多,偶尔来个小插曲放松一下,真的很满足了。

    终于等来了美团闪购品牌的发布会,最后为我大闪购打个广告!🔥链接在此:美团闪购:一不小心就把你的生活采购需求都给安排妥了!

    美团闪购品牌发布会

    相关文章

      网友评论

      • e71f590b60c5:向小姐姐学习
        e71f590b60c5:@minmin_1123 小姐姐可以留个联系方式吗,有技术问题时可以向你请教下
        厘米姑娘:@夜听海雨 🙈
      • fd9c0d3d2e55:感觉我的以前都白过了,,,这辈子都没机会了,,,:sob:
        厘米姑娘:@杰威牧歌 🙊不不不,相信自己
      • c6d985a55941:看完了小姐姐的实习经历,再对比自己的,收获很多,很感谢小姐姐的分享,总结的技术部分和一些感悟都好棒,向你认真学习
        厘米姑娘:@隐藏于灯火下的萤火虫 😄哇谢谢你呀~我会努力的,一起加油
      • Alone_vv:看你的周记,收获良多,感谢。
        厘米姑娘:@Alone_b3be (•ө•)♡一起加油
        Alone_vv:@minmin_1123 哈哈,加油,期待你以后的文章:grin:
        厘米姑娘::stuck_out_tongue_closed_eyes: 哈哈就是随便记记,没啥体系,如果能帮到你那真的很开心辣
      • iLovT:期待着你的学习笔记,学的特别通俗易懂,一起努力!
        厘米姑娘:@iLovT 🙈哇感谢支持~一起加油
      • 贼厉害:首赞
        厘米姑娘:@贼厉害 贼强!

      本文标题:实习随笔| 周记(五)

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