參考:
https://blog.csdn.net/qinjuning/article/details/6710003
https://www.jianshu.com/p/4a65f4a912c6
Activity的直接子類與間接子類主要有:
- ListActivity
- LauncherActivity
- ExpandableListActivity
- PerferenceActivity
- AliasActivity
ListActivity
ListActivity可以理解爲是ListView和Activity的結合。主要用來顯示列表數據。顯示數據需要設置適配器。Adapter常用的有ArrayAdapter,SimpleAdapter和CursorAdapter。
ListActivity的使用步驟:
- 繼承自ListActivity,如:xxx extends ListActivity
- 重寫onCreate方法,在該方法中,需要做三件事情:
a)準備數據源
b)設置適配器
c)綁定適配器 - 重寫點擊事件void onListItemClick(ListView l, View v, int position, long id)
代碼實現
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1.數據源
String[] data = {"老師","學生","課桌","書本","鉛筆","橡皮","粉筆","黑板","凳子","掃帚","簸箕","爐子","窗花","講臺","教鞭","小紅花","花瓶"};
//2.適配器
@SuppressWarnings("unchecked")
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
//3.綁定
setListAdapter(arrayAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(MainActivity.this,"點中了第"+id+"個",Toast.LENGTH_LONG).show();
}
LauncherActivity
LauncherActivity繼承了ListView,所以還是一個ListActivity,則需要爲它設置Adapter-----可以時非常簡單的數組適配器arrayAdapter,可以使用SimpleAdapter,還可以自己創建Adapter–>BaseAdapter。特別需要注意的是它沒有setContentView()
代碼實現:
public class MainActivity extends LauncherActivity {
String[] name = {"設置程序","查看列表"};
Class<?>[] clazzs = {SettingActivity.class, ExpandableActivity.class};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,name);
setListAdapter(adapter);
}
@Override
protected Intent intentForPosition(int position) {
return new Intent(MainActivity.this, clazzs[position]);
}
}
ExpandableListActivity:可展開的列表
代碼實現:
activity_main.xml
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ExpandableListView
android:layout_width="match_parent"
android:id="@id/android:list"
android:layout_height="match_parent">
</ExpandableListView>
</LinearLayout>
Java代碼:
public class MainActivity extends ExpandableListActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Map<String,String>> list = new ArrayList<Map<String,String>>();//組名
Map<String,String> map1 = new HashMap<String,String>();
map1.put("group", "國家");
Map<String,String> map2 = new HashMap<String,String>();
map2.put("group", "語言");
list.add(map1);
list.add(map2);
List<Map<String,String>> listChild1 = new ArrayList<Map<String,String>>();//child
Map<String,String> map3 = new HashMap<String,String>();
map3.put("country", "中國");
listChild1.add(map3);
Map<String,String> map4 = new HashMap<String,String>();
map4.put("country", "美國");
listChild1.add(map4);
List<Map<String,String>> listChild2 = new ArrayList<Map<String,String>>();//child
Map<String,String> map5 = new HashMap<String,String>();
map5.put("country", "漢語");
listChild2.add(map5);
Map<String,String> map6 = new HashMap<String,String>();
map6.put("country", "英語");
listChild2.add(map6);
List<List<Map<String,String>>> childs = new ArrayList<List<Map<String,String>>>();//將兩個child加入的集合中
childs.add(listChild1);
childs.add(listChild2);
SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(this, list, R.layout.group, new String[]{"group"},
new int[]{R.id.tv_group}, childs, R.layout.child, new String[]{"country"}, new int[]{R.id.tv_child});
setListAdapter(adapter);//適配器
}
PerferenceActivity
有時需要實現一個設置界面,這樣的界面自己實現起來略顯繁瑣,好在Android中已經實現了這樣的設置界面,那就是PreferenceActivity。並且PreferenceActivity還有一個莫大的好處,配置信息會自動使用SharedPreferences進行保存,無需我們自己實現。
preference-headers根標籤相當於一個列表,header標籤相當於每個Item。可以指定跳轉的fragment和指定的intent,可以向fragment中傳數據
常用方法
getKey()-------------------setKey()
getSummary()---------------setSummary()
getText()------------------setText()
PreferenceFragment中常用節點介紹:
-
PreferenceCategory:用於分組。
-
EditTextPreference:輸入文本框 。
getEditText() 返回的是我們在該控件中輸入的文本框值 getText() 返回的是我們之前sharedPreferen文件保存的值
-
ListPreference: 列表框。
getEntries():返回的是控件顯示文本的一個”key”數組,對應於屬性android:entries getEntryValues():返回的一個”value”數組 getEntry():返回當前選擇文本 getValue() :返回當前選中文本選中的value 。
-
Preference:文本框。
-
CheckBoxPreference:單選框。
-
RingtonePreference:設置鈴聲
方法:
android:showDefault :默認鈴聲,可以使用系統或者自定義的鈴聲
android:showSilent :指定鈴聲是否爲靜音。
android:ringtoneType:響鈴的鈴聲類型,主要有:ringtone(音樂)、notification(通
知)、alarm(鬧鈴)、all(所有可用聲 音類型)。 -
SwitchPreference:開關按鈕
-
MultiSelectListPreference:多選框
PreferenceCategory屬性:
- key:唯一標識(至少在同一程序中是唯一),SharedPreferences也將通過此Key值進行數據保存,也可以通過key值獲取保存的信息。
- title:顯示標題(大字體顯示)
- summary:副標題(小字體顯示)
- defaultValue:默認值
- dependency:附屬,即標識此元素附屬於某一個元素(通常爲CheckBoxPreference),dependency值爲所附屬元素的key。當CheckPreference值爲true時,Preference則爲可用,否則爲不可用。
- dialogTitle:彈出對話框的標題
- entries:列表中顯示的值。爲一個數組,通常通過資源文件進行設置。
- entryValues:列表中實際保存的值,與entries對應。
- persistent:表示Preference元素所對應的值是否寫入sharedPreferen文件中,如果是true,則表示寫
監聽事件
-
觸發:當Preference控件被點擊時,觸發該方法。
public booleanonPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
參數說明: preference 點擊的對象。
返回值:true代表點擊事件已成功捕捉,無須執行默認動作或者返回上層調用鏈。 例如,不跳轉至默認Intent。false 代表執行默認動作並且返回上層調用鏈。例如,跳轉至默認Intent。 -
觸發:當Preference的元素值發送改變時,觸發該事件。
boolean onPreferenceChange(Preference preference,Object objValue)
返回值:true 代表將新值寫入sharedPreference文件中。
false 則不將新值寫入sharedPreference文件 -
觸發:當點擊控件時觸發發生,可以做相應操作。
public booleanonPreferenceClick(Preference preference)
監聽事件之間的關係:
- 先調用onPreferenceClick()方法,如果該方法返回true,則不再調用onPreferenceTreeClick方法 ;如果onPreferenceClick方法返回false,則繼續調用onPreferenceTreeClick方法。
- onPreferenceChange的方法獨立與其他兩種方法的運行。也就是說,它總是會運行。
補充:點擊某個Preference控件後,會先回調onPreferenceChange()方法,即是否保存值,然後再回調onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我們得到的控件值就是最新的Preference控件值。
代碼實現:
1,佈局文件
preference_headers.xml
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.example.administrator.demo.PreferenceActivity$Prefs1Fragment"
android:icon="@drawable/aaaaa"
android:summary="設置應用的相關選項"
android:title="程序選項設置">
</header>
<header
android:fragment="com.example.administrator.demo.PreferenceActivity$Prefs2Fragment"
android:icon="@drawable/aaaaa"
android:summary="設置界面的相關選項設置界面的相關選項設置界面的相關選項設置界面的相關選項設置界面的相關選項設置界面的相關選項"
android:title="界面選項設置">
<extra
android:name="website"
android:value="www.baidu.com"/>
</header>
<header
android:icon="@drawable/aaaaa"
android:title="使用Intent"
android:summary="使用Intent啓動某個Activity"
>
<intent android:action="android.intent.action.VIEW"
android:data="http://www.baidu.com"/>
</header>
</preference-headers>
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="詳細設置"
android:summary="說明摘要"
android:key="screenlist">
<RingtonePreference
android:key="ring_key"
android:ringtoneType="ringtone"
android:showDefault="true"
android:defaultValue="0"
android:summary="選擇鈴聲"
android:title="設置鈴聲">
</RingtonePreference>
<PreferenceCategory android:title="個人信息設置組">
<EditTextPreference
android:dialogTitle="您所使用的用戶名爲:"
android:key="name"
android:summary="填寫你的用戶名"
android:title="填寫用戶名">
</EditTextPreference>
<ListPreference
android:dialogTitle="請選擇性別"
android:entries="@array/gender_name_list"
android:entryValues="@array/gender_name_list"
android:key="gender"
android:selectable="true"
android:enabled="true"
android:defaultValue="男"
android:summary="選擇你的性別"
android:title="性別">
</ListPreference>
</PreferenceCategory>
<PreferenceCategory android:title="系統功能設置組">
<CheckBoxPreference
android:defaultValue="true"
android:key="autoSave"
android:summaryOff="自動保存:關閉"
android:summaryOn="自動保存:開啓"
android:title="自動保存進度">
</CheckBoxPreference>
</PreferenceCategory>
<SwitchPreference
android:key="autoScroll"
android:title="自動滾屏"
android:summaryOn="自動滾屏:開啓"
android:summaryOff="自動滾屏:關閉"
android:defaultValue="true"
>
</SwitchPreference>
<MultiSelectListPreference
android:key="multi"
android:title="多選科目"
android:summary="選擇多個喜歡的科目"
android:defaultValue="false"
android:entries="@array/light_name_list"
android:entryValues="@array/light_value_list"
/>
<Preference
android:key="pf1"
android:title="打開鏈接"
android:summary="pf111111"
>
<intent android:data="www.baidu.com"
android:action="android.intent.action.VIEW"
/>
</Preference>
<Preference
android:key="getValue"
android:title="獲取傳入值"
android:summary="pf22222222"
>
<extra
android:name="name"
android:value="value"/>
</Preference>
<Preference
android:key="pf3"
android:title="pf3"
android:summary="pf333333"
/>
</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:dialogTitle="請選擇燈光強度"
android:key="light"
android:summary="請選擇燈光強度(測試)"
android:title="燈光強度"
android:entries="@array/light_name_list"
android:entryValues="@array/light_value_list"
>
</ListPreference>
</PreferenceCategory>
<PreferenceCategory android:title="文字顯示組">
<SwitchPreference
android:key="autoScroll"
android:title="自動滾屏"
android:summaryOn="自動滾屏:開啓"
android:summaryOff="自動滾屏:關閉"
android:defaultValue="true"
>
</SwitchPreference>
</PreferenceCategory>
</PreferenceScreen>
2,Java代碼
public class PreferenceActivity extends android.preference.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);
}
@Override
protected boolean isValidFragment(String fragmentName) {
return true;
}
public static class Prefs1Fragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener {
private RingtonePreference ringtonePreference;
private EditTextPreference editTextPreference;
private ListPreference listPreference;
private CheckBoxPreference checkBoxPreference;
private SwitchPreference switchPreference;
private Preference preference;
private MultiSelectListPreference multiSelectListPreference;
private SharedPreferences sharedPref;
private Set<String> stringSet;
private Iterator<String> iterator;
private SharedPreferences pm;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
ringtonePreference = (RingtonePreference) findPreference("ring_key");
if (!ringtonePreference.getShowDefault()){
ringtonePreference.setShowDefault(true);
}
ringtonePreference.setOnPreferenceChangeListener(this);
editTextPreference = (EditTextPreference) findPreference("name");
editTextPreference.setOnPreferenceChangeListener(this);
listPreference = (ListPreference) findPreference("gender");
listPreference.setOnPreferenceChangeListener(this);
preference = findPreference("pf1");
preference.setOnPreferenceChangeListener(this);
multiSelectListPreference = (MultiSelectListPreference) findPreference("multi");
multiSelectListPreference.setOnPreferenceChangeListener(this);
sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
sharedPref.registerOnSharedPreferenceChangeListener(listener);
}
//創建一個OnSharedPreferenceChangeListener實例,並實現方法邏輯
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference preference = findPreference(key);
preference.setSummary(sharedPreferences.getString(key, "111"));
}
};
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
pm = PreferenceManager.getDefaultSharedPreferences(getActivity());
switch (preference.getKey()) {
case "ring_key":
Log.i("#####","ring_key1 "+pm.getString("ring_key","默認鈴聲"));
Log.i("#####","ring_key2 "+ringtonePreference.getShowDefault());
break;
case "name":
Log.i("#####","name1 "+(CharSequence) editTextPreference.getEditText());
Log.i("#####","name2 "+editTextPreference.getText());
Log.i("#####","name3 "+pm.getString("name","11111111111111111"));
editTextPreference.setSummary((CharSequence) editTextPreference.getEditText());
break;
case "gender":
// stringSet = sharedPref.getStringSet("gender", null);
// iterator = stringSet.iterator();
// StringBuffer buffer = new StringBuffer();
// while (iterator.hasNext()){
// buffer.append(iterator.next());
// }
// listPreference.setSummary(buffer);
Log.i("#####","gender1 "+listPreference.getValue());
Log.i("#####","gender2 "+listPreference.getEntry());
Log.i("#####","gender3 "+pm.getString("gender","222222222222222222222222"));
Log.i("#####","gender4 "+pm.getAll());
break;
case "pf1":
// preference.setSummary(sharedPref.getString("pf1",null));
break;
case "multi":
stringSet = pm.getStringSet("multS", null);
iterator = stringSet.iterator();
StringBuffer buffer2 = new StringBuffer();
while (iterator.hasNext()){
buffer2.append(iterator.next());
}
// multiSelectListPreference.setSummary(buffer2);
Log.i("#####","multS1 "+buffer2);
Log.i("#####","multS2 "+pm.getString("","3333333333333333333333333"));
Log.i("#####","multS3 "+pm.getAll());
break;
}
return true;
}
}
public static class Prefs2Fragment extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.display_prefs);
String websits = getArguments().getString("website");
Toast.makeText(getActivity(), "域名是:" + websits, Toast.LENGTH_SHORT).show();
}
}
}