1、个人信息完善

2、集成聊天功能
3、完成登录
This commit is contained in:
2025-05-29 08:59:34 +08:00
parent 314c484cea
commit 56119bb7bc
255 changed files with 13213 additions and 245 deletions

View File

@@ -23,8 +23,8 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
dataBinding {
enable = true

View File

@@ -7,6 +7,15 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/BaseAppTheme">
<activity
android:name=".activity.RealName1Activity"
android:exported="false" />
<activity
android:name=".activity.RevenueActivity"
android:exported="false" />
<activity
android:name=".activity.DailyTasksActivity"
android:exported="false" />
<activity
android:name=".activity.UserHomepageActivity"
android:exported="false" />

View File

@@ -0,0 +1,74 @@
package com.example.modulevocal.activity;
import android.graphics.Color;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.example.modulevocal.R;
import com.example.modulevocal.adapter.TaskBoxAdapter;
import com.example.modulevocal.adapter.TaskDataAdapter;
import com.example.modulevocal.conacts.DailyTasksConacts;
import com.example.modulevocal.databinding.ActivityDailyTasksBinding;
import com.example.modulevocal.presenter.DailyTasksPresenter;
import com.qxcm.moduleutil.activity.BaseMvpActivity;
import com.qxcm.moduleutil.bean.GiftBoxBean;
import com.qxcm.moduleutil.bean.TaskDataBean;
import java.util.List;
/**
*@author qx
*@data 2025/5/27
*@description: 每日任务
*/
public class DailyTasksActivity extends BaseMvpActivity<DailyTasksPresenter, ActivityDailyTasksBinding> implements DailyTasksConacts.View {
private TaskBoxAdapter mTaskBoxAdapter;
private TaskDataAdapter mTaskDataAdapter;
@Override
protected DailyTasksPresenter bindPresenter() {
return new DailyTasksPresenter(this, this);
}
@Override
protected void initData() {
MvpPre.tasksLihen();
MvpPre.tasksData();
}
@Override
protected void initView() {
super.initView();
mBinding.topBar.setTitle("每日任务");
mBinding.topBar.setRightTxtVisible(true);
mBinding.topBar.setRightText("礼盒记录");
mBinding.topBar.setRightColor(Color.parseColor("#FF8ACC"));
mTaskBoxAdapter = new TaskBoxAdapter();
mBinding.rvTask.setLayoutManager(new GridLayoutManager(this,2,GridLayoutManager.VERTICAL,false));
mBinding.rvTask.setAdapter(mTaskBoxAdapter);
mTaskDataAdapter=new TaskDataAdapter();
mBinding.rvTaskToday.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
mBinding.rvTaskToday.setAdapter(mTaskDataAdapter);
}
@Override
protected int getLayoutId() {
return R.layout.activity_daily_tasks;
}
@Override
public void setGiftBox(GiftBoxBean giftBoxBean) {
mBinding.tvTitle.setText("今日累计获得金币:"+giftBoxBean.getNewDataJinbi());
mTaskBoxAdapter.setNewData(giftBoxBean.getGiftList());
}
@Override
public void tasksDataList(List<TaskDataBean> taskDataBeans) {
mTaskDataAdapter.setNewData(taskDataBeans);
}
}

View File

@@ -29,6 +29,9 @@ public class MyMoneyActivity extends BaseMvpActivity<MyMoneyPresenter, ActivityM
mBinding.tvCz.setOnClickListener(this::onClick);
mBinding.tvTx.setOnClickListener(this::onClick);
mBinding.r3.setOnClickListener(this::onClick);
mBinding.r1.setOnClickListener(this::onClick);
mBinding.r2.setOnClickListener(this::onClick);
}
private void onClick(View view) {
@@ -38,6 +41,14 @@ public class MyMoneyActivity extends BaseMvpActivity<MyMoneyPresenter, ActivityM
startActivity(new Intent(this, WithdrawalActivity.class));
}else if (view.getId()==R.id.r_3){
startActivity(new Intent(this, CurrencyExchangeActivity.class));
}else if (view.getId()==R.id.r_1){
Intent intent=new Intent(this, RevenueActivity.class);
intent.putExtra("type","1");
startActivity(intent);
}else if (view.getId()==R.id.r_2){
Intent intent=new Intent(this, RevenueActivity.class);
intent.putExtra("type","2");
startActivity(intent);
}
}

View File

@@ -28,7 +28,7 @@ public class RealDetailActivity extends BaseAppCompatActivity<ActivityRealDeatil
private void onClick(View view) {
if (view.getId()==R.id.ll_1||view.getId()==R.id.ll_2){
startActivity(new Intent(this, RealNameActivity.class));
startActivity(new Intent(this, RealName1Activity.class));
finish();
}
}

View File

