
实例:用LauncherActivity开发启动Activity的列表
LauncherActivity继承了ListActivity,因此它本质上也是一个开发列表界面的Activity,但它开发出来的列表界面与普通列表界面有所不同。它开发出来的列表界面中的每个列表项都对应于一个Intent,因此当用户单击不同的列表项时,应用程序会自动启动对应的Activity。
使用LauncherActivity的方法并不难,由于依然是一个ListActivity,因此同样需要为它设置Adapter——既可使用简单的ArrayAdapter,也可以使用SimpleAdapter,当然还可以扩展BaseAdapter来实现自己的Adapter。与使用普通ListActivity不同的是,继承LauncherActivity时通常应该重写Intent intentForPosition(int position)方法,该方法根据不同列表项返回不同的Intent(用于启动不同的Activity)。
public class MainActivity extends LauncherActivity {
// 定义两个Activity的名称
String[] names = { "设置程序参数", "查看星际兵种" };
// 定义两个Activity对应的实现类
Class<?>[] clazzs = { PreferenceActivityTest.class, ExpandableListActivityTest.class };
@Override
protected 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]);
}
}
实例:使用ExpandableListActivity实现可展开的Activity
ExpandableListActivity的用法与ExpandableListView的用法基本相似,只要为该Activity传入一个ExpandableListAdapter对象即可,接下来ExpandableListActivity将会生成一个显示可展开列表的窗口。
public class ExpandableListActivityTest extends ExpandableListActivity {
@Override
protected 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,
ViewGroup.LayoutParams.WRAP_CONTENT);
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是一个非常有用的基类,当我们开发一个android应用程序时,不可避免地需要进行选项设置,这些设置会以参数的形式保存,习惯上我们会用Preference进行保存。
需要指出的是,如果android应用程序中包含中包含的某个Activity专门用于设置选项参数,那么android为这种Activity提供了便捷的基类:PreferenceActivity。
一旦Activity继承了PreferenceActivity,那么该Activity完全不需要自己控制Preferences的读写,PreferenceActivity会为我们处理一切。
PreferenceActivity与普通Activity不同,它不再使用普通的界面布局文件,而是使用选项设置的布局文件。选项设置的布局文件以PreferenceActivity作为根元素——它表明定义一个参数设置的界面。
为了创建一个PreferenceActivity,需要先创建一个对应的界面布局文件。从android3.0开始,android不再推荐直接让PreferenceActivity加载选项设置的布局文件,而是建议将PreferenceActivity与PreferenceFragment结合使用,启用PreferenceActivity只负责加载选项设置列表的布局文件,PreferenceFragment才负责加载选项设置的布局文件。
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) {
super.onBuildHeaders(target);
loadHeadersFromResource(R.xml.preference_headers, target);
}
// 重写该方法,验证各PreferenceFragment是否有效
@Override
protected boolean isValidFragment(String fragmentName) {
// return super.isValidFragment(fragmentName);
return true;
}
// 定义完参数设置的界面文件之后,接下来在PreferenceFragment程序中使用该界面布局
// 文件进行参数设置、保存十分简单,只要如下两步即可。
// 1.让Fragment继承PreferenceFragment
// 2.在onCreate(Bundle savedInstanceState)方法中调用addPreferencesFr
// omResource(..)方法加载指定的界面布局文件
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();
}
}
}
代码下载:
appcompat_v7:http://pan.baidu.com/s/1hqCnYF6
OtherActivity: