Android05-UI02布局,自定义控件,ListView
1.布局
布局的内部除了放置控件外,也可以放置布局,通过多层布局的嵌套,我们就能够完成一些 比较复杂的界面实现
¨四种基本布局
LinearLayout
RelativeLayout
FrameLayout
TableLayout
2.补充知识
View
所有用户交互的组件(Widget)的基类
一个View对象占据矩形区域,并负责这个区域内的像素绘制和事件处理。
ViewGroup
继承自View类
ViewGroup类是所有布局(layouts)的基类,布局类是不可见的,用于容纳其他View类对象并且定义它们的布局属性。
有两种方式来定义布局:
1.使用XML文件
XML布局文件
保存在目录res/layout
扩展名必须是xml,文件名必须是小写字母
ADT会对每一个xml布局文件生成R类的一个变量,例如:main.xml-->R.layout.main
关键的API:setContentView()
使用XML方式的优点
将应用程序的界面与应用程序的逻辑行为分离。
你可以在不需要修改和重新编译源代码的情况下,来修改和调整程序界面。
布局参数
XML 布局的命名方式:layout_something
例如:layout_width定义了组件的宽度。
组件的布局参数用来告诉容纳这个组件的布局这个组件希望怎样被布置。
2.使用Java代码来编写(Instantiate layout elements at runtime)
LinearLayout
线性布局将所有它的子组件排列成一列或者一行。
默认的排列方向是horizontal(水平).
布局参数
水平方向的线性布局中的控件, android:layout_gravity属性只在垂直方向上起作用
垂直方向的线性布局中的控件, android:layout_gravity属性只在水平方向上起作用
指示该线性布局的组件需要额外占据的空间。
0表示该组件应该是被压缩的。
否则组件将按比例在属性大于0组件中来分配额外的空间。
android:orientation="horizontal"
RelativeLayout
容器内的子元素是由其相对于其他子元素或者容器的位置来决定的。
android:layout_alignParentLeft、
android:layout_alignParentTop、
android:layout_alignParentRight、
android:layout_alignParentBottom、
android:layout_centerInParent
FrameLayout
FrameLayout 相比于前面两种布局就简单太多了,因此它的应用场景也少了很多。这种 布局没有任何的定位方式,所有的控件都会摆放在布局的左上角。
TableLayout
自定义控件
方法一
创建一个新的布局title.xml
在活动布局中使用<include>标签引用title.xml (只有显示效果,没有行为)
方法二
创建一个LinearLayout的子类TitleLayout,并使用title.xml作为布局
在活动布局中引用TitleLayout(既有显示效果,又有行为)
¨ListView
ListView的简单用法
定制ListView的界面
ListView的点击事件
提升ListView的运行效率
ListView是Android中最常用的控件。
当需要显示列表的使用就会使用ListView,例如:手机的联系人,微信聊天信息,查看微博信息等等
使用:
n使用ListView显示一组字符串
//activity_main.xml <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> //使用String类型的数组 //调用ArrayAdapter的构造函数来对数据进行包装 public class MainActivity extends Activity { private String[] data = { "Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); } }
ArrayAdapter(Context context, int resource, T[] objects)
¨context: 上下文对象,一般会传入Activity对象
¨resource : 一个包含TextView的布局,一般会使用系统提供的布局资源
¨objects:数据数组,如果数组的数据类型不是String,则会调用这个类的toString方法
Adapter中文名称适配器,用来给ListView提供
¨数据
¨布局资源
提升ListView效率
ngetView方法中有一个convertView参数,可以直接利用之前加载好的布局,从而提升代码效率