@@ -0,0 +1,159 @@
package com.example.modulevocal.activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.blankj.utilcode.util.RegexUtils;
import com.example.modulevocal.R;
import com.example.modulevocal.conacts.RealNameConacts;
import com.example.modulevocal.databinding.ActivityRealNameBinding;
import com.example.modulevocal.presenter.RealNamePresenter;
import com.qxcm.moduleutil.activity.BaseMvpActivity;
import com.qxcm.moduleutil.bean.RealNameBean;
import com.qxcm.moduleutil.utils.SpUtil;
import com.tencent.cloud.huiyansdkface.facelight.api.WbCloudFaceContant;
import com.tencent.cloud.huiyansdkface.facelight.api.WbCloudFaceVerifySdk;
import com.tencent.cloud.huiyansdkface.facelight.api.listeners.WbCloudFaceVerifyLoginListener;
import com.tencent.cloud.huiyansdkface.facelight.api.listeners.WbCloudFaceVerifyResultListener;
import com.tencent.cloud.huiyansdkface.facelight.api.result.WbFaceError;
import com.tencent.cloud.huiyansdkface.facelight.api.result.WbFaceVerifyResult;
import com.tencent.cloud.huiyansdkface.facelight.process.FaceVerifyStatus;
public class RealName1Activity extends BaseMvpActivity<RealNamePresenter, ActivityRealNameBinding> implements RealNameConacts.View{
@Override
protected void initData() {
mBinding.topBar.setTitle("实名认证");
String fullText = "您知悉并同意应用提供者\n· 收集、使用您本人的身份信息和人脸图像\n· 向合法数据持有者核实您的身份信息\n· 本操作数据仅用于身份核实,安全可靠";
SpannableString spannable = new SpannableString(fullText);
int firstLineEnd = fullText.indexOf('\n');
if (firstLineEnd > 0) {
// 设置第一行字体大小和颜色
spannable.setSpan(
new AbsoluteSizeSpan(16, true), // 18sp基于 TextView 的 sp 值调整
0,
firstLineEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
);
spannable.setSpan(
new ForegroundColorSpan(Color.BLACK),
0,
firstLineEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
);
}
mBinding.tvAgreeTerms.setText(spannable);
mBinding.btnSubmit.setOnClickListener(this::onClick);
}
@Override
protected int getLayoutId() {
return R.layout.activity_real_name;
}
@Override
protected RealNamePresenter bindPresenter() {
return new RealNamePresenter(this, this);
}
@Override
public void realNameSuccess(RealNameBean msg) {
Bundle data = new Bundle();
WbCloudFaceVerifySdk.InputData inputData = new WbCloudFaceVerifySdk.InputData(
msg.getFaceId(),
msg.getOrderNo(),
msg.getAppid(),
msg.getApiVersion(),
msg.getNonce(),
msg.getUserid(),
msg.getSign(),
FaceVerifyStatus.Mode.GRADE,
msg.getLicence());
data.putSerializable(WbCloudFaceContant.INPUT_DATA, inputData);
//设置是否打开语音提示,默认关闭,此处设置为关闭
data.putBoolean(WbCloudFaceContant. PLAY_VOICE, true);
//避免用户快速点击导致二次登录,二次拉起刷脸等操作引起问题
WbCloudFaceVerifySdk.getInstance().
initAdvSdk(RealName1Activity.this, data, new WbCloudFaceVerifyLoginListener() {
@Override
public void onLoginSuccess () {
//登录成功,拉起 sdk 页面,由 FaceVerifyResultListener 返回刷脸结果
WbCloudFaceVerifySdk.getInstance().startWbFaceVerifySdk(RealName1Activity.this, new WbCloudFaceVerifyResultListener() {
@Override
public void onFinish(WbFaceVerifyResult result) {
if (result != null) {
if (result.isSuccess()) {
Log.d("@@@", "刷脸成功!");
SpUtil.setRealName(true);
MvpPre.realNameResult(result.getOrderNo());
} else {
Log.d("@@@", "刷脸失败!");
}
}
//刷脸结束后,及时释放资源
WbCloudFaceVerifySdk.getInstance().release();
}
});
}
@Override
public void onLoginFailed (WbFaceError error){
Log.d("@@@", "刷脸失败!");
//刷脸结束后,及时释放资源
WbCloudFaceVerifySdk.getInstance().release();
}
});
}
@Override
public void sendCodeSuccess() {
finish();
}
private void onClick(View view) {
if (view.getId()== R.id.btnSubmit){
if (mBinding.edName.getText().toString().isEmpty()){
com.blankj.utilcode.util.ToastUtils.showShort("请输入姓名");
return;
}
if (mBinding.edPassword.getText().toString().isEmpty()){
com.blankj.utilcode.util.ToastUtils.showShort("请输入身份证号");
return;
}
if (RegexUtils.isIDCard18Exact(mBinding.edPassword.getText().toString())) {
if (mBinding.btnSubmit.getText().toString().equals("下一步")) {
mBinding.stepNum1.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_11));
mBinding.stepNum2.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_2));
// mBinding.l1.setVisibility(View.GONE);
// mBinding.l2.setVisibility(View.VISIBLE);
// mBinding.btnSubmit.setText("立即认证");
MvpPre.realName(mBinding.edName.getText().toString(),mBinding.edPassword.getText().toString());
} else {
SpUtil.setRealName(true);
finish();
}
}else {
com.blankj.utilcode.util.ToastUtils.showShort("请输入正确的身份证号");
return;
}
}
}
}

View File

