美團實習| 週記(五)

本週知識清單以下:ps文末有驚喜連接↓↓↓

  • UI小課堂
    • TextView行間距、字間距
    • EditText有光標不彈出軟鍵盤
    • EditText限定輸入字符的類型、最大數量
    • 指定Dialog寬高
    • 資源文件&系統文件
  • Java基礎之泛型&反射
  • 一點小感悟

1.UI小課堂java

a.TextView行間距、字間距android

  • 設置行間距的兩個屬性:
    • 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限定輸入字符的類型、最大數量bash

  • 限定輸入字符的類型兩種方式
    • 在代碼中設置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寬高less

Dialog有限制的最大寬高,可能會致使在佈局設置的寬高大小失效,這裏提升兩種解決辦法。ide

  • 代碼設置,特別注意如下代碼必定要在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的坑填好,固然這不會是最後一個框架;週記大概不能叫週記了,半月記?月記?可是實習學到的看到的都會在小本本里記好,差很少攢夠了就會發出來。

這陣子事業部陸陸續續了開了三次大型會議 ,讓我更瞭解目前新零售在作什麼、爲何作、要怎麼作,清楚整個新零售事業羣的組織架構以及咱們閃購事業部的產品服務,還有身爲"工程師"而不是"碼農"的咱們要有什麼樣的素質和品質,每次都有格局放大、眼界放寬的成長。

忙碌的工做不時地組團聽個技術分享會、抽個晚上團建海底撈、下午再來個水果和可愛多,偶爾來個小插曲放鬆一下,真的很知足了。

終於等來了美團閃購品牌的發佈會,最後爲我大閃購打個廣告!🔥連接在此:美團閃購:一不當心就把你的生活採購需求都給安排妥了!

美團閃購品牌發佈會
相關文章
相關標籤/搜索