Android编程权威指南 - 第8章 使用布局与组件创建用户界
2016-11-22 本文已影响61人
JMasche
新界面代码
更新fragment_crime.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/crime_title_label"
style="?android:listSeparatorTextViewStyle"
/>
<EditText
android:id="@+id/crime_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:hint="@string/crime_title_hint" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_details_label"
style="?android:listSeparatorTextViewStyle"
/>
<Button
android:id="@+id/crime_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" />
<CheckBox
android:id="@+id/crime_solved"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="@string/crime_solved_label"/>
</LinearLayout>
- 增加一个TextView组件,用了一个新的标签style
- 增加了一个Button组件,用了两个新的标签android:marginLeft和android:marginRight
- 增加一个新的组件CheckBox
更新CrimeFragment.java
- 新增Button支撑代码,主要是设置Button的text内容
mDateButton = (Button)v.findViewById(R.id.crime_date);
mDateButton.setText(mCrime.getDate().toString());
mDateButton.setEnabled(false);
- 新增CheckBox支撑代码。
CheckBox组件的监听事件是setOnCheckedChangeListener,复写onCheckedChanged方法。
CompoundButton是android.widget.CompoundButton。
mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mCrime.setSolved(isChecked);
}
});
深入探讨XML布局属性
样式、主题及主题属性
-
样式是XML资源文件,含有用来描述组件行为和外观的属性定义。
如下面的例子
<style name="BigTextStyle">
<item name="android:textSize">20sp</item>
<item name="android:layout_margin">3dp</item>
</style>
- 可以创建自己的样式文件,并保存在res/values/目录下,然后在布局文件中以@style/my_own_style(样式文件名)的形式引用
- 在上面fragment_crime.xml布局文件的例子中,TextView标签的style属性,引用了Android平台自带的主题。
dp、sp以及屏幕像素密度
-
视图属性指定大小尺寸值:
- text size文字大小:指设备上显示的文字像素高度
- margin边距:指定视图组件间的距离
- padding内边距:指定视图外边框与其内容间的距离
-
Android提供了密度无关的尺寸单位,这种单位可以在不同屏幕密度的设备上获得同样大小的尺寸。
-
dp
density- independent pixel,意为密度无关的像素。使用dp的好处是,无论屏幕密度如何,总能获得相同尺寸。在 设置边距、内边距或任何不打算按像素值指定尺寸的情况下,通常都使用dp这种单位。 -
sp
scale- independent pixel,意为缩放无关像素。与像素无关,但是受字体偏好设置影响。通常会使用sp来设置文字大小。 -
pt、mm、in
类似于dp的缩放单位。允许以点( 1/ 72 英寸)、毫米或英寸为单位指定用户界面尺寸。实际开发中并不推荐使用。
-
dp
LinearLayout标签内容
- android:orientation属性,如果值为vertical,则包含在里面的控件是竖着摆放;如果值为horizontal,则包含在里面的控件是横着摆放。如果不填写,则值默认为horizontal。
- 布局的工作原理如下:
- 如果是horizontal,则先看layout_width属性;如果是vertical,则先看layout_heigth属性
- 假设是horizontal,再看layout_weigth属性值。如果相同则是均分;如果一个为2,一个为1,则是2:1的比例分成。
- 如果layout_width="0dp",则只考虑layout_weigth属性值