(二)做一个简单的用户界面Building a Simple User Interface

Android Studio如何运行程序我就不多说了,这个跑呗。不过命令行编译貌似还挺好玩的,自己也没趣试,大家可以试试啊。

创建一个so easy的工程我们肯定是不满足的,下面开始创建一个复杂点的,有交互的应用。

1.安卓的用户界面是有由一系列Viwe和ViweGroup组成的,View是我们通常看到的UI组件,比如按钮和文本输入框。

ViewGroup是不可见的view,但是决定了里面的View的如何摆放的。他们的关系下图:


安卓提供XML配置和View与ViewGroup的子类对应,一般Layout的都是ViewGroup的子类。

简单介绍一下View.

View是所有我们看到的组件的祖先类,直接子类有ImageViewTextView, ViweGroup等,间接子类就无数了。

100多个,他们直接的继承关系也比较复杂,有时间可以研究下。

View是用户界面的基本元素,占据屏幕的一个矩形,负责绘制图形和处理事件。view是这些控件的父类,

子类ViewGroup是layouts的基本父类,不可见的,但是包含或者安放其他Views或者ViewGroups,决定他们的布局属性。

使用Viwes

所有的View在窗口中被安排进一个树中。可以通过XML或者编码进行设置,有很多种选择,比如文本,图像了。

当创建一个View树的时候,有些共同的操作可能会做:

(1)设置属性。

        不同的view属性可能不同,不过属性通常被设置在XML布局中

  (2)设置焦点

            强制获得焦点: requestFocus()。

    (3)设置监听器。

      我们可以设置在View发生的感兴趣的事件,比如获得失去焦点,setOnFocusChangeListener(android.view.View.OnFocusChangeListener)

    其他的子类提供更特殊化的监听,比如Button暴露了一个点击事件的监听。

      (4)设置可见性。setVisibility(int)

安卓框架会帮我们绘制和部署View,除非我们自己实现一个ViewGroup,否则不用调用View的这些方法。

        

      实现一个自定义的View

        需要重写一些方法,不过我们可以从重写onDrwa方法开始。

  IDs

        View会有一个Integer的id和他们关联,Id我们一般在Xml中知道,在R.java文件中,根据字符串生成一个final的,

    public static final int edit_message=0x7f0c006b;
       在一个Activity的OnCreate方法中,找到这个View:

   Button myButton = (Button) findViewById(R.id.my_button);
     Id不需要再整个Tree的唯一的,但是在你搜索的Tree要是唯一的,所以还是唯一的好吧。不然不方便,会有问题的。

      位置

      View在几何上是一个矩形,它有位置,通过左和上坐标表示,有两个维度,长宽。位置和维度的单位是像素。

      可以通过getLeft和getTop方法获得坐标。不过是相对他的直接父类的。不是说相对整个屏幕,这一点很重要,需要记住。

      大小 Padding Margins

     大小不必多说,长宽。但是实际上他拥有两对宽和高的值。

     第一对是可测量的宽高,决定了一个View在他的父类中能有多大。可以通过调用getMeasuredWidth() andgetMeasuredHeight() 获得。

   第二对是,简单意义的宽和高,或者有时候的画出的宽和高,这个尺寸决定了在绘图和布局之后View在屏幕上的实际大小。

  这对值,可能但是没必要,和可测量的宽高不同。估计就是 <= 了。调用getWidth() andgetHeight().获得。

  测量这些尺寸,包含了padding。

    Padding can be set using the setPadding(int, int, int, int) orsetPaddingRelative(int, int, int, int) method and queried by callinggetPaddingLeft(),getPaddingTop(),getPaddingRight(),getPaddingBottom(),getPaddingStart(),getPaddingEnd()

   但是Margin,View不同设置,需要ViewGroup设置。

    Padding的View中的内容到View边框的距离,不影响View的大小,影响View中内容的大小.

    Margin是子控件和父控件的边缘,影响整个Viwe大小,实际测试中,线性布局设置了Margin之后,可获得getMeasuredWidth()getWidth() 变小了

高不变,这个不理解,下一步继续探索。


    View group 暂时省略


    讲讲Layouts

     定义了用户界面的可视结构,比如Activity或者 app widget。这两个也是要好好学的吧。

我们可以用两种方式声明一个layout:

       (1)使用xml文件,比较常用

        (2)runtime时生成,动态的

   我们可以随意组合这两种,关键就看我们的需求了吧。

   

使用XML的好处就是展示和控制代码分离,UI和代码的分离的,可以不修改代码,修改UI。比如,我们可以创建一个布局

为不同的语言,屏幕大小。另外,xml可以很直观看到UI的结构,方便调试问题。


  通常,xml定义是跟着classed的。里面的元素对应类的的方法。实际上,我们可以很直接的看出来属性和方法的对应,

有些是不太直接的,比如EditText的 text 对应EditText.setText()方法。


编写xml

在res/layout/中定义xml文件,具体的格式如下:


<?xml version="1.0" encoding="utf-8"?>
<ViewGroup xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@[+][package:]id/resource_name"
    android:layout_height=["dimension" | "fill_parent" | "wrap_content"]
    android:layout_width=["dimension" | "fill_parent" | "wrap_content"]
    [ViewGroup-specific attributes] >
    <View
        android:id="@[+][package:]id/resource_name"
        android:layout_height=["dimension" | "fill_parent" | "wrap_content"]
        android:layout_width=["dimension" | "fill_parent" | "wrap_content"]
        [View-specific attributes] >
        <requestFocus/>
    </View>
    <ViewGroup >
        <View />
    </ViewGroup>
    <include layout="@layout/layout_resource"/>
</ViewGroup>


这是一个Layout Resource的定义, 里面包括:

Elemens:

首先是一个ViewGroup,包括三种LinearLayout,RelativeLayout,还有就是FrameLayout。

有些ViewGroup是AdapterView的实现,比如ListView是吧,这个还需要特殊对待下,以后研究,


ViewGroup的属性:

   android:id  唯一的标识

   android:layout_height 和layout_width . 三种方式设置,fill_parent or wrap_content 或者直接指定大小

这三个应该的公共属性,其他也有一些,但是和具体的ViewGroup的实现有关系了,我们要根据情况来定。


View,可见的视图,三个基本属性和上面一样,其他的就看他的具体的什么view了。

requestFocus,一上来就选中的焦点?

Any element representing a View object can include this empty element, which gives its parent initial focus on the screen. You can have only one of these elements per file.


include 包括其他的文件,方便管理,里面的属性,layout的必须的,指向包含的资源,Id,重写包含文件的root view的Id,

这个可以试试, 还有android:layout_height 和layout_width ,都是重写包含文件的root view的,比如两个都行才能生效。

此外,包含布局另一种就是ViewStub了,这个待学习

    

    












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值