您的位置:首页 > 移动开发 > Android开发

Android应用界面开发_学习笔记_第二周

2016-03-02 07:53 591 查看

一、五大布局

1、LinearLayout

android:layout_weight=”10”

// 子控件有weight的概念

2、RelativeLayout

很重要的三点布局属性:

android:layout_alignParentRight //相对于父控件;

android:layout_toRightOf //相对于xx控件

android:alighLeft //控件左边和某控件的左边平行

三种方式:在某一控件的左边右边上边下边,在父控件的左边右边上边下边,依赖于某一控件的左边右边上边下边(align)

三种方式可以构造出所有布局

android:layout_above—–该控件的底部至于指定ID的控件之上

android:layout_below—–该控件的顶部至于给定ID的控件之下

android:layout_toLeftOf—该控件右边缘呵给定ID的控件的左边缘对齐

android:layout_toRightOf—-该控件的左边缘呵给定ID的控件的右边缘对齐

============================================= android:layout_alignBaseline —- 该控件的baseline和给定ID控件的baseline对齐

android:layout_alignBottom —–该控件的底部边缘与给定ID控件的底部边缘

android:layout_alignLeft ——该控件的左边缘与给定ID的左边缘对齐

android:layout_alignRight —–该控件的右边缘与给定ID的右边缘对齐

android:layout_alignTop ——该控件的顶边缘与给定ID的顶部边缘对齐

============================================= android:layout_alignParentBottom—–如果该值为true的时候,则该控件的底部与父控件的底部对齐

android:layout_alignParentLeft—-如果为true的时候,该控件的左边与父控件的左边对齐

android:layout_alignParentRight———如果为true的时候,该控件的右边与父控件的右边对齐

android:layout_alignParentTop——如果为true的时候,该控件的顶部与父控件的顶部对齐

android:layout_centerHorizontal —–如果为true的时候,该控件的被至于水平方向的中央

android:layout_centerInParent—-如果为true的时候,该控件被至于父控件水平方向和垂直方向

android:layout_centerVertical—-如果为true的时候,该空间被至于垂直方向的中央

两个边距:

android:layout_margin //控件距离父控件的上下左右边距(外边距)

android:layout_marginLeft //控件距离父控件的左边距

android:layout_padding //内边距(从控件向内)

3、FrameLayout 帧布局

控件会一直叠加在一起

4、AbsoluteLayout(很少用)

android不建议用,因为android屏幕很多

5、TableLayout(很少用)

二、布局技巧与优化

一些有用的属性

1、<include /> 重用布局文件

<include layout="@layout/activity_splash"/>


2、<merge /> 减少视图层级


3、<ViewStub /> 需要时才加载


两个小工具:

1、Android lint:删除无用的资源、布局、文件、引用、类、控件。

2、HierarchyViewer:分析布局层级

三、Adapter

1、概念

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView) 等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:



所以,界面显示的步骤是:

1、建立数据源

2、建立adapter,连接数据源

3、绑定adapter到界面组件

2、android常用的Adapter

Android中与Adapter有关的所有接口、类的完整层级图:



其中Adapter一般有以下几种:BaseAdapter,ArrayAdapter,SimpleAdapter 和 SimpleCursorAdapter。

ArrayAdapter最为简单,只能展示一行字。

SimpleAdapter有最好的扩充性,可以自定义出各种效果。

SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。

四、LayoutInflater

这部分内容参考博客:

/article/4632930.html

1、LayoutInflater是什么

(1)LayoutInflater这个类,它的作用类似于findViewById();

(2)不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而 findViewById()是找xml布局文件下的具体widget控件。

具体作用:

1、对于一个没有被载入或者想要动态载入的界面,都需要使用

LayoutInflater.inflate()方法 来载入;

2、对于一个已经载入的界面,就可以使用 Activiyt.findViewById()方法 来获得其中的界面元素。

2、获得 LayoutInflater 实例的三种方式

LayoutInflater 是一个抽象类,

在文档中如下声明: public abstract class LayoutInflater extends Object

LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater()

LayoutInflater inflater = LayoutInflater.from(context);

LayoutInflater inflater = (LayoutInflater)context.getSystemService

(Context.LAYOUT_INFLATER_SERVICE);

其实,这三种方式本质是相同的,从源码中可以看出这三种方式最终本质是都是调用的Context.getSystemService()。

另外 getSystemService()是Android很重要的一个API, 它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。以下介绍系统相应的服务。

传入的Name         返回的对象          说明