@@ -1,78 +0,0 @@
package com.example.modulevocal.activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.example.modulevocal.R;
import com.example.modulevocal.databinding.ActivityRealNameBinding;
import com.qxcm.moduleutil.activity.BaseAppCompatActivity;
import com.qxcm.moduleutil.utils.SpUtil;
public class RealNameActivity extends BaseAppCompatActivity<ActivityRealNameBinding> {
@Override
protected void initData() {
}
@Override
protected void initView() {
mBinding.topBar.setTitle("实名认证");
String fullText = "您知悉并同意应用提供者\n· 收集、使用您本人的身份信息和人脸图像\n· 向合法数据持有者核实您的身份信息\n· 本操作数据仅用于身份核实,安全可靠";
SpannableString spannable = new SpannableString(fullText);
int firstLineEnd = fullText.indexOf('\n');
if (firstLineEnd > 0) {
// 设置第一行字体大小和颜色
spannable.setSpan(
new AbsoluteSizeSpan(16, true), // 18sp基于 TextView 的 sp 值调整
0,
firstLineEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
);
spannable.setSpan(
new ForegroundColorSpan(Color.BLACK),
0,
firstLineEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
);
}
mBinding.tvAgreeTerms.setText(spannable);
mBinding.btnSubmit.setOnClickListener(this::onClick);
}
private void onClick(View view) {
if (view.getId()==R.id.btnSubmit){
if (mBinding.btnSubmit.getText().toString().equals("下一步")){
mBinding.stepNum1.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_11));
mBinding.stepNum2.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_2));
mBinding.l1.setVisibility(View.GONE);
mBinding.l2.setVisibility(View.VISIBLE);
mBinding.btnSubmit.setText("立即认证");
}else {
SpUtil.setRealName(true);
finish();
}
}
}
@Override
protected int getLayoutId() {
return R.layout.activity_real_name;
}
}

View File

@@ -0,0 +1,106 @@
package com.example.modulevocal.activity;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import com.example.modulevocal.R;
import com.example.modulevocal.conacts.RevenueConacts;
import com.example.modulevocal.databinding.ActivityRevenueBinding;
import com.example.modulevocal.fragment.RevenueFragment;
import com.example.modulevocal.fragment.mybag.MyBagFragment;
import com.example.modulevocal.fragment.mybag.MyBagListFragment;
import com.example.modulevocal.presenter.RevenuePresenter;
import com.qxcm.moduleutil.activity.BaseMvpActivity;
import com.qxcm.moduleutil.activity.IPresenter;
import com.qxcm.moduleutil.bean.MyBagBean;
import com.qxcm.moduleutil.bean.RevenueBean;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
*@author qx
*@data 2025/5/27
*@description: 金币收支、钻石收支根据传递的type不同显示不同的数据type=1金币收支type=2钻石收支
*/
public class RevenueActivity extends BaseMvpActivity<RevenuePresenter, ActivityRevenueBinding> implements RevenueConacts.View{
private List<MyBagBean> list;
private int type;
@Override
protected void initData() {
type= Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("type")));
list=new ArrayList<>();
if (type==1) {
mBinding.topBar.setTitle("金币收支");
list.add(new MyBagBean("金币收入", "1"));
list.add(new MyBagBean("金币支出", "2"));
}else {
mBinding.topBar.setTitle("钻石收支");
list.add(new MyBagBean("钻石收入", "1"));
list.add(new MyBagBean("钻石支出", "2"));
}
mBinding.viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), list));
mBinding.slidingTabLayout.setViewPager(mBinding.viewPager);
mBinding.slidingTabLayout.setCurrentTab(0);
}
@Override
protected int getLayoutId() {
return R.layout.activity_revenue;
}
@Override
protected RevenuePresenter bindPresenter() {
return new RevenuePresenter(this, this);
}
@Override
public void saveRevenueData(List<RevenueBean> bean) {
}
private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
private List<MyBagBean> list;
public MyFragmentPagerAdapter(FragmentManager fm, List<MyBagBean> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
MyBagBean model = list.get(position);
if ("1".equals(model.getMyBagType())){
return RevenueFragment.newInstance(model.getMyBagType(), "1");
}else {
return RevenueFragment.newInstance(model.getMyBagType(), "2");
}
}
@Override
public int getCount() {
return list.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
MyBagBean model = list.get(position);
return model.getMyBagTitle();
}
}
}

View File

