天天看點

Android周末 第二周-Bmob實作Android登入注冊修改密碼

Android周末 第二周-Bmob實作Android登入注冊和實作Vue圖書管理增删改查

    • 1.Android 登入注冊修改密碼
      • 1.demo核心代碼
        • 1.新增賬號
        • 2.登入賬号
        • 3.修改密碼
      • 2.全部代碼
        • 第一步,添加Bmob依賴
        • 第二步,添權重限和相關配置
        • application初始化
        • Person實體類
        • activity_main.xml代碼
        • input_layout.xml
        • layout_progress.xml
        • title_layout.xml
        • 圓形圖檔CircleImageView
        • MainActivity代碼
        • activity_main2.xml代碼
        • MainActivity2代碼
        • activity_main3.xml
        • MainActivity3
        • activity_main4.xml
        • MainActivity4
      • 3.免費demo源碼

因為官方開發文檔更新,本文僅供參考,實際開發用例以官方為準

1.Android 登入注冊修改密碼

Bmob詳細介紹和使用方法 傳送門

1.demo核心代碼

1.新增賬號

BmobQuery<BmobUser> categoryBmobQuery = new BmobQuery<>();
                categoryBmobQuery.addWhereEqualTo("username", mEditText.getText().toString());
                categoryBmobQuery.findObjects(new FindListener<BmobUser>() {
                    @Override
                    public void done(List<BmobUser> object, BmobException e) {
                        if (e == null) {

                            if (object.size()!=0){
                                // 點選按鈕 代表登入成功
                                Toast.makeText(MainActivity2.this, "注冊失敗,賬号已存在"+object.size(), Toast.LENGTH_SHORT).show();
                            }else {
                                BmobUser user =new BmobUser();
                                user.setUsername(mEditText.getText().toString());
                                user.setPassword(mEditText2.getText().toString());
                                user.signUp(new SaveListener<BmobUser>() {
                                    @Override
                                    public void done(BmobUser user, BmobException e) {
                                        if(e==null)
                                        {
                                            Toast.makeText(MainActivity2.this, "注冊成功!", Toast.LENGTH_SHORT).show();

                                            finish();
                                        }else
                                        {
                                            Log.e("注冊失敗", "原因: ",e );
                                        }

                                    }
                                });

                            }
                        }
                    }
                });
           

運作,賬号已存在

Android周末 第二周-Bmob實作Android登入注冊修改密碼

注冊成功

Android周末 第二周-Bmob實作Android登入注冊修改密碼

2.登入賬号

//要延時的程式 
                String strUsername = mEditText.getText().toString();
                String strPassword = mEditText2.getText().toString();
                //擷取使用者輸入的賬号和密碼

                BmobUser userlogin=new BmobUser();
                userlogin.setUsername(strUsername);
                userlogin.setPassword(strPassword);
                userlogin.login(new SaveListener<BmobUser>() {
                    @Override
                    public void done(BmobUser bmobUser, BmobException e) {
                        if(e==null){
                            // 點選按鈕 代表登入成功


                            Intent intent=new Intent(MainActivity.this,MainActivity3.class);
                            intent.putExtra("key",mEditText.getText().toString());
                            startActivity(intent);

                            finish();
                            Toast.makeText(MainActivity.this,"登入成功",Toast.LENGTH_SHORT).show();
                        }else {
                            recovery();
                            Toast.makeText(MainActivity.this,"賬号或密碼錯誤!",Toast.LENGTH_SHORT).show();
                            Log.e("登入失敗", "原因: ", e);
                        }
                    }
                });
           

運作,登入失敗

Android周末 第二周-Bmob實作Android登入注冊修改密碼

登入成功

Android周末 第二周-Bmob實作Android登入注冊修改密碼

3.修改密碼

