衆所周知,Activity組件是Andorid應用中最重要,最常見的應用組件!Android應用開發的一個重要組成部分就是開發Activity,下面我將會記錄下Activity的開發!
實例1圖:
實例用第二個Activity處理註冊信息
實例用第二個Activity讓用戶選擇信息
結構圖如下:
啓動、關閉Activity
啓動Activity有如下兩個方法:
1:startActivity(Intent intent):
2:startActivityForResult(Intent intent , int resquestCode):
關閉Activity有如下兩種方法
1:finish();
2:finishActivity(int requestCode):結束指定的Activity;
Activity的四種加載模式
- standard:會在Task中啓動多次Activity實例
- singleTop:當需要啓動的Activity實例位於Task棧頂時,再次啓動將不回創建新的Activity實例
- singleTask:在同一個Task內,若Activity不存在,則創建!若需要啓動的Activity位於棧頂,則Task內無變化!若不位於棧頂,則將位於該Activity上的所有Activity移出Task,將目標Activity位於棧頂!
- singleInstance:無論從哪個Task中啓動目標Activity,只會創建一個目標Activity實例,並且會使用一個全新的棧來加載該Activity實例。
分兩種情況:
1.如果將要啓動的Activity不存在,系統會先創建一個全新的Task,再創建木匾Activity實例,並將它加入新的Task棧頂
2.如果將要啓動的Activity存在,無論他在哪個應用中,系統都會把該Activit所在的Task轉到前臺,從而使Activity顯示出來!
使用Bundle在Activity之間進行交互數據
當一個Activity的時候,通常需要攜帶一部分數據,而攜帶數據的信使就是intent,因此我們需要把需要傳遞的數據放在Intent中:
Intent提供多個重載方法,如下:
1:putExtra(Bundle data);向Intent中放入數據
2:Bundle getExtra():從Intent中取出數據
3:putExtra(String name,Xxx value);向Intent中按key_value鍵值對的形式存入數據
4:getXXXExtra(String name):指定的key,取出數據注意:Intent的putExtra()方法使智能的,當該Intent中如果存在Bundle對象,則直接將需要存入的數據存入到該Bundle中,如果沒有,則會自動創建一個Bundle來存放數據
實例:用第二個Activity處理註冊信息
Activity代碼:
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
EditText name = (EditText)findViewById(R.id.name);
EditText passwd = (EditText)findViewById(R.id.passwd);
RadioButton male = (RadioButton) findViewById(R.id.male);
String gender = male.isChecked() ? "男 " : "女";
Person p = new Person(name.getText().toString(), passwd
.getText().toString(), gender);
// 創建一個Bundle對象
Bundle data = new Bundle();
data.putSerializable("person", p);
// 創建一個Intent
Intent intent = new Intent(MainActivity.this,
ResultActivity.class);
intent.putExtras(data);
// 啓動intent對應的Activity
startActivity(intent);
}
});
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="請輸入您的註冊信息"
android:textSize="20sp"/>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="用戶名:"
android:textSize="16sp"/>
<!-- 定義一個EditText,用於收集用戶的賬號 -->
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請填寫想註冊的賬號"
android:selectAllOnFocus="true"/>
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="密碼:"
android:textSize="16sp"/>
<!-- 用於收集用戶的密碼 -->
<EditText
android:id="@+id/passwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:selectAllOnFocus="true"/>
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="性別:"
android:textSize="16sp"/>
<!-- 定義一組單選框,用於收集用戶註冊的性別 -->
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/male"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:textSize="16sp"/>
<RadioButton
android:id="@+id/female"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
android:textSize="16sp"/>
</RadioGroup>
</TableRow>
<Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="註冊"
android:textSize="16sp"/>
</TableLayout>
實例:用第二個Activity讓用戶選擇信息
MainActivity代碼:
public class MainActivity extends Activity
{
Button bn;
EditText city;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取界面上的組件
bn = (Button) findViewById(R.id.bn);
city = (EditText) findViewById(R.id.city);
// 爲按鈕綁定事件監聽器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 創建需要對應於目標Activity的Intent
Intent intent = new Intent(MainActivity.this,
SelectCityActivity.class);
// 啓動指定Activity並等待返回的結果,其中0是請求碼,用於標識該請求
startActivityForResult(intent, 0);
}
});
}
// 重寫該方法,該方法以回調的方式來獲取指定Activity返回的結果
@Override
public void onActivityResult(int requestCode
, int resultCode, Intent intent)
{
// 當requestCode、resultCode同時爲0時,也就是處理特定的結果
if (requestCode == 0 && resultCode == 0)
{
// 取出Intent裏的Extras數據
Bundle data = intent.getExtras();
// 取出Bundle中的數據
String resultCity = data.getString("city");
// 修改city文本框的內容
city.setText(resultCity);
}
}
}
SelectCityActivity代碼:
public class SelectCityActivity extends ExpandableListActivity
{
// 定義省份數組
private String[] provinces = new String[]
{ "廣東", "廣西", "湖南"};
private String[][] cities = new String[][]
{
{ "廣州", "深圳", "珠海", "中山" },
{ "桂林", "柳州", "南寧", "北海" },
{ "長沙", "岳陽" , "衡陽" , "株洲" }
};
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ExpandableListAdapter adapter = new BaseExpandableListAdapter()
{
// 獲取指定組位置、指定子列表項處的子列表項數據
@Override
public Object getChild(int groupPosition, int childPosition)
{
return cities[groupPosition][childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition)
{
return childPosition;
}
@Override
public int getChildrenCount(int groupPosition)
{
return cities[groupPosition].length;
}
private TextView getTextView()
{
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 64);
TextView textView = new TextView(SelectCityActivity.this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(36, 0, 0, 0);
textView.setTextSize(20);
return textView;
}
// 該方法決定每個子選項的外觀
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent)
{
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition)
.toString());
return textView;
}
// 獲取指定組位置處的組數據
@Override
public Object getGroup(int groupPosition)
{
return provinces[groupPosition];
}
@Override
public int getGroupCount()
{
return provinces.length;
}
@Override
public long getGroupId(int groupPosition)
{
return groupPosition;
}
// 該方法決定每個組選項的外觀
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent)
{
LinearLayout ll = new LinearLayout(SelectCityActivity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ImageView logo = new ImageView(SelectCityActivity.this);
ll.addView(logo);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
}
@Override
public boolean isChildSelectable(int groupPosition,
int childPosition)
{
return true;
}
@Override
public boolean hasStableIds()
{
return true;
}
};
// 設置該窗口顯示列表
setListAdapter(adapter);
getExpandableListView().setOnChildClickListener(
new OnChildClickListener()
{
@Override
public boolean onChildClick(ExpandableListView parent,
View source, int groupPosition, int childPosition,
long id)
{
// 獲取啓動該Activity之前的Activity對應的Intent
Intent intent = getIntent();
intent.putExtra("city",
cities[groupPosition][childPosition]);
// 設置該SelectCityActivity的結果碼,並設置結束之後退回的Activity
SelectCityActivity.this.setResult(0, intent);
// 結束SelectCityActivity。
SelectCityActivity.this.finish();
return false;
}
});
}
}
實例一
用LauncherActivity開發Activity的列表
看結構圖可以看出,LauncherActivity繼承自ListActivity,因此本質上也是一個開發列表界面的Activity,這裏就不做多陳述,直接上代碼
Activity代碼
public class MainActivity extends LauncherActivity
{
//定義兩個Activity的名稱
String[] names = {"設置程序參數" , "查看星際兵種"};
//定義兩個Activity對應的實現類
Class<?>[] clazzs = {PreferenceActivityTest.class
, ExpandableListActivityTest.class};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1 , names);
// 設置該窗口顯示的列表所需的Adapter
setListAdapter(adapter);
}
//根據列表項返回指定Activity對應的Intent
@Override
public Intent intentForPosition(int position)
{
return new Intent(MainActivity.this , clazzs[position]);
}
}
使用ExpandableListActvity實現可展開的Activity
ExpandableListActivity的用法和ExpandableView的用法基本相似,只要爲該Activity傳入一個ExpandableListAdapter對象即可,接下來ExpandableListActivity將會生成一個顯示可展開列表窗口
Activity代碼:
public class ExpandableListActivityTest extends ExpandableListActivity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ExpandableListAdapter adapter = new BaseExpandableListAdapter()
{
int[] logos = new int[]
{
R.drawable.p,
R.drawable.z,
R.drawable.t
};
private String[] armTypes = new String[]
{ "神族兵種", "蟲族兵種", "人族兵種"};
private String[][] arms = new String[][]
{
{ "狂戰士", "龍騎士", "黑暗聖堂", "電兵" },
{ "小狗", "刺蛇", "飛龍", "自爆飛機" },
{ "機槍兵", "護士MM" , "幽靈" }
};
//獲取指定組位置、指定子列表項處的子列表項數據
@Override
public Object getChild(int groupPosition, int childPosition)
{
return arms[groupPosition][childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition)
{
return childPosition;
}
@Override
public int getChildrenCount(int groupPosition)
{
return arms[groupPosition].length;
}
private TextView getTextView()
{
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 64);
TextView textView = new TextView(ExpandableListActivityTest.
this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(36, 0, 0, 0);
textView.setTextSize(20);
return textView;
}
//該方法決定每個子選項的外觀
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent)
{
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition).
toString());
return textView;
}
//獲取指定組位置處的組數據
@Override
public Object getGroup(int groupPosition)
{
return armTypes[groupPosition];
}
@Override
public int getGroupCount()
{
return armTypes.length;
}
@Override
public long getGroupId(int groupPosition)
{
return groupPosition;
}
//該方法決定每個組選項的外觀
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent)
{
LinearLayout ll = new LinearLayout(
ExpandableListActivityTest.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ImageView logo = new ImageView(
ExpandableListActivityTest.this);
logo.setImageResource(logos[groupPosition]);
ll.addView(logo);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
}
@Override
public boolean isChildSelectable(int groupPosition,
int childPosition)
{
return true;
}
@Override
public boolean hasStableIds()
{
return true;
}
};
// 設置該窗口顯示列表
setListAdapter(adapter);
}
}
PreferenceActivity結合PreferenceFragment實現參數設置界面
PreferenceActivity從名字就能看出其作用!用來設置參數時使用的!
在Android3.0之前,PreferenceActivity採用加載選項設置的佈局文件。
其中PreferenceActivity只負責加載選項設置列表的佈局文件,PreferenceFragment才負責加載選項設置的佈局文件。
參數:
PreferenceCategory:用於對參數進行分組
CheckBoxPreference:複選框參數
EditTextPreference:文本框輸入參數
ListPreference:列表框輸入參數
MultiSelectListPreference:多選列表框輸入參數
PreferenceCategory:參數組
Preference:僅供顯示的參數
PreferenceScreen:根元素
RingtonePreference:系統鈴聲選擇
SwitchPreference:開關輸入參數
使用方法:
1.讓Fragment繼承自PreferenceFragment。
2.在onCreate(Bundle savedInstanceState)方法中調用addPreferenceFromResource(……)方法加載指定的佈局文件。
PreferenceActivityTest代碼:
public class PreferenceActivityTest extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 該方法用於爲該界面設置一個標題按鈕
if (hasHeaders())
{
Button button = new Button(this);
button.setText("設置操作");
// 將該按鈕添加到該界面上
setListFooter(button);
}
}
// 重寫該該方法,負責加載頁面佈局文件
@Override
public void onBuildHeaders(List<Header> target)
{
// 加載選項設置列表的佈局文件
loadHeadersFromResource(R.xml.preference_headers, target);
}
// 重寫該方法,驗證各PreferenceFragment是否有效
@Override
public boolean isValidFragment(String fragmentName)
{
return true;
}
public static class Prefs1Fragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
public static class Prefs2Fragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.display_prefs);
// 獲取傳入該Fragment的參數
String website = getArguments().getString("website");
Toast.makeText(getActivity()
, "網站域名是:" + website , Toast.LENGTH_LONG).show();
}
}
}
preference_headers.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 指定啓動指定PreferenceFragment的列表項 -->
<header android:fragment=
"org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"
android:icon="@drawable/ic_settings_applications"
android:title="程序選項設置"
android:summary="設置應用的相關選項" />
<!-- 指定啓動指定PreferenceFragment的列表項 -->
<header android:fragment=
"org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"
android:icon="@drawable/ic_settings_display"
android:title="界面選項設置 "
android:summary="設置顯示界面的相關選項">
<!-- 使用extra可向Activity傳入額外的數據 -->
<extra android:name="website"
android:value="www.crazyit.org" />
</header>
<!-- 使用Intent啓動指定Activity的列表項 -->
<header
android:icon="@drawable/ic_settings_display"
android:title="使用Intent"
android:summary="使用Intent啓動某個Activity">
<intent android:action="android.intent.action.VIEW"
android:data="http://weibo.com/aserbao?source=blog&is_all=1" />
</header>
</preference-headers>
preferences.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 設置系統鈴聲 -->
<RingtonePreference
android:ringtoneType="all"
android:title="設置鈴聲"
android:summary="選擇鈴聲(測試RingtonePreference)"
android:showDefault="true"
android:key="ring_key"
android:showSilent="true">
</RingtonePreference>
<PreferenceCategory android:title="個人信息設置組">
<!-- 通過輸入框填寫用戶名 -->
<EditTextPreference
android:key="name"
android:title="填寫用戶名"
android:summary="填寫您的用戶名(測試EditTextPreference)"
android:dialogTitle="您所使用的用戶名爲:" />
<!-- 通過列表框選擇性別 -->
<ListPreference
android:key="gender"
android:title="性別"
android:summary="選擇您的性別(測試ListPreference)"
android:dialogTitle="ListPreference"
android:entries="@array/gender_name_list"
android:entryValues="@array/gender_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="系統功能設置組 ">
<CheckBoxPreference
android:key="autoSave"
android:title="自動保存進度"
android:summaryOn="自動保存: 開啓"
android:summaryOff="自動保存: 關閉"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
display_prefs.xml代碼
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="背景燈光組">
<!-- 通過列表框選擇燈光強度 -->
<ListPreference
android:key="light"
android:title="燈光強度"
android:summary="請選擇燈光強度(測試ListPreference)"
android:dialogTitle="請選擇燈光強度"
android:entries="@array/light_strength_list"
android:entryValues="@array/light_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="文字顯示組 ">
<!-- 通過SwitchPreference設置是否自動滾屏 -->
<SwitchPreference
android:key="autoScroll"
android:title="自動滾屏"
android:summaryOn="自動滾屏: 開啓"
android:summaryOff="自動滾屏: 關閉"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>