@@ -74,7 +74,7 @@ public class SettingActivity extends BaseAppCompatActivity<ActivitySettingBindin
realNameDialog.show();
realNameDialog.setOnDismissListener(dialog -> {
dialog.dismiss();
startActivity(new Intent(SettingActivity.this, RealNameActivity.class));
startActivity(new Intent(SettingActivity.this, RealName1Activity.class));
});
}
}else if (view.getId()==R.id.ll_qhch){

View File

@@ -0,0 +1,20 @@
package com.example.modulevocal.adapter;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.example.modulevocal.R;
import com.qxcm.moduleutil.bean.RevenueBean;
public class RevenueAdapter extends BaseQuickAdapter<RevenueBean, BaseViewHolder> {
public RevenueAdapter() {
super(R.layout.item_revenue);
}
@Override
protected void convert(BaseViewHolder helper, RevenueBean item) {
helper.setText(R.id.tv_name, item.getTitle());
helper.setText(R.id.tv_time, item.getTime());
helper.setText(R.id.tv_jb, item.getMoney());
}
}

View File

@@ -0,0 +1,95 @@
package com.example.modulevocal.adapter;
import android.annotation.SuppressLint;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.example.modulevocal.R;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.qxcm.moduleutil.bean.GiftBoxBean;
import com.qxcm.moduleutil.utils.ImageUtils;
public class TaskBoxAdapter extends BaseQuickAdapter<GiftBoxBean.GiftBean, BaseViewHolder> {
public TaskBoxAdapter() {
super(R.layout.item_task_box);
}
@SuppressLint("UseCompatLoadingForDrawables")
@Override
protected void convert(BaseViewHolder helper, GiftBoxBean.GiftBean item) {
int position = helper.getLayoutPosition(); // 获取当前位置
View itemView = helper.itemView; // 获取整个 item 的根布局
TextView giftName = helper.getView(R.id.tv_type_name);
TextView giftTitle = helper.getView(R.id.tv_title);
giftName.setText(item.getGiftName());
giftTitle.setText(item.getGiftTitle());
if (position == 0) {
itemView.setBackgroundColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_FCE4ED)); // 红色
giftName.setTextColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_E24171));
setSpannableText(giftTitle, "最高可获得%d金币", Integer.parseInt(item.getGiftTitle()),com.qxcm.moduleutil.R.color.color_E24171);
helper.setImageDrawable(R.id.task_box, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.task_cj));
} else if (position == 1) {
itemView.setBackgroundColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_FDE8AE)); // 黄色
giftName.setTextColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_F35F07));
setSpannableText(giftTitle, "最高可获得%d金币", Integer.parseInt(item.getGiftTitle()),com.qxcm.moduleutil.R.color.color_F35F07);
helper.setImageDrawable(R.id.task_box, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.task_gj));
} else {
// 其他 item 恢复默认背景(可选)
itemView.setBackground(null);
}
helper.setText(R.id.tv_jb, ""+item.getGetGiftTypeName()+"金币");
LinearProgressIndicator progressIndicator= helper.getView(R.id.progress_indicator);
progressIndicator.setProgress(Integer.parseInt(item.getGiftTypeNumber()));
helper.setText(R.id.tv_jb_num, item.getGiftTypeNumber()+"%");
if (position==0){
progressIndicator.setIndicatorColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_E24171));
}else {
progressIndicator.setIndicatorColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_F35F07));
}
if (Integer.parseInt(item.getGiftTypeNumber())<100){
helper.setImageDrawable(R.id.iv_unlock, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.not_unlocked));
helper.getView(R.id.iv_unlock).setSelected(false);
}else {
helper.setImageDrawable(R.id.iv_unlock, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.unlocked));
helper.getView(R.id.iv_unlock).setSelected(true);
}
}
// 设置带部分颜色的文本
private void setSpannableText(TextView textView, String format, int number,int color) {
String fullText = String.format(format, number);
SpannableString spannableString = new SpannableString(fullText);
// 找到数字的位置
String numberStr = String.valueOf(number);
int startIndex = fullText.indexOf(numberStr);
int endIndex = startIndex + numberStr.length();
if (startIndex >= 0) {
// 设置数字为红色
spannableString.setSpan(
new ForegroundColorSpan(ContextCompat.getColor(mContext,color)), // 使用你定义的颜色
startIndex,
endIndex,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
);
}
textView.setText(spannableString);
}
}

View File

@@ -0,0 +1,36 @@
package com.example.modulevocal.adapter;
import android.widget.TextView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.example.modulevocal.R;
import com.qxcm.moduleutil.bean.GiftBoxBean;
import com.qxcm.moduleutil.bean.TaskDataBean;
public class TaskDataAdapter extends BaseQuickAdapter<TaskDataBean, BaseViewHolder> {
public TaskDataAdapter() {
super(R.layout.item_task_data);
}
@Override
protected void convert(BaseViewHolder helper, TaskDataBean item) {
TextView textView=helper.getView(R.id.task_type);
if (item.getTaskType().equals("1")){
textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_lock));
}else if (item.getTaskType().equals("2")){
textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_wc));
} else if (item.getTaskType().equals("3")) {
textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_sl));
}else if (item.getTaskType().equals("4")) {
textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_yq));
}else if (item.getTaskType().equals("5")) {
textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_cz));
}else if (item.getTaskType().equals("6")) {
textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.ylq));
}
helper.setText(R.id.task_name, item.getTaskName())
.setText(R.id.task_jb_number, item.getTaskReward());
}
}

View File

@@ -0,0 +1,28 @@
package com.example.modulevocal.conacts;
import android.app.Activity;
import com.qxcm.moduleutil.activity.IPresenter;
import com.qxcm.moduleutil.activity.IView;
import com.qxcm.moduleutil.bean.GiftBoxBean;
import com.qxcm.moduleutil.bean.TaskDataBean;
import java.io.File;
import java.util.List;
public class DailyTasksConacts {
public interface View extends IView<Activity> {
void setGiftBox(GiftBoxBean giftBoxBean);
void tasksDataList(List<TaskDataBean> taskDataBeans);
}
public interface IMePre extends IPresenter {
void tasksLihen();
void tasksData();
}
}

