Transcript Android-3
Layout, Widget, Fragment
今日目標 - List, Detail
一個Activity,兩個Fragment
一個Fragment顯示List
點選List裡的item開啟另一個Fragment
顯示Detail
按返回鍵回到List
XML
可延伸標記式語言
<tag attr="attr">value</tag>
tag 元素的名稱。
attr 屬性,前者是屬性名稱,後者是屬性
的值,一個元素可以有多個屬性。
value 內容,經常包覆其他元素
<tag attr="attr" />
XML常見通用屬性
android:id
android:layout_width (android:layout_height)
match_parent、wrap_content、或是精確的值
android:layout_margin
與其他元素之間的距離
Left、Right、Top、Bottom
android:layout_padding
自己的邊界往內的留白
Left、Right、Top、Bottom
XML常見通用屬性
android:layout_weight
自動分配高度及寬度的權重
android:layout_gravity
自己的對齊方向
center、left、right、top、bottom
android:gravity
內容的對齊方向
center、left、right、top、bottom
android:background
#AARRGGBB or #RRGGBB
@drawble/[resourceId]
Layout
FrameLayout
最單純的排版
會將子元素全部疊起來顯示
類似PS的圖層
Layout
LinearLayout
最常用的排版之一
依序排列
android:orientation
horizontal or vertical
搭配ScrollView
Layout
GridLayout
表格狀的排版
android:layout_row 第幾列
android:layout_column 第幾行
Layout
RelativeLayout
最複雜的排版
屬性描述元素之間的關係
用滑鼠拉吧
Widget
TextView
顯示文字
可用html
○ Html.fromHtml([html])
getText、setText
EditText
輸入文字
存取方式同上
Widget
Button
按鈕
setOnClickListener
setOnLongClickListener
setOnTouchListener
Widget
DatePicker
日期選擇器
getYear、getMonth、getDayOfMonth
TimePicker
時間選擇器(小時、分鐘)
getCurrentHour、getCurrentMinute
AnalogClock & DigitalClock
顯示時間
Widget
ProgressBar
進度條
setMax、setProgress
SeekBar
可讓使用者拖動的進度條
setMax、getProgress
Widget
ScrollView
垂直捲動
HorizontalScrollView
水平捲動
ListView
清單
用於重複結構
No ScrollView
ListView
開新專案
Blank Activity with Fragment
在fragment_my.xml加入ListView
打開MyActivity.java
ListView
ListView listView = (ListView)
rootView.findViewById(R.id.listView);
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,
data);
listView.setAdapter(adapter);
ListView
必須透過Adapter顯示資料
ArrayAdapter建構子參數:
Activity、樣式、資料
setAdapter
Fragment
小型Activity
LifeCycle
新增Fragment
New -> Fragment -> Fragment (Blank)
DetailFragment
取消include interface callbacks
fragment_detail.xml
新增Large Text
Fragment
DetailFragment.java
處理TODO
Title、Detail
善用shift+F6
開啟Fragment
讓MyActivity implements
AdapterView.OnItemClickListener
listView.setOnItemClickListener(
(AdapterView.OnItemClickListener)
getActivity());
當有項目被點選時,會去呼叫MyActivity
的onItemClick
開啟Fragment
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
FragmentManager fragmentManager =
getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
DetailFragment detailFragment =
DetailFragment.newInstance(data[position],
detail[position]);
fragmentTransaction.replace(R.id.container,
detailFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
DetailFragment - 顯示
在onCreateView
getActivity().getActionBar().setTitle(title);
View rootView = inflater.inflate(
R.layout.fragment_detail,
container, false);
TextView textView = (TextView)
rootView.findViewById(R.id.detail);
textView.setText(detail);
return rootView;
DetailFragment
關閉時將標題設定回去
@Override
public void onPause() {
super.onPause();
getActivity().getActionBar().
setTitle(R.string.app_name);
}
Navigation Back
@Override
public void onActivityCreated(
Bundle savedInstanceState) {
super.onActivityCreated(
savedInstanceState);
getActivity().getActionBar().
setDisplayHomeAsUpEnabled(true);
setHasOptionsMenu(true);
}
關閉Fragment
@Override
public boolean onOptionsItemSelected(
MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getActivity().getFragmentManager().
popBackStack();
return true;
}
return super.onOptionsItemSelected(item);
}
DetailFragment
在onPause
getActivity().getActionBar().
setDisplayHomeAsUpEnabled(false);
成果
下集預告
Menu
Dialog
Toast
Notification