標籤:android style blog http java color
布局:
線性布局+相對布局
日誌列印:
利用LogCat和System.out.println列印觀察。
Onclick事件是採用過的第四種:
在設定檔中給Button添加點擊時間
涉及知識:
通過上線文context獲得檔案的路徑和緩衝路徑,儲存檔案
布局代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.loginUI.MainActivity" tools:ignore="MergeRootFrame" android:orientation="vertical"> <TextView android:id="@+id/tv_plInputName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/plInputName" /> <EditText android:id="@+id/et_userName" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="textPersonName" > <requestFocus /> </EditText> <TextView android:id="@+id/tv_plInputPassword" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/plInputPassword" /> <EditText android:id="@+id/et_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="textPassword"/> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <CheckBox android:checked="true" android:id="@+id/cb_rmPassword" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rmPassword" /> <Button android:onClick="login" android:id="@+id/btn_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="35dp" android:text="@string/login" /> </RelativeLayout> </LinearLayout>
View Code
MainActivity代碼:
package com.example.loginUI;import java.util.Map;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;import com.example.service.LoginService;public class MainActivity extends ActionBarActivity { //日誌記錄Tag private String TAG = "MainActivity"; /** 使用者名稱 */ private EditText etUserName; /** 密碼 */ private EditText etPassword; /** 登陸按鈕 */ private Button btnLogin; /** 記住密碼按鈕 */ private CheckBox cbx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲得控制項 etUserName = (EditText)findViewById(R.id.et_userName); etPassword = (EditText)findViewById(R.id.et_password); btnLogin = (Button)findViewById(R.id.btn_login); cbx = (CheckBox)findViewById(R.id.cb_rmPassword); Map<String, String> result = (new LoginService().getUserNameAndPassword(this)); if (null != result ) { etUserName.setText(result.get("userName")); etPassword.setText(result.get("password")); } } public void login(View view) { //日誌列印 Log.i(TAG, "開始登陸驗證"); String userName = etUserName.getText().toString(); String password = etPassword.getText().toString(); //非空判斷給出多士提示 if (TextUtils.equals(userName.trim(), "") || TextUtils.equals(password.trim(), "")) { Toast.makeText(this, "使用者名稱/密碼不可為空", Toast.LENGTH_SHORT).show(); return ; } //是否儲存密碼 if (cbx.isChecked()) { //new LoginService().saveUserNameAndPassword(userName, password); new LoginService().saveUserNameAndPassword(this, userName, password); } if("zz".equals(userName) && "11".equals(password)) { Toast.makeText(this, "登陸成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "登陸失敗", Toast.LENGTH_SHORT).show(); } Log.i(TAG, "登陸驗證完成"); }}View Code
儲存資料以及讀資料的代碼:
package com.example.service;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStreamReader;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.Context;import android.util.Log;public class LoginService { private String TAG = "loginService"; /** * 儲存使用者名稱密碼, 這樣的方式不靈活, 如果我們改了工程的包名的話, 這裡就變成了我們的工程往另一工程寫資料了, 這是不允許的 * @param userName * @param password * @return */ public boolean saveUserNameAndPassword(String userName, String password) { Log.i(TAG, "開始儲存使用者名稱密碼"); File file = new File("/data/data/com.example.loginUI/info.txt"); FileOutputStream outputStream; try { outputStream = new FileOutputStream(file); outputStream.write((userName+"#"+password).getBytes()); outputStream.close(); } catch (Exception e) { Log.e(TAG, "儲存使用者名稱密碼出現異常"); return false; } return true; } /** * 儲存使用者名稱密碼, 通過上下文動態改變檔案路徑 * @param context * @param userName * @param password * @return */ public boolean saveUserNameAndPassword(Context context, String userName, String password) { Log.i(TAG, "開始儲存使用者名稱密碼"); File file = new File(context.getFilesDir(), "info.txt"); // == File file = new File("/data/data/com.example.loginUI/files/info.txt"); //File file = new File(context.getCacheDir(), "info.txt"); // /data/data/com.example.loginUI/cache/info.txt 放進緩衝,不要放太大的東西 FileOutputStream outputStream; try { outputStream = new FileOutputStream(file); outputStream.write((userName+"#"+password).getBytes()); outputStream.close(); } catch (Exception e) { Log.e(TAG, "儲存使用者名稱密碼出現異常"); return false; } return true; } public Map<String, String> getUserNameAndPassword(Context context) { Map<String, String> result = new HashMap<String, String>(); File file = new File(context.getFilesDir(), "info.txt"); FileInputStream fis; try { fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String[] lists = br.readLine().split("#"); Log.i(TAG, "要儲存的使用者名稱="+lists[0]+": 密碼="+lists[1]); result.put("userName", lists[0]); result.put("password", lists[1]); } catch (Exception e) { e.printStackTrace(); } return result; } } View Code