//新密碼
                String newPwd = mEditText2.getText().toString();
                //舊密碼
                String oldPwd = mEditText.getText().toString();
                BmobUser.updateCurrentUserPassword(oldPwd, newPwd, new UpdateListener() {
                    @Override
                    public void done(BmobException e) {
                        if (e == null) {
                            Toast.makeText(MainActivity4.this, "修改成功", Toast.LENGTH_LONG).show();
                            finish();
                        } else {
                            Toast.makeText(MainActivity4.this, "修改失敗:" + e.getMessage(),Toast.LENGTH_LONG).show();
                        }
                    }
                });
           

運作,修改成功

Android周末 第二周-Bmob實作Android登入注冊修改密碼

再次登入

Android周末 第二周-Bmob實作Android登入注冊修改密碼

2.全部代碼

第一步,添加Bmob依賴

//bmob所需依賴
    implementation 'cn.bmob.android:bmob-sdk:3.7.8'
    implementation "io.reactivex.rxjava2:rxjava:2.2.20"
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.squareup.okhttp3:okhttp:3.14.1'
    implementation 'com.squareup.okio:okio:2.2.2'
    implementation 'com.google.code.gson:gson:2.8.5'
           

第二步,添權重限和相關配置

Android周末 第二周-Bmob實作Android登入注冊修改密碼

權限

<!-- 允許聯網 -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 擷取GSM(2g)、WCDMA(聯通3g)等網絡狀态的資訊 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 擷取wifi網絡狀态的資訊 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的,用于檔案上傳和下載下傳 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 擷取sd卡寫的權限,用于檔案上傳和下載下傳 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允許讀取手機狀态 用于建立BmobInstallation -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
           

允許http請求

application初始化

Myapplication

public class Myapplication  extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //提供以下兩種方式進行初始化操作:

        //第一:預設初始化
        Bmob.initialize(this, "179b1e34569243c3379fee764060ef0c");
        // 注:自v3.5.2開始,資料sdk内部縫合了統計sdk,開發者無需額外內建,傳管道參數即可,不傳預設沒開啟資料統計功能
        //Bmob.initialize(this, "Your Application ID","bmob");

        //第二:自v3.4.7版本開始,設定BmobConfig,允許設定請求逾時時間、檔案分片上傳時每片的大小、檔案的過期時間(機關為秒),
        //BmobConfig config =new BmobConfig.Builder(this)
        設定appkey
        //.setApplicationId("Your Application ID")
        請求逾時時間(機關為秒):預設15s
        //.setConnectTimeout(30)
        檔案分片上傳時每片的大小(機關位元組),預設512*1024
        //.setUploadBlockSize(1024*1024)
        檔案的過期時間(機關為秒):預設1800s
        //.setFileExpiration(2500)
        //.build();
        //Bmob.initialize(config);
    }
}

           

Person實體類

public class Person extends BmobObject {
    private String name;
    private String address;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}
           

activity_main.xml代碼

登入主界面

<RelativeLayout 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:background="#7adfb8"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity" >

    <include
        android:id="@+id/main_title"
        layout="@layout/title_layout" />

    <LinearLayout
        android:layout_marginTop="40dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/main_title"
        android:orientation="vertical" >

        <com.hnucm18jr.myapplication.CircleImageView
            android:layout_width="55dip"
            android:layout_height="55dip"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/head" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:gravity="center"
            android:text="登入界面"

            android:textColor="#ffffff"
            android:textSize="36sp" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="歡迎使用"
            android:textColor="#ffffff"
            android:textSize="16sp" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" >

        <include
            android:id="@+id/input_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            layout="@layout/input_layout" />

        <include
            android:id="@+id/layout_progress"
            android:layout_width="match_parent"
            android:layout_height="130dip"
            layout="@layout/layout_progress"
            android:visibility="gone" />

        <TextView
            android:id="@+id/main_btn_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/input_layout"
            android:layout_centerInParent="true"
            android:layout_marginTop="15dip"
            android:background="@drawable/text_bg"
            android:gravity="center"
            android:paddingBottom="2dip"
            android:paddingLeft="15dip"
            android:paddingRight="15dip"
            android:paddingTop="2dip"
            android:text="登入"
            android:textColor="#ffffff"
            android:textSize="20sp" />
    </RelativeLayout>

</RelativeLayout>
           

input_layout.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="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dip"
        android:background="@drawable/radius_drawable_bg"
        android:orientation="vertical"
        android:padding="10dip" >

        <LinearLayout
            android:id="@+id/input_layout_name"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/user" />

            <EditText
                android:id="@+id/user"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="賬号"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:layout_marginBottom="5dip"
            android:layout_marginTop="5dip"
            android:background="#eeeeee" />

        <LinearLayout
            android:id="@+id/input_layout_psw"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/key" />

            <EditText
                android:id="@+id/key"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="密碼"
                android:inputType="textPassword"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
           

layout_progress.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="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="20dip"
        android:background="@drawable/rotate_layout_bg"
        android:orientation="vertical"
        android:padding="10dip" >

        <ProgressBar
            android:id="@+id/progressBar2"
            android:layout_width="wrap_content"
            android:layout_margin="10dip"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>
           

title_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dip"
    android:gravity="center_vertical"
    android:padding="10dip" >


    <TextView
        android:id="@+id/zhuce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:textSize="20sp"
        android:text="注冊"
        />
</RelativeLayout>
           

圓形圖檔CircleImageView

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

import androidx.annotation.Nullable;

public class CircleImageView extends androidx.appcompat.widget.AppCompatImageView {

    //畫筆
    private Paint mPaint;
    //圓形圖檔的半徑
    private int mRadius;
    //圖檔的宿放比例
    private float mScale;

    public CircleImageView(Context context) {
        super(context);
    }

    public CircleImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CircleImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //由于是圓形,寬高應保持一緻
        int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius = size / 2;
        setMeasuredDimension(size, size);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {

        mPaint = new Paint();

        Drawable drawable = getDrawable();

        if (null != drawable) {
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

            //初始化BitmapShader,傳入bitmap對象
            BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            //計算縮放比例
            mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());

            Matrix matrix = new Matrix();
            matrix.setScale(mScale, mScale);
            bitmapShader.setLocalMatrix(matrix);
            mPaint.setShader(bitmapShader);
            //畫圓形,指定好坐标,半徑,畫筆
            canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
        } else {
            super.onDraw(canvas);
        }
    }

}



           

MainActivity代碼

public class MainActivity extends Activity implements View.OnClickListener {

    private TextView mBtnLogin,mTextView;

    private View progress;

    private View mInputLayout;

    private float mWidth, mHeight;

    private LinearLayout mName, mPsw;

    EditText mEditText,mEditText2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= 21){
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }


        setContentView(R.layout.activity_main);


        initView();
        mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,MainActivity2.class);
                startActivity(intent);


            }
        });
    }

    private void initView() {
        mBtnLogin = (TextView) findViewById(R.id.main_btn_login);
        progress = findViewById(R.id.layout_progress);
        mInputLayout = findViewById(R.id.input_layout);
        mName = (LinearLayout) findViewById(R.id.input_layout_name);
        mPsw = (LinearLayout) findViewById(R.id.input_layout_psw);
        mTextView=findViewById(R.id.zhuce);
        mBtnLogin.setOnClickListener(this);
        mEditText=findViewById(R.id.user);
        mEditText2=findViewById(R.id.key);
    }

    @Override
    public void onClick(View v) {

        // 計算出控件的高與寬
        mWidth = mBtnLogin.getMeasuredWidth();
        mHeight = mBtnLogin.getMeasuredHeight();
        // 隐藏輸入框
        mName.setVisibility(View.INVISIBLE);
        mPsw.setVisibility(View.INVISIBLE);

        inputAnimator(mInputLayout, mWidth, mHeight);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //要延時的程式 
                String strUsername = mEditText.getText().toString();
                String strPassword = mEditText2.getText().toString();
                //擷取使用者輸入的賬号和密碼

                BmobUser userlogin=new BmobUser();
                userlogin.setUsername(strUsername);
                userlogin.setPassword(strPassword);
                userlogin.login(new SaveListener<BmobUser>() {
                    @Override
                    public void done(BmobUser bmobUser, BmobException e) {
                        if(e==null){
                            // 點選按鈕 代表登入成功


                            Intent intent=new Intent(MainActivity.this,MainActivity3.class);
                            intent.putExtra("key",mEditText.getText().toString());
                            startActivity(intent);

                            finish();
                            Toast.makeText(MainActivity.this,"登入成功",Toast.LENGTH_SHORT).show();
                        }else {
                            recovery();
                            Toast.makeText(MainActivity.this,"賬号或密碼錯誤!",Toast.LENGTH_SHORT).show();
                            Log.e("登入失敗", "原因: ", e);
                        }
                    }
                });

            }
        },3000); //8000為毫秒機關
    }

    /**
     * 輸入框的動畫效果
     *
     * @param view
     *            控件
     * @param w
     *            寬
     * @param h
     *            高
     */
    private void inputAnimator(final View view, float w, float h) {

        AnimatorSet set = new AnimatorSet();

        ValueAnimator animator = ValueAnimator.ofFloat(0, w);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (Float) animation.getAnimatedValue();
                ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view
                        .getLayoutParams();
                params.leftMargin = (int) value;
                params.rightMargin = (int) value;
                view.setLayoutParams(params);
            }
        });

        ObjectAnimator animator2 = ObjectAnimator.ofFloat(mInputLayout,
                "scaleX", 1f, 0.5f);
        set.setDuration(1000);
        set.setInterpolator(new AccelerateDecelerateInterpolator());
        set.playTogether(animator, animator2);
        set.start();
        set.addListener(new Animator.AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                /**
                 * 動畫結束後,先顯示加載的動畫,然後再隐藏輸入框
                 */
                progress.setVisibility(View.VISIBLE);
                progressAnimator(progress);
                mInputLayout.setVisibility(View.INVISIBLE);

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }
        });

    }

    /**
     * 出現進度動畫
     *
     * @param view
     */
    private void progressAnimator(final View view) {
        PropertyValuesHolder animator = PropertyValuesHolder.ofFloat("scaleX",
                0.5f, 1f);
        PropertyValuesHolder animator2 = PropertyValuesHolder.ofFloat("scaleY",
                0.5f, 1f);
        ObjectAnimator animator3 = ObjectAnimator.ofPropertyValuesHolder(view,
                animator, animator2);
        animator3.setDuration(1000);
        animator3.setInterpolator(new JellyInterpolator());
        animator3.start();

    }
    public class JellyInterpolator extends LinearInterpolator {
        private float factor;

        public JellyInterpolator() {
            this.factor = 0.15f;
        }

        @Override
        public float getInterpolation(float input) {
            return (float) (Math.pow(2, -10 * input)
                    * Math.sin((input - factor / 4) * (2 * Math.PI) / factor) + 1);
        }
    }
    /**
     * 恢複初始狀态
     */
    private void recovery() {
        progress.setVisibility(View.GONE);
        mInputLayout.setVisibility(View.VISIBLE);
        mName.setVisibility(View.VISIBLE);
        mPsw.setVisibility(View.VISIBLE);

        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mInputLayout.getLayoutParams();
        params.leftMargin = 0;
        params.rightMargin = 0;
        mInputLayout.setLayoutParams(params);


        ObjectAnimator animator2 = ObjectAnimator.ofFloat(mInputLayout, "scaleX", 0.5f,1f );
        animator2.setDuration(500);
        animator2.setInterpolator(new AccelerateDecelerateInterpolator());
        animator2.start();
    }
}
           

activity_main2.xml代碼

注冊主界面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="#7adfb8"
    android:fitsSystemWindows="true"
    android:layout_height="match_parent"
    tools:context=".MainActivity2">
    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="15dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginLeft="15dp"
        android:src="@drawable/fanhu" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="40dp"

        android:text="注冊界面"
        android:textColor="#ffffff"
        android:textSize="36sp"
        app:layout_constraintBottom_toTopOf="@+id/linearLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout

        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dip"
        android:background="@drawable/radius_drawable_bg"
        android:orientation="vertical"
        android:padding="10dip"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.32999998"
        tools:layout_editor_absoluteX="20dp">

        <LinearLayout
            android:id="@+id/input_layout_name"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/user" />

            <EditText
                android:id="@+id/user"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="賬号"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:layout_marginTop="5dip"
            android:layout_marginBottom="5dip"
            android:background="#eeeeee" />

        <LinearLayout
            android:id="@+id/input_layout_psw"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/key" />

            <EditText
                android:id="@+id/key"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="密碼"
                android:inputType="textPassword"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>
    </LinearLayout>

    <TextView
        android:id="@+id/main_btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/input_layout"
        android:layout_centerInParent="true"
        android:background="@drawable/text_bg"
        android:gravity="center"
        android:paddingLeft="15dip"
        android:paddingTop="2dip"
        android:paddingRight="15dip"
        android:paddingBottom="2dip"
        android:text="确定"
        android:textColor="#ffffff"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
           

MainActivity2代碼

public class MainActivity2 extends AppCompatActivity {

    EditText mEditText,mEditText2;
    TextView mTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= 21){
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }

        setContentView(R.layout.activity_main2);
        mEditText=findViewById(R.id.user);
        mEditText2=findViewById(R.id.key);

        mTextView=findViewById(R.id.main_btn_login);
        mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                BmobQuery<BmobUser> categoryBmobQuery = new BmobQuery<>();
                categoryBmobQuery.addWhereEqualTo("username", mEditText.getText().toString());
                categoryBmobQuery.findObjects(new FindListener<BmobUser>() {
                    @Override
                    public void done(List<BmobUser> object, BmobException e) {
                        if (e == null) {

                            if (object.size()!=0){
                                // 點選按鈕 代表登入成功
                                Toast.makeText(MainActivity2.this, "注冊失敗,賬号已存在"+object.size(), Toast.LENGTH_SHORT).show();
                            }else {
                                BmobUser user =new BmobUser();
                                user.setUsername(mEditText.getText().toString());
                                user.setPassword(mEditText2.getText().toString());
                                user.signUp(new SaveListener<BmobUser>() {
                                    @Override
                                    public void done(BmobUser user, BmobException e) {
                                        if(e==null)
                                        {
                                            Toast.makeText(MainActivity2.this, "注冊成功!", Toast.LENGTH_SHORT).show();

                                            finish();
                                        }else
                                        {
                                            Log.e("注冊失敗", "原因: ",e );
                                        }

                                    }
                                });

                            }
                        }
                    }
                });

                    }


        });



    }
}
           

activity_main3.xml

登入成功界面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="#7adfb8"
    android:fitsSystemWindows="true"
    android:layout_height="match_parent"
    tools:context=".MainActivity3">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_marginBottom="40dp"
        android:text="歡迎使用"
        android:textColor="#ffffff"
        android:textSize="36sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.24000001" />

    <TextView
        android:id="@+id/main_btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/input_layout"
        android:layout_centerInParent="true"
        android:background="@drawable/text_bg"
        android:gravity="center"
        android:paddingLeft="15dip"
        android:paddingTop="2dip"
        android:paddingRight="15dip"
        android:paddingBottom="2dip"
        android:text="修改密碼"
        android:textColor="#ffffff"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tuichu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/input_layout"
        android:layout_centerInParent="true"
        android:background="@drawable/text_bg"
        android:gravity="center"
        android:paddingLeft="15dip"
        android:paddingTop="2dip"
        android:paddingRight="15dip"
        android:paddingBottom="2dip"
        android:text="退出"
        android:textColor="#ffffff"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.62" />
</androidx.constraintlayout.widget.ConstraintLayout>
           

MainActivity3

public class MainActivity3 extends AppCompatActivity {

    TextView mTextView,mTextView2,mTextView3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= 21){
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        setContentView(R.layout.activity_main3);
        mTextView=findViewById(R.id.main_btn_login);
        mTextView2=findViewById(R.id.textView);
        mTextView3=findViewById(R.id.tuichu);
        mTextView3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity3.this,MainActivity.class);

                startActivity(intent);
                finish();
            }
        });
        String s = getIntent().getStringExtra("key");
        mTextView2.setText("歡迎你  "+s);
        mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity3.this,MainActivity4.class);
                intent.putExtra("key",s);

                startActivity(intent);
            }
        });
    }
}
           

activity_main4.xml

修改密碼界面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="#7adfb8"
    android:fitsSystemWindows="true"
    android:layout_height="match_parent"
    tools:context=".MainActivity4">
    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="15dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginLeft="15dp"
        android:src="@drawable/fanhu" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="40dp"

        android:text="修改密碼"
        android:textColor="#ffffff"
        android:textSize="36sp"
        app:layout_constraintBottom_toTopOf="@+id/linearLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout

        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dip"
        android:background="@drawable/radius_drawable_bg"
        android:orientation="vertical"
        android:padding="10dip"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.32999998"
        tools:layout_editor_absoluteX="20dp">

        <LinearLayout
            android:id="@+id/input_layout_name"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/user" />

            <TextView
                android:id="@+id/user"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="賬号"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:layout_marginTop="5dip"
            android:layout_marginBottom="5dip"
            android:background="#eeeeee" />

        <LinearLayout
            android:id="@+id/input_layout_psw"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/key" />

            <EditText
                android:id="@+id/key1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="舊密碼"
                android:inputType="textPassword"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/input_layout_psw1"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@drawable/key" />

            <EditText
                android:id="@+id/key"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:background="#00000000"
                android:hint="新密碼"
                android:inputType="textPassword"
                android:padding="5dip"
                android:textSize="16sp" />
        </LinearLayout>
    </LinearLayout>

    <TextView
        android:id="@+id/main_btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/input_layout"
        android:layout_centerInParent="true"
        android:background="@drawable/text_bg"
        android:gravity="center"
        android:paddingLeft="15dip"
        android:paddingTop="2dip"
        android:paddingRight="15dip"
        android:paddingBottom="2dip"
        android:text="确定"
        android:textColor="#ffffff"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
           

MainActivity4

public class MainActivity4 extends AppCompatActivity {

    TextView mTextView,mTextView2;
    EditText mEditText,mEditText2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= 21){
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        setContentView(R.layout.activity_main4);
        mTextView=findViewById(R.id.user);
        mEditText=findViewById(R.id.key1);
        mEditText2=findViewById(R.id.key);
        mTextView2=findViewById(R.id.main_btn_login);
        String s = getIntent().getStringExtra("key");
        mTextView.setText(s);
        mTextView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //新密碼
                String newPwd = mEditText2.getText().toString();
                //舊密碼
                String oldPwd = mEditText.getText().toString();
                BmobUser.updateCurrentUserPassword(oldPwd, newPwd, new UpdateListener() {
                    @Override
                    public void done(BmobException e) {
                        if (e == null) {
                            Toast.makeText(MainActivity4.this, "修改成功", Toast.LENGTH_LONG).show();
                            finish();
                        } else {
                            Toast.makeText(MainActivity4.this, "修改失敗:" + e.getMessage(),Toast.LENGTH_LONG).show();
                        }
                    }
                });



            }
        });
    }
}
           

3.免費demo源碼

https://download.csdn.net/download/qq_46526828/13991522

部落客為了可以學到更多的Android知識,建立了一個安卓知識交流群,歡迎大佬入群,當然也歡迎和我一樣的安卓小白,我們可以一起交流,最重要的是快樂水群,記得定個小目标,沖擊bat
Android周末 第二周-Bmob實作Android登入注冊修改密碼