第一章、活用布局
Hack1. 使用weight属性实现视图的居中显示
①合用weightSum属性和layout-weight属性
解决问题,如:居中显示按钮,并占据父视图的50%;
代码如:
分析:
指定LinearLayout的android:weightSum属性值为1,表示内部所有子视图的weight总和是1;
参考链接:
Hack2 使用延迟加载以及避免代码重复
①使用<include/>标签避免代码重复
如:<include layout="@layout/已经写好的布局文件命"/>
②通过viewStub实现view的延迟加载
ViewStub 是一种不可视并且大小为 0 的视图,可以延迟到运行时填充(inflate)布局资源。
当 ViewStub 设置为可视或者inflate() 方法被调用后,就会填充布局资源,然后 ViewStub 便会
被填充的视图替代。
inflatedId 属性:是调用viewStub的inflate()方法或setVisibility()方法时返回的ID (被填充的View的ID);
只需调用setVisibility(View.VISIBLE) 方法即可加载 显示在layout中引用的布局 map
如: android:layout="@layout/map".
Hack3 创建定制的ViewGroup
情景分析:
需要在不同的Activity中显示复杂的视图
优点:
1、在同的Activity中复用该视图时,更易维护
2、开发者可以使用自定义属性来定制ViewGroup中子视图的位置
3、布局文件更简明,更容易理解
4、如果需要修改margin,不必重新手写计算机每个子视图的margin
①理解Android绘制视图的方式
绘制布局由两个遍历过程组成: 测量过程和布局过程
②创建CascadeLayout类,继承自ViewGroup
重新建attrs.xml文件用于定义那些定制的属性
在res/values下,建dimens.xml文件,用于保存指定水平间距和垂直间距的默认值
重写ViewGroup的OnMeasure()、 OnLayout()方法
③为子视图添加自定义属性
Hack4 偏好设置使用技巧
偏好设置框架(Preference)的目的是创建简单的偏好设置界面,如果想添加更多复杂UI控制或逻辑,建议单独
创建一个Activity并使用Dialog的主题,然后从偏好设置控件上启动它。
XML文件:
1 26 7 9 10 15 1614 18 19 23 24 28 29 38 39 45 46 47 48
Activity代码:
1 public class MainActivity extends PreferenceActivity implements 2 OnSharedPreferenceChangeListener { 3 @Override 4 public void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 addPreferencesFromResource(R.xml.prefs); 7 ... 8 Preference ratePref = findPreference("pref_rate"); 9 Uri uri = Uri.parse("market://details?id=" + getPackageName());10 Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);11 ratePref.setIntent(goToMarket);12 }13 14 @Override15 protected void onResume() {16 super.onResume();17 getPreferenceScreen().getSharedPreferences()18 .registerOnSharedPreferenceChangeListener(this);19 }20 21 @override22 protected void onPause() {23 getPreferenceScreen().getSharedPreferences()24 .unregisterOnSharedPreferenceChangeListener(this);25 }26 27 @Override28 public void onSharedPreferenceChanged(29 SharedPreferences sharedPreferences, String key) {30 if (key.equals("pref_username")) {31 updateUserText();32 }33 }34 35 private void updateUserText() {36 EditTextPreference pref;37 pref = (EditTextPreference) findPreference("pref_username");38 String user = pref.getText();39 40 if (user == null)41 {42 user = "?";43 }44 pref.setSummary(String.format("Username: %s", user));45 }46 }