参考《Professional Android 4 Development》

Android UI基本元素

下面这些概念是Android UI设计的基础,深入学习和理解它们是Android UI设计的基础:

  • View:View是所有UI元素,包括Layout在内,的父类。
  • View Groups:View的子类,实现了ViewManager接口。一个ViewGroup可以包含多个子View。
  • Fragmengts:用于封装UI的基本元素。Fragment有自己的layout配置文件,可以接收用户输入,可以方便地适配不同的屏幕。
  • Activity:用于表达android设备的屏幕,Activity类似于Web开发中的Form表单。View等UI元素只有绑到Activity中才可以被用户可见。

Android UI基础

Android UI与Activity的绑定

最常用的方法是使用setContentView()将Layout ID或View对象传到Activity中,例如:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
}
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  TextView myTextView = new TextView(this);
  setContentView(myTextView);

  myTextView.setText(“Hello, Android”);
}

同样的,使用findViewById()方法可以通过View ID获取View对象:

TextView myTextView = (TextView)findViewById(R.id.myTextView);

Layout简介

Layout是ViewGroup的子类,用于描述和管理Android UI的布局。Android自带了很多Layout,常用的包括FrameLayout,LinearLayout,RelativeLayout和GridLayout。关于Layout的更多信息,可以参考这个链接:

http://developer.android.com/guide/topics/ui/declaring-layout.html#CommonLayouts

下面是一个Layout示例文件:

<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>
  <TextView
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:text=”Enter Text Below”
  />
  <EditText
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:text=”Text Goes Here!”
  />
</LinearLayout>

wrap_content将View的高(或宽)设置为能包裹控件内容的最小值,而match_parent则使View尽可能地填充父容器。

Layout优化

<merge>: 由于Layout可以nest(叠加?)使用,所以有时会出现冗余的Layout。一个常见的例子是使用FrameLayout创建一个单根的配置文件,例如:

<?xml version=”1.0” encoding=”utf-8”?>
<FrameLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>
  <ImageView
  android:id=”@+id/myImageView”
  android:layout_width=”match_parent”
  android:layout_height=”match_parent”
  android:src=”@drawable/myimage”
  />
  <TextView
  android:id=”@+id/myTextView”
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:text=”@string/hello”
  android:gravity=”center_horizontal”
  android:layout_gravity=”bottom”
  />
</FrameLayout>

若将上面的layout添加到另一个Layout中,则会产生冗余(redundant),更好的解决方式是使用<merge>标签:

<?xml version=”1.0” encoding=”utf-8”?>
<merge xmlns:android=”http://schemas.android.com/apk/res/android”>
  <ImageView
  android:id=”@+id/myImageView”
  android:layout_width=”match_parent”
  android:layout_height=”match_parent”
  android:src=”@drawable/myimage”
  />
  <TextView
  android:id=”@+id/myTextView”
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:text=”@string/hello”
  android:gravity=”center_horizontal”
  android:layout_gravity=”bottom”
  />
</merge>

当使用<merge>标签的配置文件被嵌入到另一个文件中时,<merge>标签会被删掉。<merge>标签常和<include>一起使用,例如:

<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>
  <include android:id=”@+id/my_action_bar”
   layout=”@layout/actionbar”/>
  <include android:id=”@+id/my_image_text_layout”
   layout=”@layout/image_text_layout”/>
</LinearLayout>

使用ViewStub

ViewStub是View的子类,使用类似Lazy Load的方式加载,从而节省了系统资源。在代码中使用:

// Find the stub
View stub = findViewById(R.id. download_progress_panel_stub);
// Make it visible, causing it to inflate the child layout
stub.setVisibility(View.VISIBLE);
// Find the root node of the inflated stub layout
View downloadProgressPanel = findViewById(R.id.download_progress_panel);

配置文件:

<?xml version=”1.0” encoding=”utf-8”?>
<FrameLayout “xmlns:android=http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>
  <ListView
  android:id=”@+id/myListView”
  android:layout_width=”match_parent”
  android:layout_height=”match_parent”
  />
  <ViewStub
  android:id=”@+id/download_progress_panel_stub”
  android:layout=”@layout/progress_overlay_panel”
  android:inflatedId=”@+id/download_progress_panel”
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:layout_gravity=”bottom”
  />
</FrameLayout>

Android 4学习(7):用户界面 - 基础的更多相关文章

  1. Android Ormlite 学习笔记1 -- 基础

    Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...

  2. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...

  3. Android:日常学习笔记(7)———探究UI开发(4)

    Android:日常学习笔记(7)———探究UI开发(4) UI概述  View 和 ViewGrou Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成 ...

  4. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  5. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  6. Android Testing学习02 HelloTesting 项目建立与执行

    Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...

  7. Android Testing学习01 介绍 测试测什么 测试的类型

    Android Testing学习01 介绍 测试测什么 测试的类型 Android 测试 测什么 1.Activity的生命周期事件 应该测试Activity的生命周期事件处理. 如果你的Activ ...

  8. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  9. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  10. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

随机推荐

  1. 动态规划之最短路径(Floyd算法)

    package main import ( "fmt" ) func floyd(m [][]int) { length := len(m[]) var min, i, j int ...

  2. PrepareStatement

    import java.sql.DriverManager; import java.sql.Connection; import java.sql.PreparedStatement; import ...

  3. MinGW main()

    MinGW没有wmain入口函数,为了获取宽字符的参数,可以用系统API函数GetCommandLineW. main.cpp #include <iostream> #include & ...

  4. nohup+命令+& 【退出终端后,程序依然在后台运行】

    [ 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令. 该命令可以忽略所有挂断(SIGHUP)信号,在你退出帐户/关闭终端之后继续运行相应的进程. nohup ...

  5. android中shape的属性

    <shape> <!– 实心 –> <solid android:color=”#ff9d77″/> <!– 渐变 –> <gradient an ...

  6. (转)android头像设置:从本地照片库或拍照获取并剪裁

    本文转载于:http://blog.csdn.net/sheeprunning/article/details/9184021 功能介绍 制作android应用时,用户注册的功能必不可少,往往还需要具 ...

  7. Solr单机版安装

    感谢 shliuzw 的分享,原文地址http://blog.csdn.net/liuzhenwen/article/details/4060922 感谢 upxiaofeng 的分享,原文地址 ht ...

  8. LeetCode OJ:Binary Tree Right Side View(右侧视角下的二叉树)

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  9. L123

    My heart, the bird of the wilderness, has found its sky in your eyes. 我的心是旷野的鸟,在你的双眼中找到了天空.His main ...

  10. linux下的制作静态库并使用它

    静态库所要用的源文件 文件 fred.c   #include <stdio.h>   void fred(int argc) {     printf("void fred(i ...