View File

@@ -0,0 +1,23 @@
package com.example.modulevocal.conacts;
import android.app.Activity;
import com.qxcm.moduleutil.activity.IPresenter;
import com.qxcm.moduleutil.activity.IView;
import com.qxcm.moduleutil.bean.RealNameBean;
import java.io.File;
public class RealNameConacts {
public interface View extends IView<Activity> {
void realNameSuccess(RealNameBean msg);
void sendCodeSuccess();
}
public interface IMePre extends IPresenter {
void realName(String real_name, String card_number);
void realNameResult(String orderNo);
}
}

View File

@@ -0,0 +1,20 @@
package com.example.modulevocal.conacts;
import android.app.Activity;
import com.qxcm.moduleutil.activity.IPresenter;
import com.qxcm.moduleutil.activity.IView;
import com.qxcm.moduleutil.bean.RevenueBean;
import java.util.List;
public class RevenueConacts {
public interface View extends IView<Activity> {
void saveRevenueData(List<RevenueBean> bean);
}
public interface IMePre extends IPresenter {
void getRevenueData();
}
}

View File

@@ -0,0 +1,101 @@
package com.example.modulevocal.fragment;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.Toast;
import com.example.modulevocal.R;
import com.example.modulevocal.adapter.RevenueAdapter;
import com.example.modulevocal.conacts.RevenueConacts;
import com.example.modulevocal.databinding.FragmentRevenueBinding;
import com.example.modulevocal.fragment.mybag.MyBagFragment;
import com.example.modulevocal.presenter.RevenuePresenter;
import com.qxcm.moduleutil.base.BaseMvpFragment;
import com.qxcm.moduleutil.bean.RevenueBean;
import com.qxcm.moduleutil.dialog.DoubleDatePickerDialog;
import com.qxcm.moduleutil.widget.DoubleTimePickerBottomSheet;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
/**
*@author qx
*@data 2025/5/27
*@description: 收支展示的页面根据type展示收入和支出根据revenueType展示钻石还是金币
*/
public class RevenueFragment extends BaseMvpFragment<RevenuePresenter, FragmentRevenueBinding> implements RevenueConacts.View{
private String type;
private String revenueType;
private RevenueAdapter adapter;
@Override
protected RevenuePresenter bindPresenter() {
return new RevenuePresenter(this,getActivity());
}
public static RevenueFragment newInstance(String type, String revenueType) {
Bundle args = new Bundle();
args.putString("type", type);
args.putString("revenueType", revenueType);
RevenueFragment fragment = new RevenueFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void initArgs(Bundle arguments) {
super.initArgs(arguments);
type = arguments.getString("type");
revenueType = arguments.getString("revenueType");
}
@Override
protected void initData() {
mBinding.rl3.setOnClickListener(v -> {
DoubleTimePickerBottomSheet dialog = new DoubleTimePickerBottomSheet();
dialog.setOnTimeRangeSelectedListener((startDate, endDate) -> {
// 处理选择的时间范围
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:mm", Locale.getDefault());
Log.d("SelectedTime", "开始时间:" + sdf.format(startDate));
mBinding.tv2.setText(sdf.format(startDate));
Log.d("SelectedTime", "结束时间:" + sdf.format(endDate));
mBinding.tv22.setText(sdf.format(endDate));
MvpPre.getRevenueData();
});
dialog.show(getParentFragmentManager(), "DoubleTimePicker");
});
}
@Override
protected void initView() {
mBinding.revenueView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new RevenueAdapter();
mBinding.revenueView.setAdapter(adapter);
}
@Override
protected int getLayoutId() {
return R.layout.fragment_revenue;
}
@Override
public void saveRevenueData(List<RevenueBean> bean) {
adapter.setNewData(bean);
}
}

View File

@@ -14,6 +14,7 @@ import android.view.View;
import com.example.modulevocal.R;
import com.example.modulevocal.activity.BlacklistActivity;
import com.example.modulevocal.activity.DailyTasksActivity;
import com.example.modulevocal.activity.EditUserInfoActivity;
import com.example.modulevocal.activity.MyBagActivity;
import com.example.modulevocal.activity.MyMoneyActivity;
@@ -144,7 +145,7 @@ public class VocalRangeFragment extends BaseMvpFragment<MePresenter, FragmentVoc
mBinding.tvHome.setOnClickListener(this::onClick);
mBinding.meDressUp.setOnClickListener(this::onClick);
mBinding.tvMyWallet.setOnClickListener(this::onClick);
mBinding.meDaily.setOnClickListener(this::onClick);
}
@@ -240,8 +241,9 @@ public class VocalRangeFragment extends BaseMvpFragment<MePresenter, FragmentVoc
}
else if (id == R.id.tv_my_bb) {
//我的背包
// ARouter.getInstance().build(ARouteConstants.ME_KNAPSACK).withString("from", "我的界面").navigation();
startActivity(new Intent(getContext(), MyBagActivity.class));
} else if (id==R.id.me_daily) {//每日任务
startActivity(new Intent(getContext(), DailyTasksActivity.class));
}
// else if (id == R.id.me_my_custom) {
//

