在Android开发过程中,有时候会遇到将上一个窗口中的值传递到下一个窗口,还有从当前窗口返回至上一层窗口的情况。而且有时候程序退出,用户希望将值保存至本地文件系统中或数据库中,基于以上需要,在这里我做一个简单实例,来完成上述功能,其中会用到菜单,按钮,文本框等组件,具体如下所示:
主界面,在文本框中输入值,点击按钮进入下一个窗体,如下所示:
/**
* 点击进入下一个窗体
* @return
*/
public boolean next(){
//新建Intent对象
Intent intent = new Intent();
//指定Intent要启动的类
intent.setClass(MainActivity.this, SubActivity.class);
/*new一个Bundle对象,并将要传递的数据传入*/
Bundle bundle = new Bundle();
//传值,该值由上面的EditText提拱
String inputStr = inputEditText.getText().toString();
if(inputStr.length() == 0){
Toast.makeText(MainActivity.this, "hello world!!!", Toast.LENGTH_SHORT).show();
return false;
}
bundle.putString("inputStr" , inputStr);//相当于session.setAttribute()
/*将Bundle对象assign给Intent*/
intent.putExtras(bundle);//传给activity
//启动一个新的activity
//startActivity(intent);
//如果下一个窗体返回时所做的处理
startActivityForResult(intent, 0);
//结束当前的Activity
//MainActivity.this.finish();
//不要在这里加上这句,否则程序返回时会异常退出。
return true;
}
下一个窗体会接收到主窗体发送过来的数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置subActivity的布局
setContentView(R.layout.main2);
intent = new Intent();
/* 取得Intent中的Bundle对象 */
bundle = this.getIntent().getExtras();
/* 取得Bundle对象中的数据 */
String inputStr = bundle.getString("inputStr");
TextView displayText = (TextView)this.findViewById(R.id.displayValue);
displayText.setText("上一个窗体传递过来的值为:\t" + inputStr);
Button returnButton = (Button) this.findViewById(R.id.returnBtn);
//触发响应事件
returnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SubActivity.this.setResult(RESULT_OK, intent);
SubActivity.this.finish();
}
});
}
3.如果用户返回至上一层的话,会将数据返回回来。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case RESULT_OK:
//取来自于SubActivity中的数据,并显示于画面上
Bundle bundle = data.getExtras();
String inputStr = bundle.getString("inputStr");
inputEditText.setText(inputStr);
break;
default:
break;
}
}
4.保存退出功能。
//保存数据,并同时退出该activity或程序
Button saveExitBtn = (Button)this.findViewById(R.id.backSaveButton);
saveExitBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/** 在这里添加退出时保存数据的代码 **/
//取得活动的preferences对象
SharedPreferences uiState = getPreferences(0);
//取得编辑对象
SharedPreferences.Editor editor = uiState.edit();
//添加值
editor.putString("inputStr", inputEditText.getText().toString());
//保存提交
editor.commit();
//退出
MainActivity.this.finish();
}
});
5.进入系统,即可加载之前保存的数据,如下所示:
inputEditText = (EditText)this.findViewById(R.id.editText2);
//刚开始装载数据
SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);
//取得值
String inputStr = settings.getString("inputStr", "");
//赋于值给指定控件
inputEditText.setText(inputStr);
6.菜单的使用
方式一
创建菜单,重写onCreateOptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
布局文件
菜单点击的响应事件,重写onOptionsSelected.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//得到menuItem的ID项
int item_id = item.getItemId();
switch(item_id){
case R.id.about:
break;
case R.id.next:
//下一个窗体
next();
break;
case R.id.action_settings:
break;
}
return super.onOptionsItemSelected(item);
}
方式二
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//为menu增加内容
menu.add(0, 0 , 0 , R.string.ok);
menu.add(0, 1 , 1 , R.string.back);
return true;
}
点击响应事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int item_id = item.getItemId();
switch (item_id) {
case 0:
//启动提示框
Toast.makeText(SubActivity.this, item.getTitle(), 3000).show();
break;
case 1:
Intent intent = new Intent();
intent.setClass(SubActivity.this, MainActivity.class);
startActivity(intent);
SubActivity.this.finish();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
截图如下: