diff --git a/LLRiseTabBarDemo/.idea/modules.xml b/LLRiseTabBarDemo/.idea/modules.xml
deleted file mode 100644
index f653431..0000000
--- a/LLRiseTabBarDemo/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/build.gradle b/LLRiseTabBarDemo/app/build.gradle
index 14a52d9..dac0ed5 100644
--- a/LLRiseTabBarDemo/app/build.gradle
+++ b/LLRiseTabBarDemo/app/build.gradle
@@ -1,28 +1,60 @@
-apply plugin: 'com.android.application'
+// app/build.gradle
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android' // 添加 Kotlin 插件
+}
android {
- compileSdkVersion 23
- buildToolsVersion "23.0.1"
+ namespace "com.startsmake.llrisetabbardemo"
+ compileSdk 33
defaultConfig {
applicationId "com.startsmake.llrisetabbardemo"
- minSdkVersion 14
- targetSdkVersion 23
+ minSdk 21
+ targetSdk 33
versionCode 1
versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
- namespace "com.startsmake.llrisetabbardemo"
+
buildTypes {
release {
minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
- testImplementation 'junit:junit:4.12'
- implementation 'com.android.support:appcompat-v7:23.1.0'
+ testImplementation 'junit:junit:4.13.2'
+
+ // AndroidX 依赖
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.9.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+
+ // 统一的 Kotlin 依赖
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.20"
+
+ // 项目模块
implementation project(':mainnavigatetabbar')
-}
+
+ // 如果有其他依赖冲突,可以排除旧版本
+ configurations {
+ all {
+ exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
+ exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
+ }
+ }
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/AndroidManifest.xml b/LLRiseTabBarDemo/app/src/main/AndroidManifest.xml
index 0d9ad88..4854606 100644
--- a/LLRiseTabBarDemo/app/src/main/AndroidManifest.xml
+++ b/LLRiseTabBarDemo/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/ForgotPasswordActivity.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/ForgotPasswordActivity.java
new file mode 100644
index 0000000..85d5bf5
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/ForgotPasswordActivity.java
@@ -0,0 +1,151 @@
+package com.startsmake.llrisetabbardemo.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.startsmake.llrisetabbardemo.R;
+
+public class ForgotPasswordActivity extends AppCompatActivity {
+
+ private TextInputEditText etPhone, etVerificationCode, etNewPassword;
+ private Button btnSendCode, btnResetPassword;
+ private ImageButton btnBack;
+ private TextView tvLogin;
+
+ private CountDownTimer countDownTimer;
+ private boolean isCounting = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_forgot_password);
+
+ initViews();
+ setupClickListeners();
+ }
+
+ private void initViews() {
+ etPhone = findViewById(R.id.et_phone);
+ etVerificationCode = findViewById(R.id.et_verification_code);
+ etNewPassword = findViewById(R.id.et_new_password);
+ btnSendCode = findViewById(R.id.btn_send_code);
+ btnResetPassword = findViewById(R.id.btn_reset_password);
+ btnBack = findViewById(R.id.btn_back);
+ tvLogin = findViewById(R.id.tv_login);
+ }
+
+ private void setupClickListeners() {
+ // 返回按钮
+ btnBack.setOnClickListener(v -> finish());
+
+ // 发送验证码
+ btnSendCode.setOnClickListener(v -> sendVerificationCode());
+
+ // 重置密码按钮
+ btnResetPassword.setOnClickListener(v -> attemptResetPassword());
+
+ // 返回登录
+ tvLogin.setOnClickListener(v -> {
+ Intent intent = new Intent(ForgotPasswordActivity.this, LoginActivity.class);
+ startActivity(intent);
+ finish();
+ });
+ }
+
+ private void sendVerificationCode() {
+ String phone = etPhone.getText().toString().trim();
+
+ if (phone.isEmpty()) {
+ etPhone.setError("请输入手机号");
+ return;
+ }
+
+ if (phone.length() != 11) {
+ etPhone.setError("手机号格式不正确");
+ return;
+ }
+
+ if (!isCounting) {
+ startCountDown();
+ Toast.makeText(this, "验证码已发送", Toast.LENGTH_SHORT).show();
+ // 这里应该调用后端API发送验证码
+ }
+ }
+
+ private void startCountDown() {
+ isCounting = true;
+ btnSendCode.setEnabled(false);
+
+ countDownTimer = new CountDownTimer(60000, 1000) {
+ @Override
+ public void onTick(long millisUntilFinished) {
+ btnSendCode.setText(millisUntilFinished / 1000 + "秒后重发");
+ }
+
+ @Override
+ public void onFinish() {
+ isCounting = false;
+ btnSendCode.setEnabled(true);
+ btnSendCode.setText("发送验证码");
+ }
+ }.start();
+ }
+
+ private void attemptResetPassword() {
+ String phone = etPhone.getText().toString().trim();
+ String code = etVerificationCode.getText().toString().trim();
+ String newPassword = etNewPassword.getText().toString().trim();
+
+ if (phone.isEmpty()) {
+ etPhone.setError("请输入手机号");
+ return;
+ }
+
+ if (code.isEmpty()) {
+ etVerificationCode.setError("请输入验证码");
+ return;
+ }
+
+ if (newPassword.isEmpty()) {
+ etNewPassword.setError("请输入新密码");
+ return;
+ }
+
+ if (phone.length() != 11) {
+ etPhone.setError("手机号格式不正确");
+ return;
+ }
+
+ if (newPassword.length() < 6) {
+ etNewPassword.setError("密码至少6位");
+ return;
+ }
+
+ // 模拟重置密码成功
+ performResetPassword();
+ }
+
+ private void performResetPassword() {
+ Toast.makeText(this, "密码重置成功!", Toast.LENGTH_SHORT).show();
+ // 重置成功后跳转到登录页面
+ Intent intent = new Intent(ForgotPasswordActivity.this, LoginActivity.class);
+ startActivity(intent);
+ finish();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (countDownTimer != null) {
+ countDownTimer.cancel();
+ }
+ }
+}
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/LoginActivity.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/LoginActivity.java
new file mode 100644
index 0000000..ef5b6a6
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/LoginActivity.java
@@ -0,0 +1,96 @@
+package com.startsmake.llrisetabbardemo.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.startsmake.llrisetabbardemo.R;
+
+public class LoginActivity extends AppCompatActivity {
+
+ private TextInputEditText etPhone, etPassword;
+ private Button btnLogin, btnSkipLogin;
+ private TextView tvForgotPassword, tvRegister;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+
+ initViews();
+ setupClickListeners();
+ }
+
+ private void initViews() {
+ etPhone = findViewById(R.id.et_phone);
+ etPassword = findViewById(R.id.et_password);
+ btnLogin = findViewById(R.id.btn_login);
+ btnSkipLogin = findViewById(R.id.btn_skip_login);
+ tvForgotPassword = findViewById(R.id.tv_forgot_password);
+ tvRegister = findViewById(R.id.tv_register);
+ }
+
+ private void setupClickListeners() {
+ // 登录按钮
+ btnLogin.setOnClickListener(v -> attemptLogin());
+
+ // 跳过登录按钮
+ btnSkipLogin.setOnClickListener(v -> skipToMain());
+
+ // 忘记密码
+ tvForgotPassword.setOnClickListener(v -> {
+ Intent intent = new Intent(LoginActivity.this, ForgotPasswordActivity.class);
+ startActivity(intent);
+ });
+
+ // 注册
+ tvRegister.setOnClickListener(v -> {
+ Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
+ startActivity(intent);
+ });
+ }
+
+ private void attemptLogin() {
+ String phone = etPhone.getText().toString().trim();
+ String password = etPassword.getText().toString().trim();
+
+ if (phone.isEmpty()) {
+ etPhone.setError("请输入手机号");
+ return;
+ }
+
+ if (password.isEmpty()) {
+ etPassword.setError("请输入密码");
+ return;
+ }
+
+ if (phone.length() != 11) {
+ etPhone.setError("手机号格式不正确");
+ return;
+ }
+
+ // 模拟登录成功(因为没有后端)
+ performLogin();
+ }
+
+ private void performLogin() {
+ Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
+ navigateToMain();
+ }
+
+ private void skipToMain() {
+ Toast.makeText(this, "跳过登录,进入主界面", Toast.LENGTH_SHORT).show();
+ navigateToMain();
+ }
+
+ private void navigateToMain() {
+ Intent intent = new Intent(LoginActivity.this, MainActivity.class);
+ startActivity(intent);
+ finish();
+ }
+}
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/MainActivity.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/MainActivity.java
index 246af3e..ed589b0 100644
--- a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/MainActivity.java
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/MainActivity.java
@@ -1,10 +1,12 @@
package com.startsmake.llrisetabbardemo.activity;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
+// 改为 AndroidX
+import androidx.appcompat.app.AppCompatActivity;
+
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.fragment.CityFragment;
import com.startsmake.llrisetabbardemo.fragment.HomeFragment;
@@ -20,7 +22,6 @@ public class MainActivity extends AppCompatActivity {
private static final String TAG_PAGE_MESSAGE = "消息";
private static final String TAG_PAGE_PERSON = "我的";
-
private MainNavigateTabBar mNavigateTabBar;
@Override
@@ -39,15 +40,13 @@ public class MainActivity extends AppCompatActivity {
mNavigateTabBar.addTab(PersonFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_person, R.mipmap.comui_tab_person_selected, TAG_PAGE_PERSON));
}
-
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mNavigateTabBar.onSaveInstanceState(outState);
}
-
public void onClickPublish(View v) {
Toast.makeText(this, "发布", Toast.LENGTH_LONG).show();
}
-}
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/RegisterActivity.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/RegisterActivity.java
new file mode 100644
index 0000000..b962695
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/RegisterActivity.java
@@ -0,0 +1,151 @@
+package com.startsmake.llrisetabbardemo.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.startsmake.llrisetabbardemo.R;
+
+public class RegisterActivity extends AppCompatActivity {
+
+ private TextInputEditText etPhone, etVerificationCode, etPassword;
+ private Button btnSendCode, btnRegister;
+ private ImageButton btnBack;
+ private TextView tvLogin;
+
+ private CountDownTimer countDownTimer;
+ private boolean isCounting = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_register);
+
+ initViews();
+ setupClickListeners();
+ }
+
+ private void initViews() {
+ etPhone = findViewById(R.id.et_phone);
+ etVerificationCode = findViewById(R.id.et_verification_code);
+ etPassword = findViewById(R.id.et_password);
+ btnSendCode = findViewById(R.id.btn_send_code);
+ btnRegister = findViewById(R.id.btn_register);
+ btnBack = findViewById(R.id.btn_back);
+ tvLogin = findViewById(R.id.tv_login);
+ }
+
+ private void setupClickListeners() {
+ // 返回按钮
+ btnBack.setOnClickListener(v -> finish());
+
+ // 发送验证码
+ btnSendCode.setOnClickListener(v -> sendVerificationCode());
+
+ // 注册按钮
+ btnRegister.setOnClickListener(v -> attemptRegister());
+
+ // 立即登录
+ tvLogin.setOnClickListener(v -> {
+ Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
+ startActivity(intent);
+ finish();
+ });
+ }
+
+ private void sendVerificationCode() {
+ String phone = etPhone.getText().toString().trim();
+
+ if (phone.isEmpty()) {
+ etPhone.setError("请输入手机号");
+ return;
+ }
+
+ if (phone.length() != 11) {
+ etPhone.setError("手机号格式不正确");
+ return;
+ }
+
+ if (!isCounting) {
+ startCountDown();
+ Toast.makeText(this, "验证码已发送", Toast.LENGTH_SHORT).show();
+ // 这里应该调用后端API发送验证码
+ }
+ }
+
+ private void startCountDown() {
+ isCounting = true;
+ btnSendCode.setEnabled(false);
+
+ countDownTimer = new CountDownTimer(60000, 1000) {
+ @Override
+ public void onTick(long millisUntilFinished) {
+ btnSendCode.setText(millisUntilFinished / 1000 + "秒后重发");
+ }
+
+ @Override
+ public void onFinish() {
+ isCounting = false;
+ btnSendCode.setEnabled(true);
+ btnSendCode.setText("发送验证码");
+ }
+ }.start();
+ }
+
+ private void attemptRegister() {
+ String phone = etPhone.getText().toString().trim();
+ String code = etVerificationCode.getText().toString().trim();
+ String password = etPassword.getText().toString().trim();
+
+ if (phone.isEmpty()) {
+ etPhone.setError("请输入手机号");
+ return;
+ }
+
+ if (code.isEmpty()) {
+ etVerificationCode.setError("请输入验证码");
+ return;
+ }
+
+ if (password.isEmpty()) {
+ etPassword.setError("请输入密码");
+ return;
+ }
+
+ if (phone.length() != 11) {
+ etPhone.setError("手机号格式不正确");
+ return;
+ }
+
+ if (password.length() < 6) {
+ etPassword.setError("密码至少6位");
+ return;
+ }
+
+ // 模拟注册成功
+ performRegister();
+ }
+
+ private void performRegister() {
+ Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();
+ // 注册成功后跳转到登录页面
+ Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
+ startActivity(intent);
+ finish();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (countDownTimer != null) {
+ countDownTimer.cancel();
+ }
+ }
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/CityFragment.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/CityFragment.java
index aa32c66..5d4d608 100644
--- a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/CityFragment.java
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/CityFragment.java
@@ -1,12 +1,14 @@
package com.startsmake.llrisetabbardemo.fragment;
-import android.app.Fragment;
import android.os.Bundle;
-import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+// 改为 AndroidX
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
import com.startsmake.llrisetabbardemo.R;
/**
@@ -21,4 +23,4 @@ public class CityFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_city, container, false);
}
-}
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/HomeFragment.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/HomeFragment.java
index b852c15..e856bcd 100644
--- a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/HomeFragment.java
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/HomeFragment.java
@@ -1,12 +1,14 @@
package com.startsmake.llrisetabbardemo.fragment;
-import android.app.Fragment;
import android.os.Bundle;
-import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+// 改为 AndroidX
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
import com.startsmake.llrisetabbardemo.R;
/**
@@ -21,5 +23,4 @@ public class HomeFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
-
-}
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/MessageFragment.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/MessageFragment.java
index 23ce570..e5ed4fd 100644
--- a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/MessageFragment.java
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/MessageFragment.java
@@ -1,12 +1,14 @@
package com.startsmake.llrisetabbardemo.fragment;
-import android.app.Fragment;
import android.os.Bundle;
-import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+// 改为 AndroidX
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
import com.startsmake.llrisetabbardemo.R;
/**
@@ -21,4 +23,4 @@ public class MessageFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_message, container, false);
}
-}
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/PersonFragment.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/PersonFragment.java
index e95e763..fc8327b 100644
--- a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/PersonFragment.java
+++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/PersonFragment.java
@@ -1,12 +1,14 @@
package com.startsmake.llrisetabbardemo.fragment;
-import android.app.Fragment;
import android.os.Bundle;
-import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+// 改为 AndroidX
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
import com.startsmake.llrisetabbardemo.R;
/**
@@ -21,4 +23,4 @@ public class PersonFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_person, container, false);
}
-}
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_code.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_code.xml
new file mode 100644
index 0000000..ecdfe34
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_code.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_primary.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_primary.xml
new file mode 100644
index 0000000..ab76243
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_primary.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_secondary.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_secondary.xml
new file mode 100644
index 0000000..eb9c3e6
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_button_secondary.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/ic_arrow_back.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/ic_arrow_back.xml
new file mode 100644
index 0000000..814d2b1
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/drawable/ic_arrow_back.xml
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/activity_forgot_password.xml b/LLRiseTabBarDemo/app/src/main/res/layout/activity_forgot_password.xml
new file mode 100644
index 0000000..6888595
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/layout/activity_forgot_password.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/activity_login.xml b/LLRiseTabBarDemo/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..f1ae7c3
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/activity_register.xml b/LLRiseTabBarDemo/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..aaa6406
--- /dev/null
+++ b/LLRiseTabBarDemo/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/app/src/main/res/values/colors.xml b/LLRiseTabBarDemo/app/src/main/res/values/colors.xml
index cd34e94..22e72f8 100644
--- a/LLRiseTabBarDemo/app/src/main/res/values/colors.xml
+++ b/LLRiseTabBarDemo/app/src/main/res/values/colors.xml
@@ -3,6 +3,18 @@
#3F51B5
#303F9F
#FF4081
+
+ #FFD700
+ #FFC400
+ #FFE44D
+
+
+ #666666
+ #FFD700
+
+
+ #FF000000
+ #FFFFFFFF
#ff333333
diff --git a/LLRiseTabBarDemo/app/src/main/res/values/styles.xml b/LLRiseTabBarDemo/app/src/main/res/values/styles.xml
index 2364475..edb3ef8 100644
--- a/LLRiseTabBarDemo/app/src/main/res/values/styles.xml
+++ b/LLRiseTabBarDemo/app/src/main/res/values/styles.xml
@@ -1,11 +1,9 @@
-
-
diff --git a/LLRiseTabBarDemo/build.gradle b/LLRiseTabBarDemo/build.gradle
index a8eeac5..e84f095 100644
--- a/LLRiseTabBarDemo/build.gradle
+++ b/LLRiseTabBarDemo/build.gradle
@@ -1,15 +1,19 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+// project/build.gradle
buildscript {
+ ext.kotlin_version = '1.8.20' // 使用统一的 Kotlin 版本
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.4.0'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
@@ -18,8 +22,17 @@ allprojects {
google()
mavenCentral()
}
+
+ // 强制所有模块使用相同版本的 Kotlin
+ configurations.all {
+ resolutionStrategy {
+ force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
+ }
+ }
}
task clean(type: Delete) {
delete rootProject.buildDir
-}
+}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/gradle.properties b/LLRiseTabBarDemo/gradle.properties
index 1d3591c..1605781 100644
--- a/LLRiseTabBarDemo/gradle.properties
+++ b/LLRiseTabBarDemo/gradle.properties
@@ -15,4 +15,7 @@
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
\ No newline at end of file
+# org.gradle.parallel=true
+# gradle.properties
+android.useAndroidX=true
+android.enableJetifier=true
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/gradle/wrapper/gradle-wrapper.properties b/LLRiseTabBarDemo/gradle/wrapper/gradle-wrapper.properties
index 80c24e8..e86bdcb 100644
--- a/LLRiseTabBarDemo/gradle/wrapper/gradle-wrapper.properties
+++ b/LLRiseTabBarDemo/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
#Sat Oct 11 19:07:18 CST 2025
+# gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.0-milestone-1-bin.zip
+distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/LLRiseTabBarDemo/mainnavigatetabbar/build.gradle b/LLRiseTabBarDemo/mainnavigatetabbar/build.gradle
index 86df3fc..e2992a4 100644
--- a/LLRiseTabBarDemo/mainnavigatetabbar/build.gradle
+++ b/LLRiseTabBarDemo/mainnavigatetabbar/build.gradle
@@ -1,23 +1,34 @@
-apply plugin: 'com.android.library'
+// mainnavigatetabbar/build.gradle
+plugins {
+ id 'com.android.library'
+}
+
android {
namespace "com.startsmake.mainnavigatetabbar"
- compileSdkVersion 23
- buildToolsVersion "23.0.1"
+ compileSdk 33
+
defaultConfig {
- minSdkVersion 14
- targetSdkVersion 23
- versionCode 1
- versionName "1.0"
+ minSdk 21
+ targetSdk 33
}
+
buildTypes {
release {
minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
}
dependencies {
- implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation 'com.android.support:appcompat-v7:23.1.1'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.fragment:fragment:1.6.1'
+
+ // 使用统一的 Kotlin 版本
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.20"
}
\ No newline at end of file
diff --git a/LLRiseTabBarDemo/mainnavigatetabbar/src/main/java/com/startsmake/mainnavigatetabbar/widget/MainNavigateTabBar.java b/LLRiseTabBarDemo/mainnavigatetabbar/src/main/java/com/startsmake/mainnavigatetabbar/widget/MainNavigateTabBar.java
index c4c8338..1fef36a 100644
--- a/LLRiseTabBarDemo/mainnavigatetabbar/src/main/java/com/startsmake/mainnavigatetabbar/widget/MainNavigateTabBar.java
+++ b/LLRiseTabBarDemo/mainnavigatetabbar/src/main/java/com/startsmake/mainnavigatetabbar/widget/MainNavigateTabBar.java
@@ -1,12 +1,9 @@
package com.startsmake.mainnavigatetabbar.widget;
-import android.app.Fragment;
-import android.app.FragmentTransaction;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.os.Bundle;
-import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
@@ -17,6 +14,16 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+// 删除旧的 Fragment 导入
+// import android.app.Fragment;
+// import android.app.FragmentTransaction;
+// import android.support.v4.app.FragmentActivity;
+
+// 添加 AndroidX Fragment 导入
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentTransaction;
+
import com.startsmake.mainnavigatetabbar.R;
import com.startsmake.mainnavigatetabbar.ThemeUtils;
@@ -30,7 +37,7 @@ import java.util.List;
*/
public class MainNavigateTabBar extends LinearLayout implements View.OnClickListener {
- private static final String KEY_CURRENT_TAG = "com.startsmake.template。currentTag";
+ private static final String KEY_CURRENT_TAG = "com.startsmake.template.currentTag";
private List mViewHolderList;
private OnTabSelectedListener mTabSelectListener;
@@ -191,13 +198,14 @@ public class MainNavigateTabBar extends LinearLayout implements View.OnClickList
* @param holder
*/
private void showFragment(ViewHolder holder) {
- FragmentTransaction transaction = mFragmentActivity.getFragmentManager().beginTransaction();
+ // 改为使用 Support FragmentManager
+ FragmentTransaction transaction = mFragmentActivity.getSupportFragmentManager().beginTransaction();
if (isFragmentShown(transaction, holder.tag)) {
return;
}
setCurrSelectedTabByTag(holder.tag);
- Fragment fragment = mFragmentActivity.getFragmentManager().findFragmentByTag(holder.tag);
+ Fragment fragment = mFragmentActivity.getSupportFragmentManager().findFragmentByTag(holder.tag);
if (fragment == null) {
fragment = getFragmentInstance(holder.tag);
transaction.add(mMainContentLayoutId, fragment, holder.tag);
@@ -217,7 +225,7 @@ public class MainNavigateTabBar extends LinearLayout implements View.OnClickList
return false;
}
- Fragment fragment = mFragmentActivity.getFragmentManager().findFragmentByTag(mCurrentTag);
+ Fragment fragment = mFragmentActivity.getSupportFragmentManager().findFragmentByTag(mCurrentTag);
if (fragment != null && !fragment.isHidden()) {
transaction.hide(fragment);
}
@@ -266,10 +274,11 @@ public class MainNavigateTabBar extends LinearLayout implements View.OnClickList
if (mViewHolderList == null || mViewHolderList.size() == 0) {
return;
}
- FragmentTransaction transaction = mFragmentActivity.getFragmentManager().beginTransaction();
+ // 改为使用 Support FragmentManager
+ FragmentTransaction transaction = mFragmentActivity.getSupportFragmentManager().beginTransaction();
for (ViewHolder holder : mViewHolderList) {
- Fragment fragment = mFragmentActivity.getFragmentManager().findFragmentByTag(holder.tag);
+ Fragment fragment = mFragmentActivity.getSupportFragmentManager().findFragmentByTag(holder.tag);
if (fragment != null && !fragment.isHidden()) {
transaction.hide(fragment);
}
@@ -377,7 +386,4 @@ public class MainNavigateTabBar extends LinearLayout implements View.OnClickList
public int getCurrentSelectedTab(){
return mCurrentSelectedTab;
}
-
-
-
-}
+}
\ No newline at end of file