View File

@@ -0,0 +1,59 @@
package com.example.modulevocal.presenter;
import android.content.Context;
import com.example.modulevocal.conacts.DailyTasksConacts;
import com.qxcm.moduleutil.bean.GiftBoxBean;
import com.qxcm.moduleutil.bean.TaskDataBean;
import com.qxcm.moduleutil.presenter.BasePresenter;
import java.util.ArrayList;
import java.util.List;
public class DailyTasksPresenter extends BasePresenter<DailyTasksConacts.View> implements DailyTasksConacts.IMePre{
public DailyTasksPresenter(DailyTasksConacts.View view, Context context) {
super(view, context);
}
//获取礼盒列表
@Override
public void tasksLihen() {
GiftBoxBean giftBoxBean = new GiftBoxBean();
giftBoxBean.setNewDataJinbi("100");
List<GiftBoxBean.GiftBean> giftList = new ArrayList<>();
GiftBoxBean.GiftBean giftBean = new GiftBoxBean.GiftBean();
giftBean.setGiftName("初级礼盒");
giftBean.setGiftTitle("1000");
giftBean.setGetGiftTypeName("200");
giftBean.setGiftTypeNumber("50");
giftList.add(giftBean);
GiftBoxBean.GiftBean giftBean2 = new GiftBoxBean.GiftBean();
giftBean2.setGiftName("高级礼盒");
giftBean2.setGiftTitle("61112");
giftBean2.setGetGiftTypeName("500");
giftBean2.setGiftTypeNumber("40");
giftList.add(giftBean2);
giftBoxBean.setGiftList(giftList);
MvpRef.get().setGiftBox(giftBoxBean);
}
@Override
public void tasksData() {
List<TaskDataBean> taskDataBeans = new ArrayList<>();
for (int i = 0; i < 6; i++){
TaskDataBean taskDataBean = new TaskDataBean();
taskDataBean.setTaskName("任务"+i);
taskDataBean.setTaskNumber("1"+i);
taskDataBean.setTaskReward("10"+10);
taskDataBean.setTaskType(""+i+1);
taskDataBean.setTaskPictureUrl("");
taskDataBeans.add(taskDataBean);
}
MvpRef.get().tasksDataList(taskDataBeans);
}
}

View File

@@ -0,0 +1,74 @@
package com.example.modulevocal.presenter;
import android.content.Context;
import com.blankj.utilcode.util.ToastUtils;
import com.example.modulevocal.conacts.RealNameConacts;
import com.qxcm.moduleutil.base.CommonAppContext;
import com.qxcm.moduleutil.bean.RealNameBean;
import com.qxcm.moduleutil.http.ApiServer;
import com.qxcm.moduleutil.http.BaseModel;
import com.qxcm.moduleutil.http.BaseObserver;
import com.qxcm.moduleutil.presenter.BasePresenter;
import io.reactivex.disposables.Disposable;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RealNamePresenter extends BasePresenter<RealNameConacts.View> implements RealNameConacts.IMePre{
public RealNamePresenter(RealNameConacts.View view, Context context) {
super(view, context);
}
@Override
public void realName(String real_name, String card_number) {
api.realName(real_name, card_number, new BaseObserver<RealNameBean>() {
@Override
public void onSubscribe(Disposable d) {
addDisposable(d);
}
@Override
public void onNext(RealNameBean realNameBean) {
MvpRef.get().realNameSuccess(realNameBean);
}
});
}
@Override
public void realNameResult(String orderNo) {
Retrofit retrofit = new Retrofit.Builder().baseUrl(CommonAppContext.getInstance().getCurrentEnvironment().getServerUrl())
.addConverterFactory(GsonConverterFactory.create())
.build();
Call<BaseModel<String>> call=retrofit.create(ApiServer.class).getRealNameResult(orderNo);
call.enqueue(new Callback<BaseModel<String>>() {
@Override
public void onResponse(Call<BaseModel<String>> call, Response<BaseModel<String>> response) {
if (response.code()==200){
BaseModel<String> string=response.body();
if (string!=null){
int code=string.getCode();
if (code==1){
MvpRef.get().sendCodeSuccess();
}else {
ToastUtils.showShort(string.getMsg());
}
}
}
}
@Override
public void onFailure(Call<BaseModel<String>> call, Throwable t) {
ToastUtils.showShort("上传失败");
}
});
}
}

View File

