1. 程式人生 > >Android--登入介面(demo)

Android--登入介面(demo)

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import com.xiaobai.cloneapp.R;
import com.xiaobai.cloneapp.utils.Base64Utils;
import com.xiaobai.cloneapp.utils.SharedPreferencesUtils;

public class LoginActivity extends Activity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener{

    //佈局內的控制元件
    private EditText et_name;
    private EditText et_password;
    private Button mLoginBtn;
    private CheckBox checkBox_password;
    private CheckBox checkBox_login;
    private ImageView iv_see_password;

    private LoadingDialog mLoadingDialog; //顯示正在載入的對話方塊

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_main);

        initViews();
        setupEvents();
        initData();
    }
    private void initData() {


        //判斷使用者第一次登陸
        if (firstLogin()) {
            checkBox_password.setChecked(false);//取消記住密碼的複選框
            checkBox_login.setChecked(false);//取消自動登入的複選框
        }
        //判斷是否記住密碼
        if (remenberPassword()) {
            checkBox_password.setChecked(true);//勾選記住密碼
            setTextNameAndPassword();//把密碼和賬號輸入到輸入框中
        } else {
            setTextName();//把使用者賬號放到輸入賬號的輸入框中
        }

        //判斷是否自動登入
        if (autoLogin()) {
            checkBox_login.setChecked(true);
            login();//去登入就可以

        }
    }

    /**
     * 把本地儲存的資料設定資料到輸入框中
     */
    public void setTextNameAndPassword() {
        et_name.setText("" + getLocalName());
        et_password.setText("" + getLocalPassword());
    }

    /**
     * 設定資料到輸入框中
     */
    public void setTextName() {
        et_name.setText("" + getLocalName());
    }


    /**
     * 獲得儲存在本地的使用者名稱
     */
    public String getLocalName() {
        //獲取SharedPreferences物件,使用自定義類的方法來獲取物件
        SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
        String name = helper.getString("name");
        return name;
    }


    /**
     * 獲得儲存在本地的密碼
     */
    public String getLocalPassword() {
        //獲取SharedPreferences物件,使用自定義類的方法來獲取物件
        SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
        String password = helper.getString("password");
        return Base64Utils.decryptBASE64(password);   //解碼一下
//       return password;   //解碼一下

    }

    /**
     * 判斷是否自動登入
     */
    private boolean autoLogin() {
        //獲取SharedPreferences物件,使用自定義類的方法來獲取物件
        SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
        boolean autoLogin = helper.getBoolean("autoLogin", false);
        return autoLogin;
    }

    /**
     * 判斷是否記住密碼
     */
    private boolean remenberPassword() {
        //獲取SharedPreferences物件,使用自定義類的方法來獲取物件
        SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
        boolean remenberPassword = helper.getBoolean("remenberPassword", false);
        return remenberPassword;
    }


    private void initViews() {
        mLoginBtn = (Button) findViewById(R.id.btn_login);
        et_name = (EditText) findViewById(R.id.et_account);
        et_password = (EditText) findViewById(R.id.et_password);
        checkBox_password = (CheckBox) findViewById(R.id.checkBox_password);
        checkBox_login = (CheckBox) findViewById(R.id.checkBox_login);
        iv_see_password = (ImageView) findViewById(R.id.iv_see_password);
    }

    private void setupEvents() {
        mLoginBtn.setOnClickListener(this);
        checkBox_password.setOnCheckedChangeListener(this);
        checkBox_login.setOnCheckedChangeListener(this);
        iv_see_password.setOnClickListener(this);

    }

    /**
     * 判斷是否是第一次登陸
     */
    private boolean firstLogin() {
        //獲取SharedPreferences物件,使用自定義類的方法來獲取物件
        SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
        boolean first = helper.getBoolean("first", true);
        if (first) {
            //建立一個ContentVa物件(自定義的)設定不是第一次登入,,並建立記住密碼和自動登入是預設不選,建立賬號和密碼為空
            helper.putValues(new SharedPreferencesUtils.ContentValue("first", false),
                    new SharedPreferencesUtils.ContentValue("remenberPassword", false),
                    new SharedPreferencesUtils.ContentValue("autoLogin", false),
                    new SharedPreferencesUtils.ContentValue("name", ""),
                    new SharedPreferencesUtils.ContentValue("password", ""));
            return true;
        }
        return false;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_login:
                loadUserName();    //無論如何儲存一下使用者名稱
                login(); //登陸
                break;
            case R.id.iv_see_password:
                setPasswordVisibility();    //改變圖片並設定輸入框的文字可見或不可見
                break;

        }
    }

    /**
     * 模擬登入情況
     * 使用者名稱twd,密碼123456,就能登入成功,否則登入失敗
     */
    private void login() {

        //先做一些基本的判斷,比如輸入的使用者命為空,密碼為空,網路不可用多大情況,都不需要去連結伺服器了,而是直接返回提示錯誤
        if (getAccount().isEmpty()){
            showToast("你輸入的賬號為空!");
            return;
        }

        if (getPassword().isEmpty()){
            showToast("你輸入的密碼為空!");
            return;
        }
        //登入一般都是請求伺服器來判斷密碼是否正確,要請求網路,要子執行緒
        showLoading();//顯示載入框
        Thread loginRunnable = new Thread() {

            @Override
            public void run() {
                super.run();
                setLoginBtnClickable(false);//點選登入後,設定登入按鈕不可點選狀態


                //睡眠3秒
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //判斷賬號和密碼
                if (getAccount().equals("twd") && getPassword().equals("123456")) {
                    showToast("登入成功");
                    loadCheckBoxState();//記錄下當前使用者記住密碼和自動登入的狀態;

                    startActivity(new Intent(LoginActivity.this, HomeActivity.class));
                    finish();//關閉頁面
                } else {
                    showToast("輸入的登入賬號或密碼不正確");
                }

                setLoginBtnClickable(true);  //這裡解放登入按鈕,設定為可以點選
                hideLoading();//隱藏載入框
            }
        };
        loginRunnable.start();


    }


    /**
     * 儲存使用者賬號
     */
    public void loadUserName() {
        if (!getAccount().equals("") || !getAccount().equals("請輸入登入賬號")) {
            SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");
            helper.putValues(new SharedPreferencesUtils.ContentValue("name", getAccount()));
        }

    }

    /**
     * 設定密碼可見和不可見的相互轉換
     */
    private void setPasswordVisibility() {
        if (iv_see_password.isSelected()) {
            iv_see_password.setSelected(false);
            //密碼不可見
            et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

        } else {
            iv_see_password.setSelected(true);
            //密碼可見
            et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
        }

    }

    /**
     * 獲取賬號
     */
    public String getAccount() {
        return et_name.getText().toString().trim();//去掉空格
    }

    /**
     * 獲取密碼
     */
    public String getPassword() {
        return et_password.getText().toString().trim();//去掉空格
    }


    /**
     * 儲存使用者選擇“記住密碼”和“自動登陸”的狀態
     */
    private void loadCheckBoxState() {
        loadCheckBoxState(checkBox_password, checkBox_login);
    }

    /**
     * 儲存按鈕的狀態值
     */
    public void loadCheckBoxState(CheckBox checkBox_password, CheckBox checkBox_login) {

        //獲取SharedPreferences物件,使用自定義類的方法來獲取物件
        SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

        //如果設定自動登入
        if (checkBox_login.isChecked()) {
            //建立記住密碼和自動登入是都選擇,儲存密碼資料
            helper.putValues(
                    new SharedPreferencesUtils.ContentValue("remenberPassword", true),
                    new SharedPreferencesUtils.ContentValue("autoLogin", true),
                    new SharedPreferencesUtils.ContentValue("password", Base64Utils.encryptBASE64(getPassword())));

        } else if (!checkBox_password.isChecked()) { //如果沒有儲存密碼,那麼自動登入也是不選的
            //建立記住密碼和自動登入是預設不選,密碼為空
            helper.putValues(
                    new SharedPreferencesUtils.ContentValue("remenberPassword", false),
                    new SharedPreferencesUtils.ContentValue("autoLogin", false),
                    new SharedPreferencesUtils.ContentValue("password", ""));
        } else if (checkBox_password.isChecked()) {   //如果儲存密碼,沒有自動登入
            //建立記住密碼為選中和自動登入是預設不選,儲存密碼資料
            helper.putValues(
                    new SharedPreferencesUtils.ContentValue("remenberPassword", true),
                    new SharedPreferencesUtils.ContentValue("autoLogin", false),
                    new SharedPreferencesUtils.ContentValue("password", Base64Utils.encryptBASE64(getPassword())));
        }
    }

    /**
     * 是否可以點選登入按鈕
     *
     * @param clickable
     */
    public void setLoginBtnClickable(boolean clickable) {
        mLoginBtn.setClickable(clickable);
    }


    /**
     * 顯示載入的進度款
     */
    public void showLoading() {
        if (mLoadingDialog == null) {
            mLoadingDialog = new LoadingDialog(this, getString(R.string.loading), false);
        }
        mLoadingDialog.show();
    }


    /**
     * 隱藏載入的進度框
     */
    public void hideLoading() {
        if (mLoadingDialog != null) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mLoadingDialog.hide();
                }
            });

        }
    }


    /**
     * CheckBox點選時的回撥方法 ,不管是勾選還是取消勾選都會得到回撥
     *
     * @param buttonView 按鈕物件
     * @param isChecked  按鈕的狀態
     */
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (buttonView == checkBox_password) {  //記住密碼選框發生改變時
            if (!isChecked) {   //如果取消“記住密碼”,那麼同樣取消自動登陸
                checkBox_login.setChecked(false);
            }
        } else if (buttonView == checkBox_login) {   //自動登陸選框發生改變時
            if (isChecked) {   //如果選擇“自動登入”,那麼同樣選中“記住密碼”
                checkBox_password.setChecked(true);
            }
        }
    }


    /**
     * 監聽回退鍵
     */
    @Override
    public void onBackPressed() {
        if (mLoadingDialog != null) {
            if (mLoadingDialog.isShowing()) {
                mLoadingDialog.cancel();
            } else {
                finish();
            }
        } else {
            finish();
        }

    }

    /**
     * 頁面銷燬前回調的方法
     */
    protected void onDestroy() {
        if (mLoadingDialog != null) {
            mLoadingDialog.cancel();
            mLoadingDialog = null;
        }
        super.onDestroy();
    }


    public void showToast(final String msg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

    }
}

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;

import com.xiaobai.cloneapp.R;

/**
 * 主介面
 */

public class HomeActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity);

    }
}

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;

import com.xiaobai.cloneapp.R;

/**
 * 載入對話方塊
 */

public class LoadingDialog extends ProgressDialog {

    private String mMessage;

    private TextView mTitleTv;


    public LoadingDialog(Context context, String message, boolean canceledOnTouchOutside) {
        super(context, R.style.Theme_Light_LoadingDialog);
        this.mMessage = message;
        // 如果觸控式螢幕幕其它區域,可以選擇讓這個progressDialog消失或者無變化
        setCanceledOnTouchOutside(canceledOnTouchOutside);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_loading);
        mTitleTv = (TextView) findViewById(R.id.tv_loading_dialog);
        mTitleTv.setText(mMessage);
        setCancelable(false);//不可取消
    }

    public void setTitle(String message) {
        this.mMessage = message;
        mTitleTv.setText(mMessage);
    }



    /**
     * 顯示在底部
     */
    public void showButtom() {
        // WindowManager windowManager = ((Activity)
        // mContext).getWindowManager();
        // Display display = windowManager.getDefaultDisplay();
        //
        // WindowManager.LayoutParams lp = getWindow().getAttributes();
        // lp.width = (int) (display.getWidth() * 0.8);
        // getWindow().setAttributes(lp);
        // super.show();
    }

}
import java.io.IOException;

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

/**
 * 使用Base64來儲存和獲取密碼資料
 */
public class Base64Utils {


    /**
     * BASE64解密
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static String decryptBASE64(String key) {
        int decodetime = 5;//壓縮和解壓的次數,防止被簡單破解
        byte[] bt;
        key = key.trim().replace(" ", "");//去掉空格
        try {
            while (decodetime > 0) {
                bt = (new BASE64Decoder()).decodeBuffer(key);
                key = new String(bt);
                decodetime--;
            }

            return key;//如果出現亂碼可以改成: String(bt, "utf-8")或 gbk
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * BASE64加密
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(String key) {
        int decodetime = 5;//壓縮和解壓的次數,防止被簡單破解
        byte[] bt = null;
        key = key.trim().replace(" ", "");//去掉空格
        while (decodetime > 0) {
            bt = key.getBytes();
            key = (new BASE64Encoder()).encodeBuffer(bt);
            decodetime--;
        }

        return key;
    }
}
import android.content.Context;
import android.content.SharedPreferences;

/**
 * 這是一個SharePreference的根據類,使用它可以更方便的資料進行簡單儲存
 * 這裡只要知道基本呼叫方法就可以了
 * 1.通過構造方法來傳入上下文和檔名
 * 2.通過putValue方法傳入一個或多個自定義的ContentValue物件,進行資料儲存
 * 3.通過get方法來獲取資料
 * 4.通過clear方法來清除這個檔案的資料
 * 這裡沒有提供清除單個key的資料,是因為存入相同的資料會自動覆蓋,沒有必要去理會
 */
public class SharedPreferencesUtils {
    //定義一個SharePreference物件
    SharedPreferences sharedPreferences;
    //定義一個上下文物件

    //建立SharePreference物件時要上下文和儲存的模式
    //通過構造方法傳入一個上下文
    public SharedPreferencesUtils(Context context, String fileName) {
        //例項化SharePreference物件,使用的是get方法,而不是new建立
        //第一個引數是檔案的名字
        //第二個引數是儲存的模式,一般都是使用私有方式:Context.MODE_PRIVATE
        sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
    }

    /**
     * 儲存資料
     * 這裡要對儲存的資料進行判斷在儲存
     * 只能儲存簡單的幾種資料
     * 這裡使用的是自定義的ContentValue類,來進行對多個數據的處理
     */
    //建立一個內部類使用,裡面有key和value這兩個值
    public static class ContentValue {
        String key;
        Object value;

        //通過構造方法來傳入key和value
        public ContentValue(String key, Object value) {
            this.key = key;
            this.value = value;
        }
    }

    //一次可以傳入多個ContentValue物件的值
    public void putValues(ContentValue... contentValues) {
        //獲取SharePreference物件的編輯物件,才能進行資料的儲存
        SharedPreferences.Editor editor = sharedPreferences.edit();
        //資料分類和儲存
        for (ContentValue contentValue : contentValues) {
            //如果是字元型型別
            if (contentValue.value instanceof String) {
                editor.putString(contentValue.key, contentValue.value.toString()).commit();
            }
            //如果是int型別
            if (contentValue.value instanceof Integer) {
                editor.putInt(contentValue.key, Integer.parseInt(contentValue.value.toString())).commit();
            }
            //如果是Long型別
            if (contentValue.value instanceof Long) {
                editor.putLong(contentValue.key, Long.parseLong(contentValue.value.toString())).commit();
            }
            //如果是布林型別
            if (contentValue.value instanceof Boolean) {
                editor.putBoolean(contentValue.key, Boolean.parseBoolean(contentValue.value.toString())).commit();
            }

        }
    }


    //獲取資料的方法
    public String getString(String key) {
        return sharedPreferences.getString(key, null);
    }

    public boolean getBoolean(String key, Boolean b) {
        return sharedPreferences.getBoolean(key, b);
    }

    public int getInt(String key) {
        return sharedPreferences.getInt(key, -1);
    }

    public long getLong(String key) {
        return sharedPreferences.getLong(key, -1);
    }

