Android Studio如何运行程序我就不多说了,这个跑呗。不过命令行编译貌似还挺好玩的,自己也没趣试,大家可以试试啊。
创建一个so easy的工程我们肯定是不满足的,下面开始创建一个复杂点的,有交互的应用。
1.安卓的用户界面是有由一系列Viwe和ViweGroup组成的,View是我们通常看到的UI组件,比如按钮和文本输入框。
ViewGroup是不可见的view,但是决定了里面的View的如何摆放的。他们的关系下图:
安卓提供XML配置和View与ViewGroup的子类对应,一般Layout的都是ViewGroup的子类。
简单介绍一下View.
View是所有我们看到的组件的祖先类,直接子类有ImageView,TextView, 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了,这个待学习。
的