android 仿微信demo————微信啟動界面實現
android 仿微信demo————注冊功能實現(移動端)
android 仿微信demo————注冊功能實現(服務端)
android 仿微信demo————登錄功能實現(移動端)
android 仿微信demo————登錄功能實現(服務端)
android 仿微信demo————微信主界面實現
android 仿微信demo————微信消息界面實現(移動端)
android 仿微信demo————微信消息界面實現(服務端)
android 仿微信demo————微信通訊錄界面功能實現(移動端,服務端)
android 仿微信demo————微信發現界面實現
android 仿微信demo————微信頂部操作欄界面實現
android 仿微信demo————微信頂部操作欄搜索按鈕實現(查詢通訊錄好友功能)
android 仿微信demo————微信頂部操作欄加號按鈕實現(彈出子菜單)
源碼獲取點我,記得給個start哦
移動端登錄功能實現
登錄功能基本和注冊一樣,唯一不同的是登錄可以實現兩種登錄方式(微信號和手機號),也就是布局不一樣。所以需要兩個布局,兩個activity(這個方法比較簡單粗暴,我懶。也可以通過activity動態切換布局,這樣只需要一個activity就可以了)
創建兩個activity,實現兩種登錄方式
微信號登錄activity
LoginUser.java
package com.example.wxchatdemo;import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.wxchatdemo.tools.IEditTextChangeListener;
import com.example.wxchatdemo.tools.WorksSizeCheckUtil;import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL
;
import java.net.URLEncoder;public class LoginUser extends AppCompatActivity {private EditText weixinNumber
;private EditText password
;private TextView phone_login
;private Button button
;private MyHander myhander
= new MyHander();@Overridepublic void onCreate(Bundle savedInstanceState
) {super.onCreate(savedInstanceState
);setContentView(R.layout
.login_user
); ActionBar actionBar
= getSupportActionBar();if (actionBar
!= null) {actionBar
.hide();}if (Build.VERSION
.SDK_INT
>= 21) {View decorView
= getWindow().getDecorView();int option
= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
; decorView
.setSystemUiVisibility(option
);getWindow().setStatusBarColor(Color.TRANSPARENT
);}initViews(); Intent intent
= getIntent();String number
= intent
.getStringExtra("weixin_number");weixinNumber
.setText(number
);if (weixinNumber
.getText() + "" == "" || password
.getText() + "" == "") {button
.setEnabled(false);} else {button
.setEnabled(true);}inputFocus(); buttonChangeColor(); phone_login
.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v
) {Intent intent
=new Intent(LoginUser.this,LoginPhone.class);startActivity(intent
);}});button
.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v
) {Intent intent
= new Intent();intent
.setClass(LoginUser.this, Loading.class);startActivity(intent
);new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(1000);httpUrlConnPost(LoginUser.this.weixinNumber
.getText() + "",password
.getText() + "");} catch (InterruptedException e
) {e
.printStackTrace();}}}).start();}});}@SuppressLint("NewApi")public void initViews() {weixinNumber
= (EditText) this.findViewById(R.id
.log_weixin_number
);password
= (EditText) this.findViewById(R.id
.log_passwd
);phone_login
= (TextView) this.findViewById(R.id
.phone_log
);button
= (Button) this.findViewById(R.id
.log_button
);}public void inputFocus() {weixinNumber
.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v
, boolean hasFocus
) {if (hasFocus
) {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver1
);imageView
.setBackgroundResource(R.color
.input_dvier_focus
);} else {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver1
);imageView
.setBackgroundResource(R.color
.input_dvier
);}}});password
.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v
, boolean hasFocus
) {if (hasFocus
) {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver2
);imageView
.setBackgroundResource(R.color
.input_dvier_focus
);} else {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver2
);imageView
.setBackgroundResource(R.color
.input_dvier
);}}});}public void buttonChangeColor() {WorksSizeCheckUtil.textChangeListener textChangeListener
= new WorksSizeCheckUtil.textChangeListener(button
);textChangeListener
.addAllEditText(weixinNumber
, password
);WorksSizeCheckUtil.setChangeListener(new IEditTextChangeListener() {@Overridepublic void textChange(boolean isHasContent
) {if (isHasContent
) {button
.setBackgroundResource(R.drawable
.login_button_focus
);button
.setTextColor(getResources().getColor(R.color
.loginButtonTextFouse
));} else {button
.setBackgroundResource(R.drawable
.login_button_shape
);button
.setTextColor(getResources().getColor(R.color
.loginButtonText
));}}});}public void httpUrlConnPost(String number
, String password
) {HttpURLConnection urlConnection
= null;URL url
;try {url
= new URL("http://100.2.178.10:8080/AndroidServer_war_exploded/Login");urlConnection
= (HttpURLConnection) url
.openConnection();urlConnection
.setConnectTimeout(3000);urlConnection
.setUseCaches(false);urlConnection
.setInstanceFollowRedirects(true);urlConnection
.setReadTimeout(3000);urlConnection
.setDoInput(true);urlConnection
.setDoOutput(true);urlConnection
.setRequestMethod("POST");urlConnection
.setRequestProperty("Content-Type","application/json;charset=UTF-8");urlConnection
.connect();JSONObject json
= new JSONObject();json
.put("number", URLEncoder.encode(number
, "UTF-8"));json
.put("password", URLEncoder.encode(password
, "UTF-8"));String jsonstr
= json
.toString();OutputStream out
= urlConnection
.getOutputStream();BufferedWriter bw
= new BufferedWriter(new OutputStreamWriter(out
));bw
.write(jsonstr
);bw
.flush();out
.close();bw
.close();Log.i("aa", urlConnection
.getResponseCode() + "");if (urlConnection
.getResponseCode() == HttpURLConnection.HTTP_OK
) {InputStream in
= urlConnection
.getInputStream();BufferedReader br
= new BufferedReader(new InputStreamReader(in
));String str
= null;StringBuffer buffer
= new StringBuffer();while ((str
= br
.readLine()) != null) {buffer
.append(str
);}in
.close();br
.close();JSONObject rjson
= new JSONObject(buffer
.toString());Log.i("aa", "rjson=" + rjson
);boolean result
= rjson
.getBoolean("json");System.out
.println("json:===" + result
);if (result
) {myhander
.sendEmptyMessage(1);Log.i("用戶:", "登錄成功");} else {myhander
.sendEmptyMessage(2);System.out
.println("222222222222222");Log.i("用戶:", "登錄失敗");}} else {myhander
.sendEmptyMessage(2);}} catch (Exception e
) {e
.printStackTrace();Log.i("aa", e
.toString());System.out
.println("11111111111111111");myhander
.sendEmptyMessage(2);} finally {urlConnection
.disconnect();}}class MyHander extends Handler {@Overridepublic void handleMessage(Message msg
) {super.handleMessage(msg
);switch (msg
.what
) {case 1:Log.i("aa", msg
.what
+ "");Toast.makeText(getApplicationContext(), "登錄成功",Toast.LENGTH_SHORT
).show();Intent intent
= new Intent();intent
.putExtra("weixin_number", weixinNumber
.getText().toString());intent
.setClass(com.example.wxchatdemo.LoginUser.this,com.example.wxchatdemo.MainWeixin.class);startActivity(intent
);com.example.wxchatdemo.LoginUser.this.finish(); break;case 2:Log.i("aa", msg
.what
+ "");new AlertDialog.Builder(com.example.wxchatdemo.LoginUser.this).setTitle(" 登錄失敗").setMessage(" 用戶名或密碼錯誤,請重新填寫").setPositiveButton("確定", null).show();break;}}}public void login_activity_back(View v
) {Intent intent
= new Intent();intent
.setClass(com.example.wxchatdemo.LoginUser.this, Welcome.class);startActivity(intent
);com.example.wxchatdemo.LoginUser.this.finish(); }
}
微信號登錄activity對應的布局文件
login_user.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/title"android:orientation="vertical"><ImageViewandroid:id="@+id/close"android:layout_width="17dp"android:layout_height="17dp"android:layout_marginLeft="20dp"android:layout_marginTop="45dp"android:onClick="login_activity_back"android:src="@drawable/backpay" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="45dp"android:text="微信號/QQ號/郵箱登錄"android:textColor="@color/loginText"android:textSize="25sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:text="賬號"android:textColor="@color/loginText"android:textSize="16sp" /><EditTextandroid:id="@+id/log_weixin_number"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_marginLeft="55dp"android:background="@null"android:hint="請填寫微信號/QQ號/郵箱"android:singleLine="true"android:textColorHint="@color/textColorHint"android:textCursorDrawable="@drawable/edit_cursor_color"android:textSize="16sp" /></LinearLayout><ImageViewandroid:id="@+id/login_diver1"android:layout_width="320dp"android:layout_height="1dp"android:layout_gravity="center_horizontal"android:layout_marginTop="17dp"android:background="@color/input_dvier" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:text="密碼"android:textColor="@color/loginText"android:textSize="16sp" /><EditTextandroid:id="@+id/log_passwd"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_marginLeft="55dp"android:password="true"android:background="@null"android:hint="請填寫密碼"android:singleLine="true"android:textColorHint="@color/textColorHint"android:textCursorDrawable="@drawable/edit_cursor_color"android:textSize="16sp" /></LinearLayout><ImageViewandroid:id="@+id/login_diver2"android:layout_width="320dp"android:layout_height="1dp"android:layout_gravity="center_horizontal"android:layout_marginTop="17dp"android:background="@color/input_dvier" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/phone_log"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="30dp"android:text="用手機號登錄"android:textColor="@color/massageLogin"android:textSize="17dp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"android:gravity="center_horizontal"><Buttonandroid:id="@+id/log_button"android:layout_width="321dp"android:layout_height="48dp"android:background="@drawable/login_button_shape"android:text="登錄"android:textColor="@color/loginButtonText"android:textSize="16sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="300dp"android:divider="@drawable/login_dvier"android:gravity="center_horizontal"android:showDividers="middle"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingHorizontal="10dp"android:text="找回密碼"android:textColor="@color/massageLogin"android:textSize="14dp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingHorizontal="10dp"android:text="緊急凍結"android:textColor="@color/massageLogin"android:textSize="14dp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingHorizontal="10dp"android:text="微信安全中心"android:textColor="@color/massageLogin"android:textSize="14dp" /></LinearLayout>
</LinearLayout>
手機號登錄activity
LoginPhone.java
package com.example.wxchatdemo;import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.wxchatdemo.tools.IEditTextChangeListener;
import com.example.wxchatdemo.tools.WorksSizeCheckUtil;import org.json.JSONObject;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL
;
import java.net.URLEncoder;public class LoginPhone extends AppCompatActivity {private EditText phone
;private EditText password
;private TextView user_login
;private Button button
;private LoginPhone.MyHander myhander
= new LoginPhone.MyHander();@Overridepublic void onCreate(Bundle savedInstanceState
) {super.onCreate(savedInstanceState
);setContentView(R.layout
.login_phone
); ActionBar actionBar
= getSupportActionBar();if (actionBar
!= null) {actionBar
.hide();}if (Build.VERSION
.SDK_INT
>= 21) {View decorView
= getWindow().getDecorView();int option
= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
; decorView
.setSystemUiVisibility(option
);getWindow().setStatusBarColor(Color.TRANSPARENT
);}initViews(); if (phone
.getText() + "" == "" || password
.getText() + "" == "") {button
.setEnabled(false);} else {button
.setEnabled(true);}inputFocus(); buttonChangeColor(); user_login
.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v
) {Intent intent
= new Intent(LoginPhone.this, LoginUser.class);startActivity(intent
);}});button
.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v
) {Intent intent
= new Intent();intent
.setClass(LoginPhone.this, Loading.class);startActivity(intent
);new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(1000);httpUrlConnPost(LoginPhone.this.phone
.getText() + "",password
.getText() + "");} catch (InterruptedException e
) {e
.printStackTrace();}}}).start();}});}@SuppressLint("NewApi")public void initViews() {phone
= (EditText) this.findViewById(R.id
.log_phone
);password
= (EditText) this.findViewById(R.id
.log_passwd
);user_login
= (TextView) this.findViewById(R.id
.user_log
);button
= (Button) this.findViewById(R.id
.log_button
);}public void inputFocus() {phone
.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v
, boolean hasFocus
) {if (hasFocus
) {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver1
);imageView
.setBackgroundResource(R.color
.input_dvier_focus
);} else {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver1
);imageView
.setBackgroundResource(R.color
.input_dvier
);}}});password
.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v
, boolean hasFocus
) {if (hasFocus
) {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver2
);imageView
.setBackgroundResource(R.color
.input_dvier_focus
);} else {ImageView imageView
= (ImageView) findViewById(R.id
.login_diver2
);imageView
.setBackgroundResource(R.color
.input_dvier
);}}});}public void buttonChangeColor() {WorksSizeCheckUtil.textChangeListener textChangeListener
= new WorksSizeCheckUtil.textChangeListener(button
);textChangeListener
.addAllEditText(phone
, password
);WorksSizeCheckUtil.setChangeListener(new IEditTextChangeListener() {@Overridepublic void textChange(boolean isHasContent
) {if (isHasContent
) {button
.setBackgroundResource(R.drawable
.login_button_focus
);button
.setTextColor(getResources().getColor(R.color
.loginButtonTextFouse
));} else {button
.setBackgroundResource(R.drawable
.login_button_shape
);button
.setTextColor(getResources().getColor(R.color
.loginButtonText
));}}});}public void httpUrlConnPost(String phone
, String password
) {HttpURLConnection urlConnection
= null;URL url
;try {url
= new URL("http://100.2.178.10:8080/AndroidServer_war_exploded/Login");urlConnection
= (HttpURLConnection) url
.openConnection();urlConnection
.setConnectTimeout(3000);urlConnection
.setUseCaches(false);urlConnection
.setInstanceFollowRedirects(true);urlConnection
.setReadTimeout(3000);urlConnection
.setDoInput(true);urlConnection
.setDoOutput(true);urlConnection
.setRequestMethod("POST");urlConnection
.setRequestProperty("Content-Type","application/json;charset=UTF-8");urlConnection
.connect();JSONObject json
= new JSONObject();json
.put("number", URLEncoder.encode(phone
, "UTF-8"));json
.put("password", URLEncoder.encode(password
, "UTF-8"));String jsonstr
= json
.toString();OutputStream out
= urlConnection
.getOutputStream();BufferedWriter bw
= new BufferedWriter(new OutputStreamWriter(out
));bw
.write(jsonstr
);bw
.flush();out
.close();bw
.close();Log.i("aa", urlConnection
.getResponseCode() + "");if (urlConnection
.getResponseCode() == HttpURLConnection.HTTP_OK
) {InputStream in
= urlConnection
.getInputStream();BufferedReader br
= new BufferedReader(new InputStreamReader(in
));String str
= null;StringBuffer buffer
= new StringBuffer();while ((str
= br
.readLine()) != null) {buffer
.append(str
);}in
.close();br
.close();JSONObject rjson
= new JSONObject(buffer
.toString());Log.i("aa", "rjson=" + rjson
);boolean result
= rjson
.getBoolean("json");System.out
.println("json:===" + result
);if (result
) {myhander
.sendEmptyMessage(1);Log.i("用戶:", "登錄成功");} else {myhander
.sendEmptyMessage(2);System.out
.println("222222222222222");Log.i("用戶:", "登錄失敗");}} else {myhander
.sendEmptyMessage(2);}} catch (Exception e
) {e
.printStackTrace();Log.i("aa", e
.toString());System.out
.println("11111111111111111");myhander
.sendEmptyMessage(2);} finally {urlConnection
.disconnect();}}class MyHander extends Handler {@Overridepublic void handleMessage(Message msg
) {super.handleMessage(msg
);switch (msg
.what
) {case 1:Log.i("aa", msg
.what
+ "");Toast.makeText(getApplicationContext(), "登錄成功",Toast.LENGTH_SHORT
).show();Intent intent
= new Intent (com.example.wxchatdemo.LoginPhone.this, com.example.wxchatdemo.MainWeixin.class);startActivity(intent
);com.example.wxchatdemo.LoginPhone.this.finish();break;case 2:Log.i("aa", msg
.what
+ "");new AlertDialog.Builder(com.example.wxchatdemo.LoginPhone.this).setTitle(" 登錄失敗").setMessage(" 用戶名或密碼錯誤,請重新填寫").setPositiveButton("確定", null).show();}}}public void login_activity_back(View v
) {Intent intent
= new Intent();intent
.setClass(com.example.wxchatdemo.LoginPhone.this, Welcome.class);startActivity(intent
);com.example.wxchatdemo.LoginPhone.this.finish(); }
}
手機號登錄activity對應的布局文件
login_phone.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/title"android:orientation="vertical"><ImageViewandroid:id="@+id/close"android:layout_width="17dp"android:layout_height="17dp"android:layout_marginLeft="20dp"android:layout_marginTop="45dp"android:onClick="login_activity_back"android:src="@drawable/backpay" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="45dp"android:text="手機號登錄"android:textColor="@color/loginText"android:textSize="25sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:text="手機號"android:textColor="@color/loginText"android:textSize="16sp" /><EditTextandroid:id="@+id/log_phone"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_marginLeft="35dp"android:background="@null"android:hint="請填寫手機號"android:singleLine="true"android:textColorHint="@color/textColorHint"android:textCursorDrawable="@drawable/edit_cursor_color"android:textSize="16sp" /></LinearLayout><ImageViewandroid:id="@+id/login_diver1"android:layout_width="320dp"android:layout_height="1dp"android:layout_gravity="center_horizontal"android:layout_marginTop="17dp"android:background="@color/input_dvier" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:text="密碼"android:textColor="@color/loginText"android:textSize="16sp" /><EditTextandroid:id="@+id/log_passwd"android:layout_width="200dp"android:layout_height="wrap_content"android:password="true"android:layout_marginLeft="55dp"android:background="@null"android:hint="請填寫密碼"android:singleLine="true"android:textColorHint="@color/textColorHint"android:textCursorDrawable="@drawable/edit_cursor_color"android:textSize="16sp" /></LinearLayout><ImageViewandroid:id="@+id/login_diver2"android:layout_width="320dp"android:layout_height="1dp"android:layout_gravity="center_horizontal"android:layout_marginTop="17dp"android:background="@color/input_dvier" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/user_log"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="30dp"android:text="用微信號/QQ號/郵箱登錄"android:textColor="@color/massageLogin"android:textSize="17dp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"android:gravity="center_horizontal"><Buttonandroid:id="@+id/log_button"android:layout_width="321dp"android:layout_height="48dp"android:background="@drawable/login_button_shape"android:text="登錄"android:textColor="@color/loginButtonText"android:textSize="16sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="150dp"android:divider="@drawable/login_dvier"android:gravity="center_horizontal"android:showDividers="middle"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingHorizontal="10dp"android:text="找回密碼"android:textColor="@color/massageLogin"android:textSize="14dp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingHorizontal="10dp"android:text="緊急凍結"android:textColor="@color/massageLogin"android:textSize="14dp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingHorizontal="10dp"android:text="微信安全中心"android:textColor="@color/massageLogin"android:textSize="14dp" /></LinearLayout>
</LinearLayout>
創建一個shapre文件login_dvier.xml,自定義豎直分割線
login_dvier.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" ><solid android:color="@color/login_dvier" /><size android:height="1dp"></size><size android:width="1dp"></size>
</shape>
上面兩個登錄activity都實現了一個自定義的等待框activity,當點擊登錄按鈕時,便會跳轉到這個activity,但是自定義的activity會覆蓋原有的界面。而微信點擊登錄按鈕后會彈出一個等待框且不會覆蓋原有的activity(即原有界面),所以要給自定義的等待框activity在Androidfest.xml文件配置為對話框,這樣就不會覆蓋原有activity.
創建activity Loading.java ,實現自定義等待框
Loading.java
package com.example.wxchatdemo;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;public class Loading extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState
) {super.onCreate(savedInstanceState
);setContentView(R.layout
.loading
); new Handler().postDelayed(new Runnable() {@Overridepublic void run() {Loading.this.finish();}}, 1000);}
}
創建 activity Loading.java對應的布局文件loading.xml
loading.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="180dp"android:layout_height="180dp"android:layout_centerInParent="true"android:background="@drawable/loading_bg"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:orientation="vertical"><ProgressBarandroid:id="@+id/progressBar1"style="?android:attr/progressBarStyleLarge"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="正在登錄"android:textColor="#fff"android:textSize="20sp" /></LinearLayout></RelativeLayout></RelativeLayout>
在AndroidMainfest.xml文件中配置自定義等待框activity Loading.java 為對話框
<activityandroid:name=".Loading"android:theme="@style/MyDialogStyle" />
上面用到的主題theme是自定義的主題,把activity轉化為對話框,這樣就不會覆蓋原有的activity,下面會給出如何定義自定義主題
創建樣式styles.xml文件,實現自定義主題
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><style name="MyDialogStyle"><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:windowIsTranslucent">true</item><item name="android:windowContentOverlay">@null</item><item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item><item name="android:backgroundDimEnabled">true</item></style>
</resources>
在colors.xml聲明用到的顏色
colors.xml
<color name="massageLogin">#5A6A8B
</color><color name="login_dvier">#BEBEBE
</color>
在AndroidMainfest.xml文件中聲明創建的activity
測試
雖然服務端登錄表單處理功能還沒寫,但是還是可以測試上面的效果
把以往文章中點擊登陸按鈕注釋代碼取消注釋
把兩個activity登錄成功后跳轉activity那段代碼段注釋掉,啟動項目測試
總結
以上是生活随笔為你收集整理的android 仿微信demo————登录功能实现(移动端)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。