Android視窗傳值與儲存退出

   在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;
}

 

佈局檔案

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@ id/next"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/next"/>
<item
android:id="@ id/about"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/about"/>
<item
android:id="@ id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>

 

選單點選的響應事件,重寫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);
}

截圖如下: