From 05d90004c120c5b597565bc99c7d3b85f15a4e73 Mon Sep 17 00:00:00 2001 From: Administrator <123> Date: Fri, 05 Nov 2021 06:47:38 +0000 Subject: [PATCH] 短信验证码 倒计时 大厅顶部 UI --- app/src/main/res/layout/hall_item_top.xml | 57 ++++++++++++++ app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java | 37 +++++++-- app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java | 32 +++++++ app/src/main/res/layout/fragment_sub_hall.xml | 65 ++++++++++++++- app/build.gradle | 8 + 5 files changed, 181 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 79380c7..ae21812 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,7 +33,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0' + implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' @@ -52,7 +52,9 @@ implementation 'com.squareup.retrofit2:retrofit:2.3.0' //RXjava和retrofit结合 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' - implementation 'com.google.android.material:material:1.4.0' implementation 'com.github.bumptech.glide:glide:4.12.0' - implementation 'com.permissionx.guolindev:permissionx:1.2.2' //权限依赖 + implementation 'com.permissionx.guolindev:permissionx:1.2.2' //权限依赖让你推广你就发群里?没有别的群了? + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + } \ No newline at end of file diff --git a/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java b/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java index f1356e0..896d934 100644 --- a/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java +++ b/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java @@ -16,6 +16,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; import com.duqing.missions.R; import com.duqing.missions.base.activities.BaseTitleBarActivity; @@ -28,11 +29,9 @@ @Override public void initViews() { - final EditText phoneEdit = binding.editPhone; final EditText passwordEditText = binding.editPassword; final Button loginButton = binding.login; - viewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() { @Override @@ -49,7 +48,6 @@ } } }); - viewModel.getLoginResult().observe(this, new Observer<LoginResult>() { @Override public void onChanged(@Nullable LoginResult loginResult) { @@ -68,7 +66,6 @@ finish(); } }); - binding.txtPasswordTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -78,7 +75,6 @@ unCheckStyle(binding.txtVerifyTitle); } }); - binding.txtVerifyTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -88,7 +84,6 @@ unCheckStyle(binding.txtPasswordTitle); } }); - TextWatcher afterTextChangedListener = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -109,7 +104,6 @@ phoneEdit.addTextChangedListener(afterTextChangedListener); passwordEditText.addTextChangedListener(afterTextChangedListener); passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { @@ -119,7 +113,6 @@ return false; } }); - loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -127,6 +120,34 @@ passwordEditText.getText().toString()); } }); + + viewModel.getCountDown().observe(this, new Observer<Long>() { + @Override + public void onChanged(Long l) { + if(l>0){ + binding.textVerify.setTextColor(getResources().getColor(R.color.gray)); + binding.textVerify.setEnabled(false); + binding.textVerify.setText("重新发送("+l+"s)"); + }else{ + binding.textVerify.setEnabled(true); + binding.textVerify.setTextColor(getResources().getColor(R.color.sky)); + binding.textVerify.setText("获取验证码"); + } + } + }); + + binding.textVerify.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewModel.startCountDown(0); + } + }); + + } + + @Override + public ViewModelProvider.Factory getViewModelFactory() { + return new LoginViewModelFactory(); } public void checkedStyle(TextView textView){ diff --git a/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java b/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java index 63f177a..d963549 100644 --- a/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java +++ b/app/src/main/java/com/duqing/missions/ui/login/view/LoginViewModel.java @@ -1,5 +1,6 @@ package com.duqing.missions.ui.login.view; +import android.os.CountDownTimer; import android.util.Patterns; import androidx.lifecycle.LiveData; @@ -20,6 +21,8 @@ private MutableLiveData<LoginFormState> loginFormState = new MutableLiveData<>(); private MutableLiveData<LoginResult> loginResult = new MutableLiveData<>(); private LoginRepository loginRepository; + private MutableLiveData<Long> countDown = new MutableLiveData<>(); + private CountDownTimer timer; LoginViewModel(LoginRepository loginRepository) { this.loginRepository = loginRepository; @@ -86,4 +89,31 @@ private boolean isPasswordValid(String password) { return password != null && password.trim().length() > 5; } -} \ No newline at end of file + + public MutableLiveData<Long> getCountDown() { + return countDown; + } + + /** + * 启动倒计时 + * @param consumedTime + */ + public void startCountDown(long consumedTime){ + //倒计时 + timer = new CountDownTimer(60 * 1000-consumedTime, 1000) { + + @Override + public void onTick(long l) { + countDown.postValue(l / 1000); + } + + @Override + public void onFinish() { + countDown.setValue(0l); + } + }; + timer.start(); + } + + +} diff --git a/app/src/main/res/layout/fragment_sub_hall.xml b/app/src/main/res/layout/fragment_sub_hall.xml index 2b892d9..35b39a1 100644 --- a/app/src/main/res/layout/fragment_sub_hall.xml +++ b/app/src/main/res/layout/fragment_sub_hall.xml @@ -63,18 +63,71 @@ app:layout_constraintHorizontal_weight="1" app:layout_constraintHorizontal_chainStyle="spread" /> - <View - android:id="@+id/view" + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/layout" android:layout_width="match_parent" - android:layout_height="0.5dp" - android:background="@color/gray" + android:layout_height="wrap_content" + android:background="@drawable/bg_white_corner" + android:elevation="@dimen/small_radios" + android:layout_margin="@dimen/activity_horizontal_margin" + android:padding="@dimen/frame_margin_lr" app:layout_constraintTop_toBottomOf="@id/radio_group" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent"/> + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintBottom_toTopOf="@id/include_refresh_recycler"> + + + <include layout="@layout/hall_item_top" + android:id="@+id/layout_left" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toLeftOf="@id/layout_between"/> + <include layout="@layout/hall_item_top" + android:id="@+id/layout_between" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_left" + app:layout_constraintRight_toLeftOf="@id/layout_right" + /> + <include layout="@layout/hall_item_top" + android:id="@+id/layout_right" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_between" + app:layout_constraintRight_toRightOf="parent"/> + + <View + android:layout_width="0.5dp" + android:layout_height="0dp" + android:background="@color/gray" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_left" /> + + <View + android:layout_width="0.5dp" + android:layout_height="0dp" + android:background="@color/gray" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_between" /> + + + </androidx.constraintlayout.widget.ConstraintLayout> + + <include layout="@layout/refresh_recycler" android:id="@+id/include_refresh_recycler" android:layout_width="match_parent" android:layout_height="0dp" - app:layout_constraintTop_toBottomOf="@id/view" + app:layout_constraintTop_toBottomOf="@id/layout" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/hall_item_top.xml b/app/src/main/res/layout/hall_item_top.xml new file mode 100644 index 0000000..534bed3 --- /dev/null +++ b/app/src/main/res/layout/hall_item_top.xml @@ -0,0 +1,57 @@ +<?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:layout_height="match_parent"> + + <ImageView + android:id="@+id/image_avatar" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="@dimen/frame_margin_lr" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintBottom_toTopOf="@id/text_title" + tools:srcCompat="@tools:sample/avatars" /> + + <TextView + android:id="@+id/text_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextView" + android:ellipsize="end" + android:singleLine="true" + android:maxLines="1" + android:textSize="16sp" + android:textColor="@color/black" + android:layout_marginTop="@dimen/frame_margin_lr" + app:layout_constraintBottom_toTopOf="@id/text_label" + app:layout_constraintTop_toBottomOf="@id/image_avatar" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" /> + + <TextView + android:id="@+id/text_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextView" + android:layout_marginTop="@dimen/frame_margin_lr" + app:layout_constraintBottom_toTopOf="@id/text_price" + app:layout_constraintTop_toBottomOf="@id/text_title" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" /> + + <TextView + android:id="@+id/text_price" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="+0.00" + android:textColor="@color/red" + android:textSize="16sp" + android:layout_marginTop="@dimen/frame_margin_lr" + app:layout_constraintTop_toBottomOf="@id/text_label" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" /> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file -- Gitblit v1.9.1