程序猿阵线联盟-汇总各类技术干货Android开发Android技术知识

实习随笔| 周记(五)

2018-07-27  本文已影响60人  厘米姑娘

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


1.UI小课堂

a.TextView行间距、字间距

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限定输入字符的类型、最大数量

//例如,限定只能输入数字
mEditText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
//或者,在布局文件添加属性
android:inputType="number"

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

//比如,允许输入的最大字符量为11,等效于android:maxLength="10"
mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)});

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

d.指定Dialog宽高

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

WindowManager.LayoutParams params = mDialog.getWindow().getAttributes();
params.width = 840;//单位为px
mDialog.getWindow().setAttributes(params);

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

//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"

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

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

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

2.Java基础之泛型&反射

a.泛型

//不使用泛型需要强制转换
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 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当前时间
    }    
}

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

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

//擦除前
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.反射

Class c1 = Test.class; 
Class c2 = test.getClass();// test是Test类的一个对象
Class c3 = Class.forName("com.catchu.me.reflect.Test"); 

更多获取方法见Java反射

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

应用Java反射完全解析


3.一点小感悟

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

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

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

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

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

美团闪购品牌发布会
上一篇下一篇

猜你喜欢

热点阅读