一个好的APP不仅有美观,好看的界面,更需要良好的性能和稳定性。作为一名开发人员,需要理解界面设计原则并写出优秀的界面设计代码。
本章主要讲述基本控件的使用,界面布局及一些常用的界面设计属性。
(1) LinearLayout 相对布局
android:android:layout_weight=”1” //百分比属性
android:layout_above //表示与某个元素绑定后,在某个元素之上
android:layout_toLeftOf // 表示与某个元素绑定后,在某个元素左边
android:layout_alignLeft //依赖于某个元素的左边(平行对齐)
android:layout_margin //表示与边界的距离,没有方向的margin是与四边的距离
android:padding //是内边距
android:orientation=”vertical” //垂直展示子控件列表
android:orientation=”horizontal” //水平展示子控件列表
控件可见性设置:
设置成gone为隐藏(完全不在,不占用空间)
设置成invisible不可见(看不见,但还存在,占用空间)
(2) RelativeLayout
android:layout_alignParentRight //相对于父控件;
android:layout_toRightOf //相对于xx控件
android:alighLeft //控件左边和某控件的左边平行
(3)FrameLayout 帧布局
控件会一直叠加在一起
(4)AbsoluteLayout(很少用)
android不建议用,因为android屏幕很多
(5)TableLayout(很少用)
两个小工具:
LayoutInflater(加载资源文件格式)
LayoutInflater 是一个抽象类。LayoutInflater这个类,它的作用类似于findViewById(); 不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而 findViewById()是找xml布局文件下的具体widget控件。
在文档中如下声明: public abstract class LayoutInflater extends Object
layoutInflater在项目中的使用实例代码:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));
EditText editText = (EditText)view.findViewById(R.id.content);
对于上面代码,指定了第二个参数 ViewGroup root,当然你也可以设置为 null 值。
View复用可以有效的提高页面加载的速度,从而提高整体程序的性能。View复用举例如下:
1 public View getView(int i, View view, ViewGroup viewGroup) { 2 LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 3 4 ViewHolder viewHolder; 5 //1、view复用:只有当view为空时,才读取xml布局文件;不为空则继续使用view,取控件。 6 if (view == null) { 7 view = inflater.inflate(R.layout.item_listview, null); 8 viewHolder = new ViewHolder(); 9 viewHolder.avatarImageView = (ImageView) view.findViewById(R.id.avatar_imageview); 10 viewHolder.nameTextView = (TextView) view.findViewById(R.id.item_name); 11 viewHolder.ageTextView = (TextView) view.findViewById(R.id.item_age); 12 13 //打标签 14 view.setTag(viewHolder); 15 } else { 16 viewHolder = (ViewHolder) view.getTag(); 17 } 18 19 viewHolder.avatarImageView.setImageResource(R.drawable.avatar); 20 viewHolder.nameTextView.setText(mUserInfo.get(i).getName()); 21 viewHolder.ageTextView.setText(mUserInfo.get(i).getAge() + ""); 22 23 return view; 24 } 25 } 26 //2、创建一个类,用于缓存控件。 27 class ViewHolder { 28 ImageView avatarImageView; 29 TextView nameTextView; 30 TextView ageTextView; 31 }
android中常用的数据控件包括,ScrollView,GridView,ListView。作为数据交互,一般会结合adapter使用。
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView) 等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:
所以,界面显示的步骤是:
ArrayAdapter最为简单,只能展示一行字。
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
常用属性:
常用方法:
数据绑定:
mPhoneBookListView = (ListView) findViewById(R.id.list_view);
PhoneBookAdapter phoneBookAdapter = new PhoneBookAdapter(ListViewDemoActivity.this);
mPhoneBookListView.setAdapter(phoneBookAdapter);
adapter定义如下:
1 public class PhoneBookAdapter extends BaseAdapter { 2 3 <pre><code>private Context mContext; 4 5 private LayoutInflater mLayoutInflater; 6 7 private String[] mNames = {"小明", "小花"}; 8 9 public PhoneBookAdapter(Context context) { 10 //构造器 11 mContext = context; 12 mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 13 } 14 15 @Override 16 public int getCount() { 17 // 有多少条数据 18 return mNames.length; 19 } 20 21 @Override 22 public Object getItem(int position) { 23 // 返回某一条数据对象 24 return mNames[position]; 25 } 26 27 @Override 28 public long getItemId(int position) { 29 30 return position; 31 } 32 33 @Override 34 public View getView(int position, View convertView, ViewGroup parent) { 35 // 返回一个视图 36 convertView = mLayoutInflater.inflate(R.layout.item_phone_book_friend, null); 37 //获取控件 38 TextView nameTextView = (TextView) convertView.findViewById(R.id.name_text_view); 39 //和数据之间进行绑定 40 nameTextView.setText(mNames[position]); 41 return convertView;//返回视图 42 }
注:
getView(int position, View convertView, ViewGroup parent)
postion表示位置
convertView表示视图
parent表示所有者convertView = mLayoutInflater.inflate(R.layout.item_phone_book_friend, null);
将找到的布局变为视图TextView nameTextView = (TextView) convertView.findViewById(R.id.name_text_view);
读出来的视图里面找到TextView构造器负责传递上下文
LayoutInflater负责解析Layout
调用时,需要使用getSystemService(Context.LAYOUT_INFLATER_SERVICE)方法
更新ListView中的数据:
phoneBookAdapter.refreshData(mUserInfos);
phoneBookAdapter.notifyDataSetChanged(); //执行刷新功能
在对应的Adapter方法中加入刷新方法:
public void refreshData(UserInfo userInfos) {
mUserInfos = userInfos;
}
GridView和ListView的相似与区别:
相同:
不同之处:
样式(宫格式)
下面是GridView特有重要的属性:
android:numColumns
="3"
//显示3列
android:columnWidth
="50dp"
//每一列的宽度
android:horizontalSpacing
="110dp"
//横向间距
android:verticalSpacing
="110dp"
//纵向间距
ScrollView
让不是列表的内容区滚动
extents自FrameLayout
支持垂直滚动HorizontalScrollView