1.五大布局
android中的布局包括:LinearLayout(線性布局)闭树、RelativeLayout(相對布局)蚌斩、FrameLayout(框架布局)件舵、AbsoluteLayout(絕對布局)秀姐、TableLayout(表格布局)养泡,在實際中主要實用的是前面三種埂奈。
1.1LinearLayout(線性布局)
特點:
線性方向上依次排列
一些需要注意的點:
weight(權重)的解釋:按比例劃分水平方向:將涉及到的View的android:width屬性設置為0dp,然后設置為android weight屬性設置比例即可;類推,豎直方向,只需設android:height為0dp,然后設weight屬性迄损!
當 android:orientation="vertical" 時, 只有水平方向的設置才起作用账磺,垂直方向的設置不起作用芹敌。 即:left,right垮抗,center_horizontal 是生效的氏捞。 當 android:orientation="horizontal" 時, 只有垂直方向的設置才起作用冒版,水平方向的設置不起作用液茎。 即:top,bottom辞嗡,center_vertical 是生效的捆等。
1.2RealtiveLayout(相對布局)
一些需要注意的點:
margin與padding的區(qū)別
初學者對于這兩個屬性可能會有一點混淆,這里區(qū)分下: 首先margin代表的是偏移,比如marginleft = "5dp"表示組件離容器左邊緣偏移5dp; 而padding代表的則是填充,而填充的對象針對的是組件中的元素,比如TextView中的文字 比如為TextView設置paddingleft = "5dp",則是在組件里的元素的左邊填充5dp的空間续室! margin針對的是容器中的組件栋烤,而padding針對的是組件中的元素,要區(qū)分開來挺狰!
1.3FrameLayout(框架布局)
又稱為幀布局明郭,該布局直接在屏幕上開辟出一塊空白的區(qū)域,當我們往里面添加控件的時候,會默認把他們放到這塊區(qū)域的左上角,而這種布局方式卻沒有任何的定位方式,所以它應用的場景并不多;幀布局的大小由控件中最大的子控件決定,如果控件的大小一樣大的話,那么同一時刻就只能看到最上面的那個組件!后續(xù)添加的控件會覆蓋前一個!雖然默認會將控件放置在左上角,但是我們也可以通過layout_gravity屬性,指定到其他的位置买窟。
1.3.1常用屬性:
android:foreground:*設置改幀布局容器的前景圖像
android:foregroundGravity:設置前景圖像顯示的位置
1.4AbsoluteLayout(絕對布局)---已被棄用
1.5TableLayout(表格布局)
需要注意的點:
列數(shù)是從0開始的。
每一個<TableRow> </TableRow>即為一行
1.6布局技巧與優(yōu)化
1.6.1布局的優(yōu)化:
布局的結構要清晰
嵌套的層數(shù)需要控制(小于10層)
減少層數(shù)(使用相對布局)
1.6.2布局的技巧
<include/>重用布局文件
<merge/>減少試圖層數(shù)
<ViewStub/>需要時才加載
不要嵌套多個使用layout_weight屬性的LinearLayout
Android lint---優(yōu)化代碼薯定、查找沒用到的資源蔑祟、查找錯誤
HierarchyViewer---優(yōu)化布局設計
2無比重要的ListView
ListView是一種以列表形式展示具體內(nèi)容,并且能夠根據(jù)數(shù)據(jù)的長度自適應顯示的控件沉唠。一個listView通常有兩個職責:一是將數(shù)據(jù)填充到布局疆虚,二是處理用戶的選擇點擊操作等。
構建ListView的元素:
- ListView中每一列的view满葛。
- 填入View的數(shù)據(jù)径簿,如字符串、圖片或組件嘀韧。
- 連接數(shù)據(jù)與ListView的適配器篇亭。
2.1Adapter
適配器是一個連接數(shù)據(jù)和AdapterView(ListView就是一個典型的AdapterView,后面還會學習其他的)的橋梁锄贷,通過它能有效地實現(xiàn)數(shù)據(jù)與AdapterView的分離設置译蒂,使AdapterView與數(shù)據(jù)的綁定更加簡便,修改更加方便.
適配器包括:ArrayAdapter谊却、SimpleAdapter柔昼、SimpleCursorAdapter、BaseAdapter等炎辨。(各種Adapter只不過是轉換的方式和能力不一樣而已)
2.1.1BaseAdapter
使用BaseAdapter必須寫一個類繼承它捕透,同時BaseAdapter是一個抽象類,繼承它必須實現(xiàn)它的方法碴萧。BaseAdapter的靈活性就在于它要重寫很多方法乙嘀,看一下有哪些方法,如上圖所示為繼承自BaseAdapter的SpeechListAdapter所實現(xiàn)的方法破喻,其中最重要的即為getView()方法虎谢。
當系統(tǒng)開始繪制ListView的時候,首先調(diào)用getCount()方法曹质。得到它的返回值婴噩,即ListView的長度。然后系統(tǒng)調(diào)用getView()方法咆繁,根據(jù)這個長度逐一繪制ListView的每一行讳推。也就是說,如果讓getCount()返回1玩般,那么只顯示一行银觅。而getItem()和getItemId()則在需要處理和取得Adapter中的數(shù)據(jù)時調(diào)用。
public class PhoneBookAdapter extends BaseAdapter {?
?? private Context mContext;? ??
private LayoutInflater mLayoutInflater;??
? private ListmUserInfos= new ArrayList<>();
? ? public PhoneBookAdapter(Context context, List userInfos) {
mContext = context;
mUserInfos = userInfos;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// 有多少條數(shù)據(jù)
return mUserInfos.size();
}
@Override
public Object getItem(int position) {
// 返回某一條數(shù)據(jù)對象
return mUserInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 返回一個視圖
if(converView==null){
convertView = mLayoutInflater.inflate(R.layout.item_phone_book_friend, null);
// 獲取控件
TextView nameTextView = (TextView) convertView.findViewById(R.id.name_text_view);
TextView? ageTextView = (TextView) convertView.findViewById(R.id.age_text_view);
ImageView avatarImageView = (ImageView) convertView.findViewById(R.id.avatar_image_view);
// 和數(shù)據(jù)之間進行綁定
nameTextView.setText(mUserInfos.get(position).getUserName());
ageTextView.setText(String.valueOf(mUserInfos.get(position).getAge()));
avatarImageView.setImageResource(R.drawable.ic_launcher);
return convertView;
}
在該構造器中通過使用判斷convertView是否為空來對性能進行優(yōu)化坏为。
2.2在JAVA文件中調(diào)用Adapter
public class ListViewDemoActivity extends Activity {
private ListView mPhoneBookListView;
private ListmUserInfos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview_demo);
mPhoneBookListView = (ListView) findViewById(R.id.list_view);
mUserInfos = new ArrayList<>();
mUserInfos.add(new UserInfo("劉小明", 21));
mUserInfos.add(new UserInfo("張大偉", 22));
PhoneBookAdapter phoneBookAdapter = new PhoneBookAdapter(ListViewDemoActivity.this,mUserInfos);
mPhoneBookListView.setAdapter(phoneBookAdapter);
}
}
2.3ListView的點擊事件
調(diào)用setOnItemClickListener()方法來為ListView注冊一個監(jiān)聽器究驴,當ListView中的任何一個子項被點擊時就會回調(diào)onItemClick()方法镊绪。
3GridView和ScrollView
3.1GridView與ListView的相似與區(qū)別
相似之處:
GridView extends AbsListView
LIstView extends AbsListView
adapter、數(shù)據(jù)洒忧、點擊事件蝴韭、刷新都一樣
不同之處:
樣式(GridView為宮格式)
3.2GridView應用的地方
微信表情選擇、相冊選擇熙侍、頭像
3.3ScrollView的應用
不是列表的內(nèi)容區(qū)的滾動(
只支持一種方向上的滾動----默認為垂直)