作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
在上一講中,我已經制作了一個簡單的Android應用。項目的主要文件包括:
- MainActivity.java
- activity_main.xml
在這一講,我將拓展應用的功能,從而允許用戶輸入個人信息。
《自畫像》,凡高。凡高一生不得志,精神更是越來越差。在割掉自己的耳朵一部分后,畫家給自己留下了這幅自畫像。在當時,這幅畫依然是無人問津。
描述
我將創建一個新的Activity。這個界面允許用戶輸入本人的姓名和博客地址。這些輸入數據將在會保存起來。在主界面中再次調出數據,並顯示。相關知識點包括:
- 啟動Activity。利用Intent,啟動一個新的Activity。
- 文本輸入。增加EditText輸入欄,讓用戶輸入文本信息。
- 數據存儲。將數據存入SharedPreferences,跨Activity讀取。
創建新的項目文件
我們將在應用項目中增加新的文件。在ADT的文件導航欄中右鍵點擊文件夾,選擇New->Other后,可以得到下面的對話框:
你可以在這里選擇想要創建的新文件的類型,比如XML文件,Java文件等。安卓會根據你選擇的類型,做一些默認設置。比如選擇Android Activity后,在AndroidManifest.xml中自動注冊該Activity,從而省去用戶的麻煩。
新Activity的界面
我們要設計一個用於輸入姓名和博客地址的安卓界面。由於姓名和博客地址都是字符串類型,因此我們可以借助EditText類的View元素,來增加字符串類型的輸入欄。我們還需要提交功能。按鈕是最容易想到的方式。這里,我沒有使用按鈕,而是為一個TextView增加點擊事件監聽。
這個視圖的XML布局文件為activity_self_edit.xml,如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" >
<LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" >
<LinearLayout android:id="@+id/input1" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" />
<EditText android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="full name" />
</LinearLayout>
<LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/input1" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Blog Address" />
<EditText android:id="@+id/url" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="url" />
</LinearLayout>
</LinearLayout>
<TextView android:id="@+id/submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Submit" />
</RelativeLayout>
這里使用了RelativeLayout來布局。我們可以在該布局下,說明元素的相對位置。TextView就使用了layout_alignParentBottom屬性,來說明它的下邊緣將對齊母元素的下邊緣。此外,這里還嵌套使用了LinearLayout。
用SharedPreferences存儲數據
我們現在來為視圖編寫SelfEditActivity,以增加數據存儲功能。在提交數據后,這個Activity將通過EditText的getText()方法獲取字符輸入。提交的字符串將使用SharedPreferences存儲起來。
SharedPreferences以鍵值對(key-value pair)的方式存儲數據。在寫入時,我們需要說明數據對應的鍵。在讀取時,我們將根據鍵,來獲得對應的數據值。數據可以在整個應用范圍內調用。特定權限下,SharedPrefereces可以跨應用使用。SharedPreferences簡單易用,適合存儲少量的、結構松散的信息。
package me.vamei.vamei; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class SelfEditActivity extends Activity { private EditText nameInput; private EditText urlInput; private TextView tvSubmit; private SharedPreferences sharedPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_self_edit); // find views
tvSubmit = (TextView) findViewById(R.id.submit); nameInput = (EditText) findViewById(R.id.name); urlInput = (EditText) findViewById(R.id.url); sharedPref = this.getSharedPreferences("me.vamei.vamei", Context.MODE_PRIVATE); // submit
tvSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String name = nameInput.getText().toString(); String url = urlInput.getText().toString(); // Save to Shared Preferences
SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("name", name); editor.putString("url", url); editor.commit(); // End Current Activity
SelfEditActivity.this.finish(); } }); } }
Context對象的getSharedPreferences()獲得SharedPrerences。第一個參數"me.vamei.vamei"說明了該SharedPreferences對象所在的文件名,第二個參數說明了權限,即只能該應用范圍內私用。使用SharedPreferences.Editor類對象寫入數據時,我們調用了putString()方法,以存儲字符串類型的數據值。commit()方法將執行寫入。
最后,Activity Context的finish()方法結束當前Activity。
從一個Activity啟動另一個Activity
我現在要把MainActivity和新的SelfEditActivity用Intent串聯起來。MainActivity對應的布局為activity_main.xml,如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" >
<TextView android:id="@+id/welcome" android:layout_width="match_parent" android:layout_height="wrap_content" />
<Button android:id="@+id/author" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Edit Profile" />
</LinearLayout>
TextView用於顯示用戶信息。Button用於啟動上面定義的SelfEditActivity。
修改MainActivity。相對於上一講,這里主要增加了兩個功能。一個功能是監聽按鈕,在按鈕點擊后啟動SelfEditActivity。另一個功能是從SharedPreferences中獲得存儲的鍵值,即用戶名,再將用戶名信息更新到界面上。
package me.vamei.vamei; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private SharedPreferences sharedPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sharedPref = this.getSharedPreferences("me.vamei.vamei", Context.MODE_PRIVATE); Button btn = (Button) findViewById(R.id.author); btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, SelfEditActivity.class); MainActivity.this.startActivity(intent); } }); } @Override protected void onResume() { super.onResume(); TextView nameView = (TextView) findViewById(R.id.welcome); // retrieve content from shared preference, with key "name"
String welcome = "Welcome, " + sharedPref.getString("name", "unknown") + "!"; nameView.setText(welcome); } }
Intent構造器的第一個參數說明了Context,第二個參數顯式的說明了想要啟動的功能單元,即SelfEditActivity類。startActivity()方法將根據intent參數,創建並啟動對應的功能單元。該方法執行后,新的SelfEditActivity將壓入棧頂,成為激活的Activity,而MainActivity將暫停。
另一方面,我把數據讀取部分放入了onResume()方法。根據安卓的規定,MainActivity第一次運行,以及每次從暫停中復蘇時,都會調用該方法。用戶在SelfEditActivity修改返回后,就可以立即獲得最新的數據。使用getString()方法,從SharedPreferences對象獲得鍵位"name"的值。如果"name"鍵不存在,將返回默認值"unknown"。
onResume()
最后,用setText()方法,把新的數據加載到視圖的TextView中。
運行
在"Edit Profile"中輸入用戶信息,提交后返回主頁面,效果如下:
總結
RelativeLayout, EditText
Intent, startActivity()
getSharedPreferences(), putString, getString()
onResume()
歡迎繼續閱讀“Java快速教程”系列文章