LAYOUT_INFLATER_SERVICE    LayoutInflater  取得xml里定义的view
WINDOW_SERVICE     WindowManager   管理打开的窗口程序
ACTIVITY_SERVICE   ActivityManager 管理应用程序的系统状态
POWER_SERVICE  PowerManger 电源的服务
ALARM_SERVICE  AlarmManager    闹钟的服务
NOTIFICATION_SERVICE   NotificationManager 状态栏的服务
KEYGUARD_SERVICE   KeyguardManager 键盘锁的服务
LOCATION_SERVICE   LocationManager 位置的服务,如GPS
SEARCH_SERVICE SearchManager   搜索的服务
VEBRATOR_SERVICE   Vebrator    手机震动的服务
CONNECTIVITY_SERVICE   Connectivity    网络连接的服务
WIFI_SERVICE   WifiManager Wi-Fi服务
TELEPHONY_SERVICE  TeleponyManager 电话服务


3、inflate怎么用? inflate 方法

通过 sdk 的 api 文档,可以知道该方法有以下几种过载形式,返回值均是 View 对象,如下:

public View inflate (int resource, ViewGroup root)

public View inflate (XmlPullParser parser, ViewGroup root)

public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)

public View inflate (int resource, ViewGroup root, boolean attachToRoot)

五、ListView - 关于优化

1、如何重用?(重用布局)

package com.example.chenjinhua.secondweek;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
* Created by chenjinhua on 16/3/10.
*/
public class PhoneAdapter extends BaseAdapter {
private Context mContext;
private List<UserInfo> mUserInfo;

public PhoneAdapter(Context context, List<UserInfo> userInfo) {
mContext = context;
mUserInfo = userInfo;
}

@Override
public int getCount() {
return mUserInfo.size();
}

@Override
public Object getItem(int i) {
return mUserInfo.get(i);
}

@Override
public long getItemId(int i) {
return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

ViewHolder viewHolder;

//1、view复用:只有当view为空时,才读取xml布局文件;不为空则继续使用view,取控件。
if (view == null) {
view = inflater.inflate(R.layout.item_listview, null);

viewHolder = new ViewHolder();
viewHolder.avatarImageView = (ImageView) view.findViewById(R.id.avatar_imageview);
viewHolder.nameTextView = (TextView) view.findViewById(R.id.item_name);
viewHolder.ageTextView = (TextView) view.findViewById(R.id.item_age);

//打标签
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}

viewHolder.avatarImageView.setImageResource(R.drawable.avatar);
viewHolder.nameTextView.setText(mUserInfo.get(i).getName());
viewHolder.ageTextView.setText(mUserInfo.get(i).getAge() + "");

return view;
}
}

//2、创建一个类,用于缓存控件。
class ViewHolder {
ImageView avatarImageView;
TextView nameTextView;
TextView ageTextView;
}


2、Item不同怎么办?getItemViewType

3、如何做风格迥异的分割线?

4、复杂ListView的性能如何优化?

常用属性:

listSelector

scrollingCache

cacheColorHint

fastScrollEnabled

……

常用方法:

addHeaderView

addFooterView

六、GridView

GridView和ListView的相似与区别:

相同:

1、GridView extends AbsListView;ListView extends ABSListView;

2、adapter、数据、点击事件、刷新都一样。

不同之处:样式(宫格式)

下面是GridView特有重要的属性:

android:numColumns="3"    //显示3列
android:columnWidth="50dp" //每一列的宽度
android:horizontalSpacing="110dp" //横向间距
android:verticalSpacing="110dp"   //纵向间距
......


微信上哪些地方用了GridView:

1、微信发送消息栏里的加号选择;

2、微信表情选择;

3、相册的选择;

4、朋友圈的图片展示;

5、头像

七、ScrollView

1、用处:不是列表内容区的滚动

2、extends FrameLayout

3、只支持垂直滚动

4、其他属性、方法

5、HorizontalScrollView

practice:

1、找一些图片,做一个图片选择器;

2、或者做一个表情选择;

3、ScrollView其他方法学习。

八、小技巧

一、关于快捷键

1、从哪找; 2、怎么修改; 3、如何学习。

1、2、打开设置,如下图位置,或者快捷键(command + ,),搜索keymap:



3、点击AS菜单栏,如Edit、Refactor,每个条目右边都有显示快捷键。



二、get、set时会自动去除方法名前的m

提取为全局变量、静态变量时会自动加上m、s。



三、SDK等在哪配置

点击Project Structure项目配置:



SDK、JDK等路径配置:



Gradle 版本等配置:



app编译sdk版本、签名、Dependencies等配置:



exercise:

实现关于微信页面的

<TextView
android:id="@+id/text_view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:gravity="center"
android:textSize="10dp"
android:text="@string/right"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: