【助手APP】登陸

來源:互聯網
上載者:User

標籤:登陸   android   抖動   下列表   sharedpreferences   

延續大學時做課程設計的思路,首先就是登陸650) this.width=650;" src="http://img.baidu.com/hi/jx2/j_0007.gif" alt="j_0007.gif" />


當然,在登陸之前還是有其他介面的,比如第一次登陸時會有歡迎導航介面,,啟動應用時會顯示logo介面。下一篇再介紹。


logo介面結束之後會進入登陸介面,當然,前提是沒有自動登陸的使用者(有自動登陸的使用者,是跳過登陸介面,直接進入主介面的)。


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/4D/B2/wKioL1RXdIjhj-j0AADgE4Y-gmQ915.jpg" title="捕獲.PNG" alt="wKioL1RXdIjhj-j0AADgE4Y-gmQ915.jpg" />


登陸介面由兩個輸入框,兩個可選按鈕,兩個按鈕組成。介面雖然簡單,但是費了很大的勁處理,簡單羅列如下:

在輸入框的左邊顯示一個頭像,右邊是一個一鍵清空的小叉叉;

輸入學號時會自動匹配已登入過的使用者,如果登入時勾選了記住密碼時,選擇了使用者後會自動填滿密碼;

當使用者名稱或密碼為空白時點擊登入按鈕,為空白的輸入框會抖動,並會有紅色字型提示為空白;

勾選自動登陸後,下次開啟應用就會直接以該使用者的賬戶自動登陸,而不會顯示登陸介面。


首先是,帶有頭像和叉叉的輸入框

代碼如下:

public class ClearEditText extends EditText implements          OnFocusChangeListener, TextWatcher { /** * 刪除按鈕的引用 */    private Drawable mClearDrawable;     /**     * 控制項是否有焦點     */    private boolean hasFoucs;     public ClearEditText(Context context) {     this(context, null);     }      public ClearEditText(Context context, AttributeSet attrs) {     //這裡構造方法也很重要,不加這個很多屬性不能再XML裡面定義    this(context, attrs, android.R.attr.editTextStyle);     }         public ClearEditText(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }            private void init() {     //擷取EditText的DrawableRight,假如沒有設定我們就使用預設的圖片    mClearDrawable = getCompoundDrawables()[2];         if (mClearDrawable == null) { //        throw new NullPointerException("You can add drawableRight attribute in XML");        mClearDrawable = getResources().getDrawable(R.drawable.delete_selector);         }                 mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());         //預設設定隱藏表徵圖        setClearIconVisible(false);         //設定焦點改變的監聽        setOnFocusChangeListener(this);         //設定輸入框裡面內容發生改變的監聽        addTextChangedListener(this);     }       /**     * 因為我們不能直接給EditText設定點擊事件,所以我們用記住我們按下的位置來類比點擊事件     * 當我們按下的位置 在  EditText的寬度 - 表徵圖到控制項右邊的間距 - 表徵圖的寬度  和     * EditText的寬度 - 表徵圖到控制項右邊的間距之間我們就算點擊了表徵圖,豎直方向就沒有考慮     */    @Override public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {if (getCompoundDrawables()[2] != null) {boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())&& (event.getX() < ((getWidth() - getPaddingRight())));if (touchable) {this.setText("");}}}return super.onTouchEvent(event);}     /**     * 當ClearEditText焦點發生變化的時候,判斷裡面字串長度設定清除表徵圖的顯示與隱藏     */    @Override     public void onFocusChange(View v, boolean hasFocus) {     this.hasFoucs = hasFocus;        if (hasFocus) {             setClearIconVisible(getText().length() > 0);         } else {             setClearIconVisible(false);         }     }       /**     * 設定清除表徵圖的顯示與隱藏,調用setCompoundDrawables為EditText繪製上去     * @param visible     */    protected void setClearIconVisible(boolean visible) {         Drawable right = visible ? mClearDrawable : null;         setCompoundDrawables(getCompoundDrawables()[0],                 getCompoundDrawables()[1], right, getCompoundDrawables()[3]);     }              /**     * 當輸入框裡面內容發生變化的時候回調的方法     */    @Override     public void onTextChanged(CharSequence s, int start, int count,             int after) {             if(hasFoucs){            setClearIconVisible(s.length() > 0);            }    }      @Override     public void beforeTextChanged(CharSequence s, int start, int count,             int after) {              }      @Override     public void afterTextChanged(Editable s) {              }            /**     * 設定晃動動畫     */    public void setShakeAnimation(){    this.setAnimation(shakeAnimation(5));    }            /**     * 晃動動畫     * @param counts 1秒鐘晃動多少下     * @return     */    public static Animation shakeAnimation(int counts){    Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);    translateAnimation.setInterpolator(new CycleInterpolator(counts));    translateAnimation.setDuration(1000);    return translateAnimation;    }  }

在定義輸入框時:

        <cn.edu.wit.withelper.util.ClearEditText            android:id="@+id/userid"            android:layout_weight="1"            android:layout_width="0dip"            android:layout_height="wrap_content"            android:background="@drawable/et_userid_border"            android:drawableLeft="@drawable/users_selector"            android:drawableRight="@drawable/delete_selector"            android:hint="請輸入您的學號"            android:inputType="number"            android:focusableInTouchMode="true"            android:padding="3dp"            android:singleLine="true"            android:textSize="25sp" />

抖動的動畫也在上面定義了,

下面就介紹下拉式清單,

ib_spinner = (ImageButton) findViewById(R.id.ib_spinner);//一個圖片,覆蓋到輸入框的右端ib_spinner.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 彈出下拉式清單ListView listView = new ListView(getApplicationContext());listView.setCacheColorHint(0x00000000);// 滑動時 不變色listView.setVerticalScrollBarEnabled(false);listView.setBackgroundColor(getResources().getColor(R.color.white));//設定透明度listView.getBackground().setAlpha(230);listView.setAdapter(new MyAdapter());pop = new PopupWindow(listView, etUserId.getWidth()+ib_spinner.getWidth(),LayoutParams.WRAP_CONTENT, true);// pop隱藏pop.setBackgroundDrawable(new ColorDrawable(0x00000000));pop.setOutsideTouchable(true);pop.setFocusable(true);//pop.setAnimationStyle(R.style.PopupAnimation);pop.showAsDropDown(etUserId, 0, -8);pop.update();}});



接下來就是,記住密碼與自動登陸了

if (1 == isAuto) {//自動登入則存入資料庫,且寫到設定檔SharedPreferencesUtil.saveLoginUser(LoginActivity.this, user);userInfoServices.insertUserInfo(user);}else if (1 == isRemember) {//記住密碼就寫入資料庫userInfoServices.insertUserInfo(user);}

登陸成功後,就根據使用者的選擇,對資料進行處理


然後就是,如何?登陸

public static UserInfo login(UserInfo loginUser) {String URL = "http://www.******.com/API/Android/Login";final Map<String, String> params = new HashMap<String, String>();params.put("userID", loginUser.getUserId());params.put("password", loginUser.getPassword());JSONObject jsonResult = InterfaceUtil.getJSONObject(URL, params);if (jsonResult == null) {Log.i(TAG, "result = null");return loginUser;} else {Log.i(TAG, "result = " + jsonResult.toString());return getUserByJson(jsonResult, loginUser);}}
public static JSONObject getJSONObject(String url, // 請求的URLMap<String, String> params // 請求的參數序列) {long timestamp = new Date().getTime();//時間戳記params.put("timestamp", "" + timestamp);//signparams.put("sign", MD5Util.getMD5String(SALT + timestamp));String result = postRequestToServer(url, params);if (null == result) {Log.i(TAG, "result = null");return null;}else {Log.i(TAG, "result = " + result);JSONTokener jsonTokener = new JSONTokener(result);JSONObject json = null;try {json = (JSONObject) jsonTokener.nextValue();} catch (JSONException e) {e.printStackTrace();} finally {return json;}}//end of else}

這裡就涉及到對網路的訪問,對json的解析,以及對資料的封裝

public static String postRequestToServer(String url, // 請求的URLMap<String, String> params // 請求的參數序列) {Log.i(TAG, "訪問網路");HttpEntityEnclosingRequestBase httpRequest = new HttpPost(url);List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(params.size());for (Map.Entry<String, String> entry : params.entrySet()) {// 構建表單欄位內容nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}String strResult = "";try {httpRequest.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));HttpClient client = new DefaultHttpClient();HttpParams httpparams = client.getParams();HttpConnectionParams.setConnectionTimeout(httpparams,7000);HttpConnectionParams.setSoTimeout(httpparams,7000);// 執行請求HttpResponse httpResponse = client.execute(httpRequest);// 判斷返回結果,200則說明正確返回if (httpResponse.getStatusLine().getStatusCode() == 200) {// 從返回的結果中擷取內容strResult = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");} else {strResult = null;}} catch (Exception e) {e.printStackTrace();Message msg = new Message();msg.what = Task.ERROR_NETEXCEPTION ;msg.obj = e;MainService.handler.sendMessage(msg);strResult = null;} finally {return strResult;}}

本應用中,所有的網路訪問都是通過這個函數實現的


還有一個擷取網狀圖片的函數,在本應用中沒有使用,是準備用來擷取帳戶圖片的

/** * 通過url擷取圖片 * @param url * @return */public static Drawable getNetImage(URL url) {if (null == url)return null;try {HttpURLConnection connection = (HttpURLConnection) url.openConnection();return Drawable.createFromStream(connection.getInputStream(),"image");} catch (IOException e) {e.printStackTrace();}return null;}

還有一個就是對SharedPreferences的操作;

/** * 儲存登入使用者資訊 * @param context * @param user */public static void saveLoginUser(Context context, UserInfo user) {SharedPreferences sp = context.getSharedPreferences(LOGIN_USER, Context.MODE_PRIVATE);Editor editor = sp.edit();editor.putString(UserInfo.USERID, user.getUserId());editor.putString(UserInfo.SESSIONID, user.getSessionId());editor.putString(UserInfo.USERNAME, user.getUserName());editor.commit();}/** * 擷取登入使用者資訊 * @param context * @return */public static UserInfo getLoginUser(Context context) {SharedPreferences sp = context.getSharedPreferences(LOGIN_USER, Context.MODE_PRIVATE);String userId = sp.getString(UserInfo.USERID, "");String session = sp.getString(UserInfo.SESSIONID, "");String userName = sp.getString(UserInfo.USERNAME, "");if ("".equals(userId))return null;UserInfo user = new UserInfo();user.setUserId(userId);user.setSessionId(session);user.setUserName(userName);return user;}



登陸差不多就這麼些東西,現在看來有很多東西都太low了,但還是原汁原味地展示出來。明天把項目的源碼上傳到github上,有時間就修改一下,希望有興趣,或者有心賜教的大神多多指點。

ps:自動擷取標籤太爛了

本文出自 “年少的風” 部落格,謝絕轉載!

【助手APP】登陸

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.