    //清除當前檔案的所有的資料
    public void clear() {
        sharedPreferences.edit().clear().commit();
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    tools:context="com.xiaobai.cloneapp.activity.LoginActivity"
    android:orientation="vertical">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:src="@drawable/loginbg"
        />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height_normal"
        android:layout_marginLeft="@dimen/margin_large"
        android:layout_marginRight="@dimen/margin_large"
        android:layout_marginTop="@dimen/dp_30">

        <ImageView
            android:id="@+id/img_account"
            android:layout_width="@dimen/dp_19"
            android:layout_height="@dimen/dp_20"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="@dimen/margin_tiny"
            android:layout_marginLeft="@dimen/margin_tiny"
            android:scaleType="fitXY"
            android:src="@drawable/icon_login_account"/>

        <EditText
            android:id="@+id/et_account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_gravity="center"
            android:layout_marginBottom="@dimen/margin_tiny"
            android:layout_marginLeft="@dimen/margin_normal"
            android:layout_toRightOf="@+id/img_account"
            android:background="@null"
            android:hint="@string/account"
            android:maxLines="1"
            android:textColor="@android:color/black"
            android:textColorHint="@color/tv_gray_deep"
            android:textSize="@dimen/text_size_normal"/>

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/line_height"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="@dimen/margin_normal"
            android:layout_toRightOf="@+id/img_account"
            android:background="@color/orange_light"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height_normal"
        android:layout_marginLeft="@dimen/margin_large"
        android:layout_marginRight="@dimen/margin_large">

        <ImageView
            android:id="@+id/img_pw"
            android:layout_width="@dimen/dp_18"
            android:layout_height="@dimen/dp_20"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="@dimen/margin_tiny"
            android:layout_marginLeft="@dimen/margin_tiny"
            android:scaleType="fitXY"
            android:src="@drawable/icon_login_pw"/>

        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_gravity="center"
            android:layout_marginBottom="@dimen/margin_tiny"
            android:layout_marginLeft="@dimen/margin_normal"
            android:layout_toRightOf="@+id/img_pw"
            android:background="@null"
            android:hint="@string/password"
            android:inputType="textPassword"
            android:maxLines="1"
            android:textColor="@android:color/black"
            android:textColorHint="@color/tv_gray_deep"
            android:textSize="@dimen/text_size_normal"/>
        <ImageView
            android:id="@+id/iv_see_password"
            android:layout_width="@dimen/image_height_litter"
            android:layout_height="@dimen/image_height_litter"
            android:src="@drawable/image_password_bg"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:scaleType="fitXY"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/line_height"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="@dimen/margin_normal"
            android:layout_toRightOf="@+id/img_pw"
            android:background="@color/orange_light"/>
    </RelativeLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/margin_large"
        android:layout_marginRight="@dimen/margin_large"
        android:layout_marginTop="@dimen/margin_small"
        android:paddingBottom="@dimen/margin_small"
        android:paddingTop="@dimen/margin_small"
        android:orientation="horizontal"
        android:gravity="center"
        >
        <CheckBox
            android:id="@+id/checkBox_password"
            android:padding="@dimen/dp_10"
            android:textSize="@dimen/text_size_normal"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="@string/check_password"
            android:textColor="@color/top_bar_normal_bg" android:checked="false"/>
        <CheckBox
            android:id="@+id/checkBox_login"
            android:padding="@dimen/dp_10"
            android:textSize="@dimen/text_size_normal"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="@string/check_login"
            android:textColor="@color/top_bar_normal_bg" android:checked="false"/>

    </LinearLayout>
    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/margin_large"
        android:layout_marginRight="@dimen/margin_large"
        android:layout_marginTop="@dimen/margin_huge"
        android:paddingBottom="@dimen/margin_small"
        android:paddingTop="@dimen/margin_small"
        android:text="@string/login"
        android:background="@drawable/btn_orange_selector"
        android:textColor="@android:color/white"
        android:textSize="@dimen/text_size_normal"/>

</LinearLayout>


<resources>

    <!-- ************************* 通用 ******************** -->
    <dimen name="margin_litter">2dp</dimen>
    <dimen name="margin_tiny">4dp</dimen>
    <dimen name="margin_small">8dp</dimen>
    <dimen name="margin_normal">12dp</dimen>
    <dimen name="margin_medium">20dp</dimen>
    <dimen name="margin_large">32dp</dimen>
    <dimen name="margin_huge">64dp</dimen>
    <dimen name="line_height">1dp</dimen>
    <dimen name="line_litter_height">0.5dp</dimen>

    <!-- 字型大小 -->
    <dimen name="text_size_tiny">10sp</dimen>
    <dimen name="text_size_small">12sp</dimen>
    <dimen name="text_size_normal">14dp</dimen>
    <dimen name="text_size_medium">16dp</dimen>
    <dimen name="text_size_large">18dp</dimen>
    <dimen name="text_size_most">25dp</dimen>

    <!-- item 大小 -->
    <dimen name="item_height_litter">30dp</dimen>
    <dimen name="item_height_small">40dp</dimen>
    <dimen name="item_height_normal">50dp</dimen>
    <dimen name="item_height_medium">65dp</dimen>
    <dimen name="item_height_large">100dp</dimen>
    <dimen name="item_height_most">120dp</dimen>

    <!--image的寬和高-->
    <dimen name="image_height_small">15dp</dimen>
    <dimen name="image_height_litter">20dp</dimen>
    <dimen name="image_height">30dp</dimen>
    <dimen name="image_height_large">50dp</dimen>
    <dimen name="image_height_most">100dp</dimen>
    <!-- ************************* 結束 ******************** -->

    <!-- TitleBar height -->
    <dimen name="title_bar_height">48dp</dimen>
    <dimen name="title_bar_weight">60dp</dimen>


    <!-- 適配尺寸 -->

    <dimen name="dp_0.1">0.1dp</dimen>
    <dimen name="dp_0.5">0.5dp</dimen>
    <dimen name="dp_1">1dp</dimen>
    <dimen name="dp_2">2dp</dimen>
    <dimen name="dp_2.5">2.5dp</dimen>
    <dimen name="dp_3">3dp</dimen>
    <dimen name="dp_4">4dp</dimen>
    <dimen name="dp_4_5">4.5dp</dimen>
    <dimen name="dp_5">5dp</dimen>
    <dimen name="dp_6">6dp</dimen>
    <dimen name="dp_7">7dp</dimen>
    <dimen name="dp_7.5">7.5dp</dimen>
    <dimen name="dp_8">8dp</dimen>
    <dimen name="dp_9">9dp</dimen>
    <dimen name="dp_10">10dp</dimen>
    <dimen name="dp_11">11dp</dimen>
    <dimen name="dp_12">12dp</dimen>
    <dimen name="dp_13">13dp</dimen>
    <dimen name="dp_14">14dp</dimen>
    <dimen name="dp_15">15dp</dimen>
    <dimen name="dp_16">16dp</dimen>
    <dimen name="dp_17">17dp</dimen>
    <dimen name="dp_18">18dp</dimen>
    <dimen name="dp_19">19dp</dimen>
    <dimen name="dp_20">20dp</dimen>
    <dimen name="dp_21">21dp</dimen>
    <dimen name="dp_22">22dp</dimen>
    <dimen name="dp_23">23dp</dimen>
    <dimen name="dp_24">24dp</dimen>
    <dimen name="dp_25">25dp</dimen>
    <dimen name="dp_26">26dp</dimen>
    <dimen name="dp_27">27dp</dimen>
    <dimen name="dp_28">28dp</dimen>
    <dimen name="dp_29">29dp</dimen>
    <dimen name="dp_30">30dp</dimen>
    <dimen name="dp_32">32dp</dimen>
    <dimen name="dp_33">33dp</dimen>
    <dimen name="dp_34">34dp</dimen>
    <dimen name="dp_35">35dp</dimen>
    <dimen name="dp_36">36dp</dimen>
    <dimen name="dp_38">38dp</dimen>
    <dimen name="dp_39">39dp</dimen>
    <dimen name="dp_40">40dp</dimen>
    <dimen name="dp_41">41dp</dimen>
    <dimen name="dp_42">42dp</dimen>
    <dimen name="dp_43">43dp</dimen>
    <dimen name="dp_44">44dp</dimen>
    <dimen name="dp_45">45dp</dimen>
    <dimen name="dp_46">46dp</dimen>
    <dimen name="dp_47">47dp</dimen>
    <dimen name="dp_48">48dp</dimen>
    <dimen name="dp_49">49dp</dimen>
    <dimen name="dp_50">50dp</dimen>
    <dimen name="dp_51">51dp</dimen>
    <dimen name="dp_52">52dp</dimen>
    <dimen name="dp_53">53dp</dimen>
    <dimen name="dp_54">54dp</dimen>
    <dimen name="dp_55">55dp</dimen>
    <dimen name="dp_56">56dp</dimen>
    <dimen name="dp_57">57dp</dimen>
    <dimen name="dp_58">58dp</dimen>
    <dimen name="dp_59">59dp</dimen>
    <dimen name="dp_60">60dp</dimen>
    <dimen name="dp_61">61dp</dimen>
    <dimen name="dp_62">62dp</dimen>
    <dimen name="dp_63">63dp</dimen>
    <dimen name="dp_64">64dp</dimen>
    <dimen name="dp_65">65dp</dimen>
    <dimen name="dp_66">66dp</dimen>
    <dimen name="dp_67">67dp</dimen>
    <dimen name="dp_68">68dp</dimen>
    <dimen name="dp_69">69dp</dimen>
    <dimen name="dp_70">70dp</dimen>
    <dimen name="dp_71">71dp</dimen>
    <dimen name="dp_72">72dp</dimen>
    <dimen name="dp_73">73dp</dimen>
    <dimen name="dp_74">74dp</dimen>
    <dimen name="dp_75">75dp</dimen>
    <dimen name="dp_76">76dp</dimen>
    <dimen name="dp_77">77dp</dimen>
    <dimen name="dp_78">78dp</dimen>
    <dimen name="dp_79">79dp</dimen>
    <dimen name="dp_80">80dp</dimen>
    <dimen name="dp_81">81dp</dimen>
    <dimen name="dp_82">82dp</dimen>
    <dimen name="dp_83">83dp</dimen>
    <dimen name="dp_84">84dp</dimen>
    <dimen name="dp_85">85dp</dimen>
    <dimen name="dp_86">86dp</dimen>
    <dimen name="dp_87">87dp</dimen>
    <dimen name="dp_88">88dp</dimen>
    <dimen name="dp_89">89dp</dimen>
    <dimen name="dp_90">90dp</dimen>
    <dimen name="dp_91">91dp</dimen>
    <dimen name="dp_92">92dp</dimen>
    <dimen name="dp_93">93dp</dimen>
    <dimen name="dp_94">94dp</dimen>
    <dimen name="dp_95">95dp</dimen>
    <dimen name="dp_96">96dp</dimen>
    <dimen name="dp_97">97dp</dimen>
    <dimen name="dp_98">98dp</dimen>
    <dimen name="dp_99">99dp</dimen>
    <dimen name="dp_100">100dp</dimen>
    <dimen name="dp_101">101dp</dimen>
    <dimen name="dp_104">104dp</dimen>
    <dimen name="dp_105">105dp</dimen>
    <dimen name="dp_106">106dp</dimen>
    <dimen name="dp_110">110dp</dimen>
    <dimen name="dp_111">111dp</dimen>
    <dimen name="dp_112">112dp</dimen>
    <dimen name="dp_113">113dp</dimen>
    <dimen name="dp_120">120dp</dimen>
    <dimen name="dp_123">123dp</dimen>
    <dimen name="dp_125">125dp</dimen>
    <dimen name="dp_128">128dp</dimen>
    <dimen name="dp_132">132dp</dimen>
    <dimen name="dp_134">134dp</dimen>
    <dimen name="dp_135">135dp</dimen>
    <dimen name="dp_136">136dp</dimen>
    <dimen name="dp_139">139dp</dimen>
    <dimen name="dp_140">140dp</dimen>
    <dimen name="dp_142">142dp</dimen>
    <dimen name="dp_143">143dp</dimen>
    <dimen name="dp_150">150dp</dimen>
    <dimen name="dp_155">155dp</dimen>
    <dimen name="dp_159">159dp</dimen>
    <dimen name="dp_160">160dp</dimen>
    <dimen name="dp_162">162dp</dimen>
    <dimen name="dp_165">165dp</dimen>
    <dimen name="dp_170">170dp</dimen>
    <dimen name="dp_175">175dp</dimen>
    <dimen name="dp_177">177dp</dimen>
    <dimen name="dp_179">179dp</dimen>
    <dimen name="dp_180">180dp</dimen>
    <dimen name="dp_184">184dp</dimen>
    <dimen name="dp_190">190dp</dimen>
    <dimen name="dp_194">194dp</dimen>
    <dimen name="dp_196">196dp</dimen>
    <dimen name="dp_200">200dp</dimen>
    <dimen name="dp_202">202dp</dimen>
    <dimen name="dp_210">210dp</dimen>
    <dimen name="dp_216">216dp</dimen>
    <dimen name="dp_219">219dp</dimen>
    <dimen name="dp_220">220dp</dimen>
    <dimen name="dp_225">225dp</dimen>
    <dimen name="dp_230">230dp</dimen>
    <dimen name="dp_235">235dp</dimen>
    <dimen name="dp_238">238dp</dimen>
    <dimen name="dp_240">240dp</dimen>
    <dimen name="dp_245">245dp</dimen>
    <dimen name="dp_250">250dp</dimen>
    <dimen name="dp_267">267dp</dimen>
    <dimen name="dp_270">270dp</dimen>
    <dimen name="dp_275">275dp</dimen>
    <dimen name="dp_277">277dp</dimen>
    <dimen name="dp_280">280dp</dimen>
    <dimen name="dp_285">285dp</dimen>
    <dimen name="dp_289">289dp</dimen>
    <dimen name="dp_293">293dp</dimen>
    <dimen name="dp_300">300dp</dimen>
    <dimen name="dp_301">301dp</dimen>
    <dimen name="dp_302">302dp</dimen>
    <dimen name="dp_306">306dp</dimen>
    <dimen name="dp_320">320dp</dimen>
    <dimen name="dp_325">325dp</dimen>
    <dimen name="dp_338">338dp</dimen>
    <dimen name="dp_355">355dp</dimen>
    <dimen name="dp_360">360dp</dimen>
    <dimen name="dp_365">365dp</dimen>
    <dimen name="dp_370">370dp</dimen>
    <dimen name="dp_402">402dp</dimen>
    <dimen name="dp_410">410dp</dimen>
    <dimen name="dp_422">422dp</dimen>
    <dimen name="dp_472">472dp</dimen>
    <dimen name="dp_500">500dp</dimen>
    <dimen name="dp_600">600dp</dimen>
    <dimen name="dp_640">640dp</dimen>
    <dimen name="dp_800">800dp</dimen>
    <dimen name="drawer_width">240dp</dimen>
    <dimen name="iv_width">20dp</dimen>





</resources>

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="BaseStyle" parent="@android:style/Theme.Holo.Light">
        <item name="android:windowNoTitle">true</item>
    </style>

    <!--載入對話窗-->
    <style name="BaseDialog" parent="@android:style/Theme.Dialog"/>
    <style name="Theme.Light.LoadingDialog" parent="@style/BaseDialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowSoftInputMode">adjustPan</item>
    </style>

    <!--自定義View-material的樣式-->
    <style name="TextAppearance.MaterialCalendarWidget.Header"
           parent="android:TextAppearance.DeviceDefault.Small">
        <item name="android:textStyle">bold</item>
    </style>


    <!--Item字型的基本樣式-->
    <style name="BaseItemTextStyle">
        <item name="android:textSize">@dimen/text_size_small</item>
        <item name="android:textColor">#000</item>
        <item name="android:layout_weight">2</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:gravity">center</item>
        <item name="android:background">#fff</item>
        <item name="android:singleLine">true</item>
        <item name="android:ellipsize">end</item>
    </style>




</resources>


demo下載:https://download.csdn.net/download/chaoyu168/10401014