• Android开发之50个常见实用技巧——活用布局


    第一章、活用布局

    Hack1. 使用weight属性实现视图的居中显示

       ①合用weightSum属性和layout-weight属性

        解决问题,如:居中显示按钮,并占据父视图的50%;

          代码如:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:backgorund="#FFFFFF"
        android:gravity="center"
        android:orientation="horizontal"
        android:weightSum="1">
    
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="click me"/>
    </LinearLayout>

       分析:

         指定LinearLayout的android:weightSum属性值为1,表示内部所有子视图的weight总和是1;  

      参考链接: http://developer.android.com/reference/android/widget/LinearLayout.html

    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 <?xml version="1.0" encoding="utf-8"?>
     2 <PreferenceScreen
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:key="pref_first_preferencescreen_key"
     5     android:title="Preferences">
     6 
     7     <PreferenceCategory
     8         android:title="User">
     9         
    10         <EditTextPreference
    11             android:key="pref_username"
    12             android:summary="Username"
    13             android:title="Username"/>
    14     </PreferenceCategory>
    15     
    16     <PreferenceCategory
    17         android:title="Application">
    18     
    19         <Preference
    20             android:key="pref_rate"
    21             android:summary="Rate the app in the store!"
    22             android:title="Rate the app"/>
    23     
    24         <Preference
    25             android:key="pref_share"
    26             android:summary="Share the app with your friends"
    27             android:title="Share it"/>
    28 
    29         <com.manning.androidhacks.hack004.preference.EmailDialog
    30             android:dialogIcon="@drawable/ic_launcher"
    31             android:dialogTitle="Send Feedback"
    32             android:dialogMessage="Do you want to send an email?"
    33             android:key="pref_sendemail_key"
    34             android:negativeButtonText="Cancel"
    35             android:positiveButtonText="OK"
    36             android:summary="Send your feedback by e-mail"
    37             android:title="Send Feedback"/>
    38         
    39         <com.manning.androidhacks.hack004.preference.AboutDialog
    40             android:dialogIcon="@drawable/ic_launcher"
    41             android:dialogTitle="About"
    42             android:key="pref_about_key"
    43             android:negativeButtonText="@null"
    44             android:title="About"/>
    45 
    46     </PreferenceCategory>
    47 
    48 </PreferenceScreen>

      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         @Override
    15         protected void onResume() {
    16             super.onResume();
    17             getPreferenceScreen().getSharedPreferences()
    18                 .registerOnSharedPreferenceChangeListener(this);
    19         }
    20 
    21         @override
    22         protected void onPause() {
    23             getPreferenceScreen().getSharedPreferences()
    24                 .unregisterOnSharedPreferenceChangeListener(this);
    25         }
    26 
    27         @Override
    28         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 }
  • 相关阅读:
    HTTP Continuation or nonHTTP traffic 数据包
    linuxTcp IP协议栈源码阅读笔记(转)
    使用Windows命令行启动服务
    数据库集群
    ShellExecute
    oracle 中数据库完全导入导出:cmd命令行模式
    理解ORACLE数据库字符集
    asp.net 编码设置
    ShellExecute与ShellExecuteEx的用法
    C++用位运算实现循环移位
  • 原文地址:https://www.cnblogs.com/jesonjason/p/5430576.html
Copyright © 2020-2023  润新知