※Context的openFileOutput/openFileInput
從data/data/com.example~~~/files資料夾裡,讀或寫其中com.example~~~是getApplicationContext().getPackageName()
※strings.xml
<resources> <string name="login_practice">登入練習</string> <string name="enter_account">請輸入帳號</string> <string name="enter_password">請輸入密碼</string> <string name="remember_account_and_password">記住帳號密碼</string> <string name="login">登錄</string> <string name="account_and_password_require">帳號密碼必須輸入</string> </resources>
※需要用到的字串,集中在這個檔案管理
※activity_main.xml
<LinearLayout 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:orientation="vertical" tools:context="com.example.bruce_java.myapplication.MainActivity"> <EditText android:id="@+id/account" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/enter_account" android:layout_marginTop="80dp"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:hint="@string/enter_password" android:layout_marginBottom="10dp"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/remember_account_and_password" android:layout_alignParentLeft="true"/> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login" android:layout_alignParentRight="true" android:onClick="login"/> </RelativeLayout> </LinearLayout>
※模擬一個登入頁面
※AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.bruce_java.myapplication20161022"> <!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>--> <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>--> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/login_practice" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivityButton"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
※注意android:label本來是@string/app_name,我改了,要對應到strings.xml
※如果需要加權限,就打開註解的部分,當然還有很多
※MainActivity.java
public class MainActivity extends AppCompatActivity {
EditText accText = null;
EditText passText = null;
CheckBox cb = null;
final String fileName = "login.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_button);
accText = (EditText) findViewById(R.id.account);
passText = (EditText) findViewById(R.id.password);
cb = (CheckBox) findViewById(R.id.cb);
Map<String, String> map = this.readAccountAndPassword();
if (!map.isEmpty()) {
accText.setText(map.get("account"));
passText.setText(map.get("password"));
cb.setChecked(true);
} else {
cb.setChecked(false);
}
}
private Map<String, String> readAccountAndPassword() {
Map<String, String> map = new HashMap<>();
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(super.getApplicationContext().openFileInput(fileName)));
map.put("account", in.readLine());
map.put("password", in.readLine());
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return map;
}
public void login(View view){
String account = accText.getText().toString().trim();
String password = passText.getText().toString().trim();
if(TextUtils.isEmpty(account) || TextUtils.isEmpty(password)){
Toast.makeText(getApplicationContext(), R.string.account_and_password_require, Toast.LENGTH_SHORT).show();
return;
} else {
if(cb.isChecked()) {
OutputStream out = null;
try {
//data/data/com.example~~~/files
out = super.getApplicationContext().openFileOutput(fileName, super.MODE_PRIVATE);
out.write((account + "\r\n" + password).getBytes());
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
Toast.makeText(getApplicationContext(), "已儲存帳號和密碼", Toast.LENGTH_SHORT).show();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
}
}
※MODE_PRIVATE會寫入檔案,如果發現已有檔案會覆蓋,
如果改成MODE_APPEND,會附加資料在最後面
※readAccountAndPassword方法是讀;login方法是寫
※SharedPreferences 讀寫XML
從data/data/com.example~~~/shared_prefs資料夾裡,讀或寫會自動加副檔名xml(不管你有沒有加xml,都會在後面多個.xml)
只有MainActivity.java和openFileOutput/openFileInput不一樣
※MainActivity.java
public class MainActivity extends AppCompatActivity {
EditText accText = null;
EditText passText = null;
CheckBox cb = null;
final String fileName = "login";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_button);
accText = (EditText) findViewById(R.id.account);
passText = (EditText) findViewById(R.id.password);
cb = (CheckBox) findViewById(R.id.cb);
Map<String, String> map = this.readAccountAndPassword();
if (map.get("account") != null && map.get("password") != null) {
accText.setText(map.get("account"));
passText.setText(map.get("password"));
cb.setChecked(true);
} else {
cb.setChecked(false);
}
}
public void login(View view){
String account = accText.getText().toString().trim();
String password = passText.getText().toString().trim();
if(TextUtils.isEmpty(account) || TextUtils.isEmpty(password)){
Toast.makeText(getApplicationContext(), R.string.account_and_password_require, Toast.LENGTH_SHORT).show();
return;
} else {
if(cb.isChecked()) {
// data/data/com.example~~~/shared_prefs/login.xml
// fileName後會自動加副檔名xml
SharedPreferences sp = super.getSharedPreferences(fileName, super.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("account", account);
editor.putString("password", password);
editor.commit();
Toast.makeText(getApplicationContext(), "已儲存帳號和密碼", Toast.LENGTH_SHORT).show();
}
}
}
private Map<String, String> readAccountAndPassword() {
Map<String, String> map = new HashMap<>();
SharedPreferences sp = super.getSharedPreferences(fileName, super.MODE_PRIVATE);
// 第二個參數是取不到時的預設值
map.put("account", sp.getString("account", null));
map.put("password", sp.getString("password", null));
return map;
}
}
※readAccountAndPassword方法是讀;login方法是寫
沒有留言:
張貼留言