本周知識清單如下:ps文末有驚喜鏈接↓↓↓
- UI小課堂
- TextView行間距、字間距
- EditText有光標不彈出軟鍵盤
- EditText限定輸入字符的類型誊册、最大數(shù)量
- 指定Dialog寬高
- 資源文件&系統(tǒng)文件
- Java基礎之泛型&反射
- 一點小感悟
1.UI小課堂
a.TextView行間距、字間距
- 設置行間距的兩個屬性:
-
android:lineSpacingExtra
:設置行間距盒使,如10dp趾访。值為正數(shù)表示增加行間距留储,為負數(shù)表示減少行間距,為0則沒有變化 -
android:lineSpacingMultiplier
設置行間距的倍數(shù)咙轩,如1.5获讳。值大于1.0表示增加行間距,小于1.0表示減少行間距
-
- 設置字間距的屬性:
android:textScaleX
活喊,水平方向放大丐膝,相當于把文字拉長;可以通過加空格的方式增加字間距
b.EditText有光標不彈出軟鍵盤
網(wǎng)上很多方法都不好使钾菊,親測以下方法有用帅矗,不僅有光標閃爍還不會彈出軟鍵盤。
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限定輸入字符的類型煞烫、最大數(shù)量
- 限定輸入字符的類型兩種方式
- 在代碼中設置
EditText.setInputType()
- 在布局中設置
android:inputType
- 在代碼中設置
//例如损晤,限定只能輸入數(shù)字
mEditText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
//或者,在布局文件添加屬性
android:inputType="number"
關(guān)于輸入類型可見文章:EditText輸入類型InputType值
- 限定輸入字符的最大數(shù)量兩種方式
- 在代碼中設置
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>
//創(chuàng)建dialog時用有style參數(shù)的構(gòu)造函數(shù)
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.CustomDialog);
e.資源文件&系統(tǒng)文件
引用資源文件&系統(tǒng)文件有兩種方式暖哨,一種是在布局文件:
① @type/name
:表示引用自定義的資源
//引用strings資源文件里名為content對應的語句
android:text="@string/content"
② @android:type/name
:表示引用系統(tǒng)的public資源
//引用系統(tǒng)資源文件里的顏色black
android:textColor="@android:color/black"
③ @*android:type/name
:表示引用系統(tǒng)的所有資源
④ ?
:表示引用主題屬性
//引用當前主題資源中名為borderlessButtonStyle的屬性值
style="?android:attr/borderlessButtonStyle"
⑤ @+
:表示創(chuàng)建或引用資源凰狞。如果資源不存在表示創(chuàng)建篇裁、如果已存在表示引用。
-
@+id/資源ID名
:新建一個資源ID -
@id/資源ID名
:引用已定義的資源ID赡若,包括系統(tǒng)ID -
@android:id/資源ID名
:引用系統(tǒng)ID达布,等效于@id/資源ID名
另一種是在代碼中,通過Context.getResources().getXXX(資源ID)
獲取相應的資源逾冬,并將它作為參數(shù)傳入相應的setXXX()
方法中從而設置控件的屬性黍聂。
//設置字體顏色
mTextView.setTextColor(getResources().getColor(R.color.colorPrimary));
//如果R.color.colorPrimary對應顏色是#FF0000,那么等效寫法為
mTextView.setTextColor(Color.parseColor("#FF0000"));
2.Java基礎之泛型&反射
a.泛型
- 含義:是JDK1.5的新特性,本質(zhì)是參數(shù)化類型,即所操作的數(shù)據(jù)類型被指定為一個參數(shù)服鹅,使用時通過傳參來指定具體的類型。
- 好處:安全簡單例驹。具體體現(xiàn)在提供編譯時的強類型檢查,而不用等到運行;可避免類類型強制轉(zhuǎn)換;增強代碼可讀性牛隅。
//不使用泛型需要強制轉(zhuǎn)換
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0)
//使用泛型可避免強制轉(zhuǎn)換
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
以上例子也能看到在集合類使用泛型的情況很普遍炕柔,而且相比于數(shù)組具有動態(tài)的特點。
-
類型:通過創(chuàng)建位置的不同倔叼,分可為
-
泛型類:
public class 類名<泛型類型1,…>
-
泛型方法:
public <泛型類型1,…> 返回類型 方法名(泛型類型1 參數(shù)名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
關(guān)鍵字宫莱,限定的是形式參數(shù)
如
public class ObjectTool<T extends Number>
表示只接受Number類或其子類的參數(shù)
-
通配符
?
的邊界限定:并配合extends
和super
關(guān)鍵字丈攒,限定的是實際參數(shù)-
未受限
List<?>
:等效于List<? extends Object>
-
上邊界限定
List<? extends Number>
:表示不確定參數(shù)類型,但一定是Number類或其子類的類型 -
下邊界限定
List<? super Number>
:表示不確定參數(shù)類型授霸,但一定是Number類或其父類的類型
-
未受限
如
List<? extends Number> list =new ArrayList<Integer>();
表示創(chuàng)建元素對象都是Integer的List
- 泛型擦除:清除泛型類型參數(shù)的相關(guān)信息巡验,并且在必要的時候添加類型檢查和類型轉(zhuǎn)換的方法。即泛型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
}
//不能對參數(shù)化類型使用Casts碘耳,除非是無界通配符類型
List<Integer> li = new ArrayList<>();
List<?> list = li; // ok
List<Number> ln = (List<Number>) li; // error
//不能對參數(shù)化類型使用instanceof显设,除非是無界通配符類型
public static <E> void rtti(List<E> list) {
if (list instanceof ArrayList<Integer>) { // error
}
if (list instanceof ArrayList<?>) { // OK
}
}
//不能創(chuàng)建參數(shù)化類型的數(shù)組
ArrayList<String>[] arrayOfList = new ArrayList<String>[3]; // error
//不能創(chuàng)建、捕捉或拋出參數(shù)化類型的對象
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
}
}
//不能重載參數(shù)類型為相同原始類型的方法,因為擦除后是一樣的
public class Example { // error
public void print(List<String> list) {}
public void print(List<Integer> list) {}
}
b.反射
- 含義:在運行狀態(tài)中辛辨,對于任意一個類都能知道它的所有屬性和方法捕捂,對于任何一個對象都能夠調(diào)用它的任何一個方法和屬性。
-
功能:動態(tài)性
- 在運行時判斷任意一個類所具有的屬性和方法
- 在運行時判斷任意一個對象所屬的類
- 在運行時構(gòu)造任意一個類的對象
- 在運行時調(diào)用任意一個對象的方法
- 生成動態(tài)代理
-
java.lang.Class
:實現(xiàn)反射的基礎-
原因
- JVM每創(chuàng)建一個類都會產(chǎn)生一個對應
Class
對象斗搞,并把它保存在同名.class
文件指攒。有關(guān)類加載機制 - Java反射包
java.lang.reflect
中的所有類都沒有public
構(gòu)造方法,只能通過Class類獲得這些類的實例
- JVM每創(chuàng)建一個類都會產(chǎn)生一個對應
-
獲取Class對象的方法
-
.class
:通過類的類型僻焚,基本類型可以使用 -
Object.getClass()
:通過對象實例允悦,注意基本數(shù)據(jù)類型無法使用 -
Class.forName()
:通過類的全限定名,注意基本數(shù)據(jù)類型無法使用
-
-
原因
Class c1 = Test.class;
Class c2 = test.getClass();// test是Test類的一個對象
Class c3 = Class.forName("com.catchu.me.reflect.Test");
更多獲取方法見Java反射
-
java.lang.reflect.Member
:反射操作的對象虑啤。提供三個實現(xiàn)類可在運行時改變對象狀態(tài):-
Constructor
:對應類成員中的構(gòu)造函數(shù) -
Field
:對應類成員中的變量 -
Method
:對應類成員中的方法
-
在Class提供多種方法可以獲取給定類的Constructor隙弛、Field和Method,方法如下圖:
應用:Java反射完全解析
3.一點小感悟
也是前幾天發(fā)現(xiàn)秋招號角已經(jīng)吹響許久了狞山,然而新一期開發(fā)排期比較緊全闷,產(chǎn)品迭代也很快,這次還要獨立開發(fā)和維護新增的一整塊功能萍启,加上實習以來沒睡過一天懶覺室埋,周末不是約玩就是去公司,身體也開始抗議伊约,突然有些焦灼和緊張姚淆。
所以寫文的進度也只好放慢下來,暫時完結(jié)《深入理解Java虛擬機》的讀書筆記板塊屡律,也差不多把想看的章節(jié)整理完畢腌逢,后續(xù)閑時再把余下的補全;目前計劃就是把之前Retrofit的坑填好超埋,當然這不會是最后一個框架搏讶;周記大概不能叫周記了佳鳖,半月記?月記媒惕?但是實習學到的看到的都會在小本本里記好系吩,差不多攢夠了就會發(fā)出來。
這陣子事業(yè)部陸陸續(xù)續(xù)了開了三次大型會議 妒蔚,讓我更了解目前新零售在做什么穿挨、為什么做、要怎么做肴盏,清楚整個新零售事業(yè)群的組織架構(gòu)以及我們閃購事業(yè)部的產(chǎn)品服務科盛,還有身為"工程師"而不是"碼農(nóng)"的我們要有什么樣的素質(zhì)和品質(zhì),每次都有格局放大菜皂、眼界放寬的成長贞绵。
忙碌的工作不時地組團聽個技術(shù)分享會、抽個晚上團建海底撈恍飘、下午再來個水果和可愛多榨崩,偶爾來個小插曲放松一下,真的很滿足了章母。
終于等來了美團閃購品牌的發(fā)布會母蛛,最后為我大閃購打個廣告!??鏈接在此:美團閃購:一不小心就把你的生活采購需求都給安排妥了胳施!
為期兩個月的短暫的美團實習隨著秋招的開始也就告一段落了溯祸,最后對這段日子進行了小總結(jié),詳見2019Android秋招提前批面試總結(jié)