@@ -0,0 +1,29 @@
package com.example.modulevocal.presenter;
import android.content.Context;
import com.example.modulevocal.conacts.RevenueConacts;
import com.qxcm.moduleutil.bean.RevenueBean;
import com.qxcm.moduleutil.presenter.BasePresenter;
import java.util.ArrayList;
import java.util.List;
public class RevenuePresenter extends BasePresenter<RevenueConacts.View> implements RevenueConacts.IMePre {
public RevenuePresenter(RevenueConacts.View view, Context context) {
super(view, context);
}
@Override
public void getRevenueData() {
List<RevenueBean> list = new ArrayList<>();
for (int i = 0; i < 3; i++){
RevenueBean revenueBean = new RevenueBean();
revenueBean.setTitle("每日签到");
revenueBean.setTime("2025-5-27 18:29:25");
revenueBean.setMoney("+10"+i);
list.add(revenueBean);
}
MvpRef.get().saveRevenueData(list);
}
}

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<layout 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"
tools:context=".activity.DailyTasksActivity">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_F8E3C8">
<com.qxcm.moduleutil.widget.CustomTopBar
android:id="@+id/top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent" />
<RelativeLayout
android:id="@+id/rl_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_9"
android:layout_marginEnd="@dimen/dp_16"
android:background="@mipmap/task_t"
app:layout_constraintTop_toBottomOf="@id/top_bar">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginStart="@dimen/dp_25"
android:layout_marginTop="@dimen/dp_23"
android:textColor="@color/white"
tools:text="今日累计获取金币20" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_task"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_231"
android:layout_below="@+id/tv_title"
android:layout_marginTop="@dimen/dp_8"
android:background="@drawable/bg_r16_fff"
android:padding="@dimen/dp_16" />
</RelativeLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/task_gz"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/rl_top" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/rl_top">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_12"
android:layout_marginEnd="@dimen/dp_16"
android:background="@drawable/bg_r16_fff"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_12"
android:layout_marginEnd="@dimen/dp_16"
android:text="今日任务"
android:textColor="@color/color_FF333333"
android:textSize="@dimen/sp_16" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_task_today"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:paddingStart="@dimen/dp_16"
android:paddingEnd="@dimen/dp_16" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -140,13 +140,12 @@
<TextView
android:layout_width="@dimen/dp_56"
android:layout_height="@dimen/dp_21"
android:text="@string/recharge_record"
android:layout_centerInParent="true"
android:layout_alignParentStart="true"
android:layout_marginStart="@dimen/dp_12"
android:textSize="@dimen/sp_14"
android:layout_centerHorizontal="true"
android:layout_marginStart="14dp"
android:text="@string/coin_to_diamond"
android:textColor="@color/color_FF333333"
/>
android:textSize="@dimen/sp_14" />
<TextView
android:layout_width="wrap_content"

View File

@@ -85,7 +85,7 @@
android:layout_gravity="right|center"
android:layout_weight="1"
android:gravity="right"
tools:text="身份证" />
android:text="身份证" />
</LinearLayout>
@@ -114,7 +114,8 @@
android:id="@+id/ll_1"
style="@style/My_Info_Item_LL_Style"
android:layout_marginTop="@dimen/dp_9"
android:background="@drawable/bg_r15_white">
android:background="@drawable/bg_r15_white"
android:visibility="gone">
<LinearLayout
style="@style/My_Info_Item_Title_Style"
@@ -142,7 +143,8 @@
android:id="@+id/ll_2"
style="@style/My_Info_Item_LL_Style"
android:layout_marginTop="@dimen/dp_9"
android:background="@drawable/bg_r15_white">
android:background="@drawable/bg_r15_white"
android:visibility="gone">
<LinearLayout
style="@style/My_Info_Item_Title_Style"

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<layout 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"
tools:context=".activity.RevenueActivity">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.qxcm.moduleutil.widget.CustomTopBar
android:id="@+id/top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
/>
<com.example.moduletablayout.CustomSlidingTabLayout
android:id="@+id/sliding_tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/top_bar"
android:layout_marginLeft="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_12"
android:layout_marginRight="@dimen/dp_16"
app:tl_indicator_corner_radius="@dimen/dp_3"
app:tl_indicator_drawable="@drawable/index_bg_indicator"
app:tl_indicator_height="@dimen/dp_6"
app:tl_indicator_margin_bottom="@dimen/dp_3"
app:tl_indicator_width="@dimen/dp_28"
app:tl_showCateIndicator="false"
app:tl_tab_width="@dimen/dp_70"
app:tl_textBold="SELECT"
app:tl_textSelectColor="@color/color_2B2823"
app:tl_textSelectedSize="@dimen/sp_16"
app:tl_textUnselectColor="@color/color_FF999999"
app:tl_textsize="@dimen/sp_14" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_12"
app:layout_constraintTop_toBottomOf="@+id/sliding_tab_layout"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".fragment.RevenueFragment">
<data>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/rl3"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_38"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginStart="@dimen/dp_16"
android:background="@drawable/bg_r5_e9e9"
android:gravity="center">
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_12"
android:text="开始日期"
android:textColor="@color/color_FF999999"
android:textSize="12sp" />
<ImageView
android:id="@+id/iv1"
android:layout_width="0dp"
android:layout_weight="0.2"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:paddingTop="@dimen/dp_3"
android:src="@mipmap/data1" />
<TextView
android:id="@+id/tv22"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="结束日期"
android:textColor="@color/color_FF999999"
android:textSize="12sp" />
<ImageView
android:id="@+id/iv2"
android:layout_width="0dp"
android:layout_weight="0.2"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:paddingTop="@dimen/dp_2"
android:src="@mipmap/data2" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/revenue_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginBottom="@dimen/dp_10"
android:background="@color/color_FFF5F5F5"
android:orientation="vertical"
tools:listitem="@layout/item_revenue" />
</LinearLayout>
</layout>

