### Component 大小 使用 XML 可以為 Layout 內的 Component 設定高度大小等,用的單位可以自行選擇,只要鍵入在數字後便可以。 ```xml <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center|center" android:text="text" android:textSize="20sp" /> ``` ### 使用 Programming 方法設定 我們也可以使用 Programming 的方法來生成一個 TextView。 ```java // layout params ViewGroup.LayoutParams mLayoutParam = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); // create text view TextView mTextView = new TextView(context); mTextView.setLayoutParams(mLayoutParam); mTextView.setGravity(Gravity.CENTER|Gravity.CENTER); mTextView.setText("text"); mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); ``` 上面的代碼應該也能生成一個和上面 XML 相同的 TextView。我們再修改一下上面的 XML : ```xml <TextView android:layout_width="match_parent" android:layout_height="100dp" android:gravity="center|center" android:text="text" android:textSize="20sp" /> ``` 這樣可以生成一個高度 100dp 的 TextView,於是我們又改一下 Java Program : ```java // layout params ViewGroup.LayoutParams mLayoutParam = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100); // create text view TextView mTextView = new TextView(context); mTextView.setLayoutParams(mLayoutParam); mTextView.setGravity(Gravity.CENTER|Gravity.CENTER); mTextView.setText("text"); mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); ``` 這樣能生成一個 100dp 的 TextView 嗎? 答案是不行的,因為 LayoutParams 沒有像 setTextSize() 一樣能接受一個 Unit (單位) 的值傳入去,所以上面傳入去的 100 只是一個不知道什麽單位的數字,要達到使用 dp 單位的效果,需要加多一點計算才可以啊 ! ### 算出 dp 值 通過下面的方法,我們可以計算出不同單位的數值 : ```java // get resources Resources r = getResources(); // target height in dp int height = 100; // calculate number float heightInDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, r.getDisplayMetrics()); ``` 然後就可以把計算出來的值放入 LayoutParams 內,就可以設定出相應的單位。 ```java // get resources Resources r = getResources(); // target height in dp int height = 100; // calculate number float heightInDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, r.getDisplayMetrics()); // layout params ViewGroup.LayoutParams mLayoutParam = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, heightInDp); // create text view TextView mTextView = new TextView(context); mTextView.setLayoutParams(mLayoutParam); mTextView.setGravity(Gravity.CENTER|Gravity.CENTER); mTextView.setText("text"); mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); ``` ### TypedValue 的種類 TypedValue 有以下的類型 (不同的單位) : |常數|說明| |---| |TypedValue.COMPLEX_UNIT_PX|Pixels| |TypedValue.COMPLEX_UNIT_SP|Scaled Pixels| |TypedValue.COMPLEX_UNIT_DIP|Device Independent Pixels|