参考:
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();
}
}
}