View File

@@ -10,6 +10,7 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_64">
<com.google.android.material.appbar.AppBarLayout
@@ -60,6 +61,7 @@
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_r16_f6f6f6"
android:layout_marginTop="@dimen/dp_12"
android:layout_marginStart="@dimen/dp_14"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_12"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_20"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textSize="@dimen/sp_14"
android:textColor="@color/color_FF333333"
tools:text="每日签到"
/>
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_17"
app:layout_constraintTop_toBottomOf="@id/tv_name"
app:layout_constraintStart_toStartOf="parent"
android:textSize="@dimen/sp_12"
android:textColor="@color/color_FF999999"
tools:text="2025-5-27 16:43:09"
/>
<TextView
android:id="@+id/tv_jb"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_24"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/im_ty"
android:textSize="@dimen/sp_16"
android:textColor="@color/color_ff2727"
tools:text="+10"
/>
<ImageView
android:id="@+id/im_ty"
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_16"
android:src="@mipmap/jinb"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="@dimen/dp_1"
app:layout_constraintEnd_toEndOf="parent"
tools:ignore="ContentDescription"
/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"
app:layout_constraintTop_toBottomOf="@+id/tv_time"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="@dimen/dp_12"
android:background="#F1F2F3"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/item"
android:layout_marginEnd="@dimen/dp_10"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/tools">
<TextView
android:id="@+id/tv_type_name"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_24"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="初级礼盒"
android:textColor="@color/color_E24171"
android:layout_marginTop="@dimen/dp_10"
android:textSize="@dimen/sp_16"
android:gravity="center"/>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_18"
app:layout_constraintTop_toBottomOf="@id/tv_type_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="最高可获得?金币"
android:textColor="@color/color_FF999999"
android:textSize="@dimen/sp_12"
/>
<ImageView
android:id="@+id/task_box"
android:layout_width="@dimen/dp_59"
android:layout_height="@dimen/dp_51"
app:layout_constraintTop_toBottomOf="@+id/tv_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_4"
android:src="@mipmap/task_cj" />
<TextView
android:id="@+id/tv_jb"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_18"
app:layout_constraintTop_toBottomOf="@id/task_box"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="满?金币"
android:textColor="@color/color_FF999999"
android:textSize="@dimen/sp_12"
/>
<!-- 使用 Material Design 进度条 -->
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progress_indicator"
android:layout_width="@dimen/dp_42"
android:layout_height="@dimen/dp_12"
android:max="100"
android:progress="50"
style="@style/RoundedProgressBar"
app:indicatorColor="@color/color_E24171"
app:trackColor="@color/color_FFB8CD"
app:trackThickness="12dp"
app:layout_constraintTop_toBottomOf="@id/tv_jb"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintWidth_percent="0.8"
android:layout_marginTop="8dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"/>
<TextView
android:id="@+id/tv_jb_num"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_15"
app:layout_constraintTop_toTopOf="@+id/progress_indicator"
app:layout_constraintStart_toEndOf="@+id/progress_indicator"
app:layout_constraintBottom_toBottomOf="@+id/progress_indicator"
android:layout_marginStart="@dimen/dp_2"
android:text="50%"
android:textColor="@color/color_E24171"
android:textSize="@dimen/sp_10"
/>
<ImageView
android:id="@+id/iv_unlock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:layout_marginStart="@dimen/dp_4"
android:src="@mipmap/not_unlocked"
app:layout_constraintTop_toBottomOf="@id/progress_indicator"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_16"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/task_pic"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:layout_centerInParent="true"
android:layout_alignParentStart="true"
android:src="@mipmap/task_lock" />
<TextView
android:id="@+id/task_name"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_21"
android:layout_toEndOf="@id/task_pic"
android:layout_marginStart="@dimen/dp_2"
android:text="任务名称"
android:textColor="@color/color_FF333333"
android:textSize="@dimen/sp_14" />
<TextView
android:id="@+id/task_jb"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_21"
android:layout_below="@id/task_name"
android:layout_toEndOf="@id/task_pic"
android:layout_marginStart="@dimen/dp_2"
android:text="金币"
android:textColor="@color/color_FF999999"
android:textSize="@dimen/sp_14" />
<TextView
android:id="@+id/task_jb_number"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_21"
android:layout_below="@id/task_name"
android:layout_toEndOf="@id/task_jb"
android:text="+10"
android:textColor="@color/color_ff2727"
android:textSize="@dimen/sp_14" />
<TextView
android:id="@+id/task_type"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_30"
android:background="@mipmap/go_lock"
android:layout_alignParentEnd="true"
android:layout_centerInParent="true"/>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -42,8 +42,8 @@
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/dp_22"
android:layout_height="@dimen/dp_15"
android:background="@mipmap/text_bj"
android:gravity="center"
android:paddingLeft="3dp"

View File

@@ -1 +1,4 @@
<resources></resources>
<resources>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="RoundedProgressBar" parent="Widget.Material3.LinearProgressIndicator">
<item name="trackCornerRadius">50dp</item>
</style>
</resources>