《》Activity的配置
所谓的Activity的配置,在Manifest.xml文件中对文件中定义的Activity类进行一下声明:
<activity
android:name=".SampleActivity"
android:icon="@drawable/pic.png"
android:label="@string/briefdescribe"
android:exported="true"
android:launchMode="singleInstance">
</activity>
其中:
name:指定该Activity的实现类的类名
icon:指定该Activity的标题栏中使用的图标
label:指定该Activity的标题栏中使用的描述文字
exported:指定该Activity是否能够被其他的应用调用
launchMode:指定当前Activity的加载模式(已经讲过了,可查阅)
此外配置Activity还有对Intent的配置(这一部分在将Intent的时候在讲解),
有对Activity的属性设置的总结
下面举几个:
android:alwaysRetainTaskState
是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态
android:clearTaskOnLanunch
比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P, 是否显示 Q
android:finishOnTaskLaunch
是否关闭已打开的activity当用户重新启动这个任务的时候
android:permission
《》Activity显示时的屏幕设置
1、锁定屏幕方向:横屏/ 竖屏
Android 内置了方向感应器的支持。Android 会根据所处的方向自动在竖屏和横屏间切换。但是有时我们的应用程序仅能在横屏/ 竖屏时运行,比如某些游戏,此时我们需要锁定该Activity 运行时的屏幕方向,<activity>节点的android:screenOrientation属性可以完成该项任务,示例代码如下:
【方法一】在清单文件中配置:
<activity android:name=".EX01"
android:label="@string/app_name"
android:screenOrientation="portrait">
// 值为portrait时强制为竖屏, 值为landscape时强制为横屏
</activity>
【方法二】通过代码实现(一般放在onCreate方法中的前面),如下:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATTION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATTION_PORTRAIT);
这里提一个小知识,Android模拟器中,快捷键"Ctrl+F11/F12"可以实现转屏
2、全屏显示:
可以在其onCreate()方法中添加如下代码实现:
//设置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//去除标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
3、以对话框形式显示Activity:
在清单文件中配置:
<activity
android:name="com.example.smyh004activity02.SecondActivity"
android:label="SecondActivity"
android:theme="@android:style/Theme.DeviceDefault.Dialog">
</activity>
《》启动和关闭Activity
调用startActivity(Intent intent):启动其他的Activity实例
调用finish():结束当前的Activity实例
下面举一个实例:
StartActivity的布局文件中只有一个按钮,当点击时,就会打开SecondActivity
public class StartActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_start);
Button bn = (Button)findViewById(R.id.button);
bn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(StartActivity.this, SecondActivity.class) ;
//或者是Intent intent = new Intent() ;
// intent.setClass(StartActivity.this, SecondActivity.class) ;
startActivity(intent) ;
}
});
}
SecondActvity的布局文件中有两个按钮,一个是用来启动StartActivity的,另一个按钮是启动StartActivity的同时将SecondeActivity关闭
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button previous = (Button)findViewById(R.id.button1);
Button close = (Button) findViewById(R.id.button2) ;
final Intent intent = new Intent(SecondActivity.this,StartActivity.class);
previous.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
startActivity(intent) ;
}
});
close.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
startActivity(intent) ;
finish();
}
});
}
}
《》使用Intent和Bundle在Activity之间传递数据
1、前面已经介绍过,Bundle是一个相当于Map的类,我们可以用这个类的实例来装载一些数据显而易见,之后我们可以将Bundle封装在Intent中,通过Intent 在启动另一个Activity的同时,将数据传送给它;在Intent的成员方法中有很多方法 用来封装数据:
putExtras(Bundle data):向Intent中放入需要“携带的数据包”
Bundle getExtras():取出Intent中所携带的数据包
putExtra(String name , XXX value) : 直接向Intent中按key_value的方式存入数据
getXXXExtra(String name ):将数据取出
注意:后面的两种方法表面上是将数据直接存放进了Intent中了,但是实际上,Intent会自动的隐含的创建一个Bundle对象之后,在将数据存进Bundle,所以通过直接的方式存入数据,我们照样可以调用Intent的getExtras来获得其中的Bundle对象的
前面已经介绍过用Bundle可以将基本的数据类型的数据封装进去,而且也能够将对象封装进去(只要是对象可序列化即可,这非常的简单,查看前面的笔记);
2、这样一来我们就能够通过使用startActivity(Intent intent)启动另一个Activity的同时将数据传给这个Activity了
3、在启动的Activity中调用getIntent()方法就能够返回一个Intent 对象,这个Intent对象就是传过来的Intent对象,之后我们就能够调用Intent的get方法获得存在其中的数据
举例:
说明:在BundleActivity的布局文件中,我们做的是一个用户注册界面:有用户名输入框、密码输入框、性别RadioButton按钮、和一个提交按钮,当我们点击提交按钮的时候会打开另一个ResultActivity界面,同时将这些信心通过Bundle传给ResultActivity,这个界面布局文件中有几个TextView,用来显示BundleActivity传过来的Bundle数据
Person.java 文件,我们将BundleActivity界面中填好的信息用Person对象存储
public class Person implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String pass;
private String gender;
public Person()
{
}
/**
* @param name
* @param pass
* @param gender
*/
public Person(String name, String pass, String gender)
{
this.name = name;
this.pass = pass;
this.gender = gender;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPass()
{
return pass;
}
public void setPass(String pass)
{
this.pass = pass;
}
public String getGender()
{
return gender;
}
public void setGender(String gender)
{
this.gender = gender;
}
}
BundleActivity.java文件
public class BundleTest 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(BundleTest.this,
ResultActivity.class);
intent.putExtras(data);
// 启动intent对应的Activity
startActivity(intent);
}
});
}
}
ResultActivity.java 文件
public class ResultActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
TextView name = (TextView) findViewById(R.id.name);
TextView passwd = (TextView) findViewById(R.id.passwd);
TextView gender = (TextView) findViewById(R.id.gender);
// 获取启动该Result的Intent
Intent intent = getIntent();
// 直接通过Intent取出它所携带的Bundle数据包中的数据
Person p = (Person) intent.getSerializableExtra("person");
name.setText("您的用户名为:" + p.getName());
passwd.setText("您的密码为:" + p.getPass());
gender.setText("您的性别为:" + p.getGender());
}
}
《》启动其他的Activity并返回结果
使用这种方法的步骤如下:
1、当前的Activity重写onActivityResult(int requestCode , int resultCode , Intent) ,当被启动的Activity返回结果的时候,该方法将会被触发,其中的requestCode 和resultCode都是根据业务自行设置的
2、当前的Activity通过调用starActivityForResult(Intent intent , int requestCode)启动新的Activity
3、被启动的新的Activity需要调用setResult(int resultCode , Intent intent )方法设置将要返回个旧Activity的结果,(将数据封装在Intent中 ),一但调用这个方法,就会回调 1 、中的onActivityResult(int requestCode , int resultCode , Intent)方法,其中参数Intent 和 resultCode 就是setResult(int resultCode , Intent intent )中的实参 , requestCode就是 2 、 中starActivityForResult(Intent intent , int requestCode)中的requestCode实参
举例:
这个例子非常的简单,在ActivityForResult的布局文件中只有一个按钮(“选择您所在的城市”)和一个文本框(用来显示选择的城市)
当我们点击上面的按钮的时候,就会启动SelectCityActivity,这个Activity用一个列表显示待选的城市,当点击一个城市的时候,就会将结果返回给ActivityForResult
代码如下:
ActivityForResult.java 文件
public class ActivityForResult 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(ActivityForResult.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.java 文件
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(0);
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]);
// 设置该SelectActivity的结果码,并设置结束之后退回的Activity
SelectCityActivity.this.setResult(0, intent);
// 结束SelectCityActivity。
SelectCityActivity.this.finish();
return false;
}
});
}
}