From c1aa4e0ff98e295b86dd224cf5b2c3a03e258842 Mon Sep 17 00:00:00 2001 From: wushaocheng <15876365887@163.com> Date: Fri, 6 Jan 2023 20:32:55 +0800 Subject: [PATCH] =?UTF-8?q?[Modify]=E5=A3=B0=E9=9F=B3=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=BB=E9=A1=B5=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/audio/SoundSignatureActivity.kt | 10 + .../erban/audio/viewmodel/SoundViewModel.kt | 15 + .../erban/ui/user/UserInfoActivity.java | 43 +- .../ui/user/view/UserInfoInfoFragment.kt | 304 ++++++++------ .../ui/user/viewmodel/UserInfoViewModel.kt | 32 +- .../drawable-xhdpi/ic_avatar_bottom_bg.webp | Bin 0 -> 3198 bytes .../res/drawable-xhdpi/ic_live_bottom.webp | Bin 0 -> 3198 bytes .../drawable-xhdpi/ic_room_yellow_arrow.webp | Bin 0 -> 734 bytes app/src/main/res/drawable/bg_live_bottom.xml | 13 + .../drawable/shape_gradient_d3acfe_a486ff.xml | 6 + .../main/res/layout/activity_user_info.xml | 149 +++---- .../res/layout/fragment_userinfo_userinfo.xml | 378 +++++------------- app/src/main/res/values/strings.xml | 5 + .../res/layout/item_userinfo_dynamic.xml | 13 +- 14 files changed, 450 insertions(+), 518 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/audio/viewmodel/SoundViewModel.kt create mode 100644 app/src/main/res/drawable-xhdpi/ic_avatar_bottom_bg.webp create mode 100644 app/src/main/res/drawable-xhdpi/ic_live_bottom.webp create mode 100644 app/src/main/res/drawable-xhdpi/ic_room_yellow_arrow.webp create mode 100644 app/src/main/res/drawable/bg_live_bottom.xml create mode 100644 app/src/main/res/drawable/shape_gradient_d3acfe_a486ff.xml diff --git a/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt b/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt index 3a7db53c9..3394054e9 100644 --- a/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/audio/SoundSignatureActivity.kt @@ -2,6 +2,7 @@ package com.yizhuan.erban.audio import com.netease.nim.uikit.StatusBarUtil import com.yizhuan.erban.R +import com.yizhuan.erban.audio.helper.AudioPlayerHelper import com.yizhuan.erban.base.BaseViewBindingActivity import com.yizhuan.erban.databinding.ActivitySoundSignatureBinding @@ -11,7 +12,16 @@ import com.yizhuan.erban.databinding.ActivitySoundSignatureBinding */ class SoundSignatureActivity : BaseViewBindingActivity() { + companion object{ + const val EXTRA_VOICE_ID = "voice_id" + const val AUDIO_FILE = "AUDIO_FILE" + const val AUDIO_DURA = "AUDIO_DURA" + const val MIN_RECORD_VOICE_DURATION = 5 // 最少5秒 + const val MAX_RECORD_VOICE_DURATION = 60 //最多60s + } + override fun init() { + AudioPlayerHelper.get().onCreate() initWhiteTitleBar(getString(R.string.sound_signature)) } diff --git a/app/src/main/java/com/yizhuan/erban/audio/viewmodel/SoundViewModel.kt b/app/src/main/java/com/yizhuan/erban/audio/viewmodel/SoundViewModel.kt new file mode 100644 index 000000000..2d49b3889 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/audio/viewmodel/SoundViewModel.kt @@ -0,0 +1,15 @@ +package com.yizhuan.erban.audio.viewmodel + +import com.yizhuan.erban.base.BaseViewModel + +/** + * @author wushaocheng + * 声音签名 + */ +class SoundViewModel : BaseViewModel() { + + init { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java index f248fd58d..2f4cc31d0 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java @@ -44,7 +44,6 @@ import com.yizhuan.erban.ui.user.adapter.SelfPhotoAdapter; import com.yizhuan.erban.ui.user.adapter.UserInfoIndicatorAdapter; import com.yizhuan.erban.ui.user.adapter.UserInfoPagerAdapter; import com.yizhuan.erban.ui.user.adapter.UserInfoPhotoAdapter; -import com.yizhuan.erban.ui.user.view.UserInfoDynamicFragment; import com.yizhuan.erban.ui.user.view.UserInfoGiftWallFragment; import com.yizhuan.erban.ui.user.view.UserInfoInfoFragment; import com.yizhuan.erban.ui.user.viewmodel.UserInfoViewModel; @@ -132,7 +131,6 @@ public class UserInfoActivity extends BaseBindingActivity { + userInfo = infoBean; + initData(userInfo); + }); } - @Override protected void onResume() { super.onResume(); + viewModel.getUserInfo(); viewModel.getUserInfoDetail(); viewModel.getUserHallAndClan(); - viewModel.getUserSkillData(viewModel.getUserId()); } private void initAttentionView() { if (AuthModel.get().getCurrentUid() == userId) { identityState = OWN; mBinding.tvFansCount.setOnClickListener(this); - mBinding.ivWhere.setVisibility(View.GONE); + mBinding.groupLive.setVisibility(View.GONE); if (bottomViewLayout != null) bottomViewLayout.setVisibility(View.GONE); } else { @@ -182,43 +183,23 @@ public class UserInfoActivity extends BaseBindingActivity() { - @Override - public void onErrorMsg(String error) { - toast(error); - } - - @Override - public void onSuccess(UserInfo Info) { - userInfo = Info; - initData(userInfo); - } - }); + mBinding.groupLive.setVisibility(viewModel.getMRoomUid() != 0 ? View.VISIBLE : View.GONE); } private void initViewPager() { - List fragmentList = new ArrayList<>(3); + List fragmentList = new ArrayList<>(2); fragmentList.add(new UserInfoInfoFragment()); - fragmentList.add(new UserInfoDynamicFragment()); fragmentList.add(new UserInfoGiftWallFragment()); -/* fragmentList.add(UserInfoCpFragment.Companion.newInstance(userId));*/ pagerAdapter = new UserInfoPagerAdapter(getSupportFragmentManager(), fragmentList); - final List tagList = new ArrayList<>(3); + final List tagList = new ArrayList<>(2); tagList.add(getString(R.string.me_data)); - tagList.add(getString(R.string.me_dynamic)); tagList.add(getString(R.string.me_gift_wall)); CommonNavigator commonNavigator = new CommonNavigator(context); commonNavigator.setTitleWrapContent(true); @@ -229,7 +210,7 @@ public class UserInfoActivity extends BaseBindingActivity() { - private var skillAdapter: SkillCardAdapter? = null private val vm: UserInfoViewModel by activityViewModels() + private var dynamicAdapter: UserInfoDynamicAdapter? = null + override fun init() { + EventBus.getDefault().register(this) + + vm.userInfoData.observe(this) { + initInfoData(it) + } + vm.hallData.observe(this) { - initClanAndHall(it) + initPersonalData(it) } - vm.userInfoSkillData.observe(this) { - initSkillCardList(it) + + vm.userInfoDetailData.observe(this) { + initDynamicList(it.dynamicInfo) } + } - @SuppressLint("SetTextI18n") - private fun initClanAndHall(clanAndHallInfo: ClanAndHallInfo) { + private fun initInfoData(userInfo: UserInfo) { + //设置星座 + val star = StarUtils.getConstellation(Date(userInfo.birth)) + if (null == star) { + binding.tvConstellation.visibility = View.GONE + } else { + binding.tvConstellation.text = star + binding.tvConstellation.visibility = View.VISIBLE + } + val birth = TimeUtil.getDateTimeString(userInfo.birth, "yyyy-MM-dd") + binding.tvBirth.text = birth + } + + private fun initPersonalData(clanAndHallInfo: ClanAndHallInfo) { val hallInfo: HallInfo? = clanAndHallInfo.hall val clanInfo: ClanInfo? = clanAndHallInfo.clan - val showApply = - AuthModel.get().currentUid != vm.userId && HallDataManager.get().hallId <= 0 if (hallInfo != null && hallInfo.hallId > 0) { - binding.llModuleHall.visibility = View.VISIBLE - binding.llNoAssociation.visibility = View.GONE - binding.tvHallId.text = getString(R.string.me_roomid) + hallInfo.hallId.toString() - binding.tvHallName.text = hallInfo.hallName - binding.tvHallMemberNum.text = - getString(R.string.me_room_number_people) + hallInfo.memberCount - binding.tvHallErbanId.text = getString(R.string.me_peko_number) + hallInfo.ownerErbanNo - GlideApp.with(this) - .load(hallInfo.ownerAvatar) - .placeholder(R.drawable.default_avatar) - .into(binding.ivHallAvatar) + binding.tvRoom.text = hallInfo.hallName } else { - binding.llHall.isVisible = false - binding.ivClanArrow.isVisible = false - binding.tvHallDetail.text = getString(R.string.me_association) + binding.llRoom.visibility = View.GONE } - if (clanInfo != null && clanInfo.id > 0) { - binding.llModuleHall.visibility = View.VISIBLE - binding.llNoAssociation.visibility = View.GONE - binding.llClan.visibility = View.VISIBLE - binding.tvClanId.text = getString(R.string.me_association_id) + clanInfo.id - binding.tvClanName.text = clanInfo.name - binding.tvClanMemberNum.text = - getString(R.string.me_association_number) + clanInfo.clanMemberNum - binding.tvClanHallNum.text = getString(R.string.me_room_number) + clanInfo.clanHallNum - GlideApp.with(this) - .load(clanInfo.avatar) - .placeholder(R.drawable.default_cover) - .into(binding.ivClanAvatar) - GlideApp.with(this) - .load(clanInfo.levelIcon) - .placeholder(R.drawable.default_cover) - .into(binding.ivClanLevel) - if (hallInfo != null && hallInfo.hallId > 0) { - binding.tvHallDetail.text = getString(R.string.me_association_room) - } + binding.tvAssociation.text = clanInfo.name } else { - binding.llClan.visibility = View.GONE - if (hallInfo == null || hallInfo.hallId <= 0) { - binding.llModuleHall.visibility = View.GONE - binding.llNoAssociation.visibility = View.VISIBLE - } else { - binding.llHall.isVisible = true - binding.tvHallDetail.text = getString(R.string.me_room) - } + binding.llAssociation.visibility = View.GONE } - binding.ivHallAvatar.setOnClickListener { + binding.tvRoom.setOnClickListener { if (hallInfo != null && hallInfo.hallId != 0L) { ModuleHallActivity.start( context, @@ -116,77 +100,143 @@ class UserInfoInfoFragment : BaseViewBindingFragment) { - val audio = list.find { it.cardId == 8 } - var newList: MutableList = list.toMutableList() - if (audio != null) { - (activity as? UserInfoActivity)?.initVoiceShow(audio) - newList.remove(audio) - } - if (skillAdapter == null) { - skillAdapter = SkillCardAdapter(mContext) - skillAdapter?.setHeaderAndEmpty(true) - skillAdapter?.setOnItemClickListener { _, _, _ -> - val type = - if (vm.userId == AuthModel.get().currentUid) PAGE_TYPE_SELF else PAGE_TYPE_CUSTOM - SkillHomeActivity.start(mContext, type, vm.userId) + private fun initDynamicList(worldDynamicList: List) { + if (dynamicAdapter == null) { + dynamicAdapter = UserInfoDynamicAdapter(mContext) + dynamicAdapter?.setEnableLoadMore(false) + dynamicAdapter?.setOnItemChildClickListener { _, view: View, pos: Int -> + val bean: WorldDynamicBean = + dynamicAdapter?.getItem(pos) ?: return@setOnItemChildClickListener + if (view.id == R.id.iv_more) { + val list: MutableList = ArrayList() + if (!UserModel.get().isMyseft(bean.uid)) { + val item = ButtonItem( + getString(R.string.me_shield_dynamic) + ) { + UserModel.get().addReport(bean.dynamicId, 0) + .subscribe(object : BeanObserver() { + override fun onErrorMsg(error: String) { + dialogManager.dismissDialog() + toast(error) + } + + override fun onSuccess(s: String) { + dialogManager.dismissDialog() + toast(ResUtil.getString(R.string.me_shield_success)) + if (pos < (dynamicAdapter?.data?.size ?: 0)) { + if (bean == dynamicAdapter?.getItem(pos)) { + dynamicAdapter?.remove(pos) + } + } + } + }) + } + list.add(item) + } + if (!UserModel.get().isMyseft(bean.uid)) { + val blackListItem = ButtonItemFactory.createAddToBlackListItem( + dialogManager, bean.uid.toString() + ) + list.add(blackListItem) + } + if (!UserModel.get().isMyseft(bean.uid)) { + val item = ButtonItem( + getString(R.string.me_report_dynamic) + ) { + StatisticManager.Instance().onEvent( + StatisticsProtocol.EVENT_WORLD_REPORT_MOMENTS, + getString(R.string.me_report_the_dynamic) + ) + UIHelper.showReportPage( + mContext, bean.uid, + XChatConstants.REPORT_TYPE_DYNAMIC_SQUARE + ) + } + list.add(item) + } + if (UserModel.get().isMyseft(bean.uid) || + isThisWorldOwner(bean) + ) { + val item = ButtonItem( + getString(R.string.me_delete) + ) { deleteDynamic(pos, dynamicAdapter) } + list.add(item) + } + dialogManager.showCommonPopupDialog(list, getString(R.string.cancel)) + } else if (view.id == R.id.ll_share) { + StatisticManager.Instance().onEvent( + StatisticsProtocol.EVENT_WORLD_SHARE_MOMENTS, + getString(R.string.me_share_dynamic) + ) + ShareDynamicHelper(activity).share(bean) + } } - binding.recyclerSkill.addItemDecoration(UserInfoSkillDecoration(mContext, 8)) - binding.recyclerSkill.layoutManager = - LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false) - binding.recyclerSkill.adapter = skillAdapter + binding.mRecyclerView.adapter = dynamicAdapter } - if (newList.isEmpty()) { - skillAdapter?.emptyView = createSkillEmptyView() - } - skillAdapter?.setNewData(newList) + dynamicAdapter?.setNewData(worldDynamicList) } - private fun applyJoinHall(hallId: Long) { - HallModel.get().applyJoinHall(hallId) - .compose(RxHelper.bindFragment(this)) - .subscribe(object : BeanObserver() { - override fun onErrorMsg(error: String) { - toast(error) - } - override fun onSuccess(s: String) { - toast(s) - } + private fun deleteDynamic(pos: Int, adapter: UserInfoDynamicAdapter?) { + StatisticManager.Instance().onEvent( + StatisticsProtocol.EVENT_WORLD_DELETE_MOMENTS, + getString(R.string.me_delete_the_dynamic) + ) + dialogManager.showOkCancelWithTitleDialog(getString(R.string.me_cannot_be_restored), + DialogManager.OkCancelDialogListener { + val bean = adapter?.getItem(pos) ?: return@OkCancelDialogListener + DynamicModel.get().delete(bean.worldId, bean.dynamicId) + .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .doOnSubscribe { dialogManager.showProgressDialog(mContext) } + .subscribe(object : DontWarnObserver() { + override fun accept(s: String?, error: String?) { + super.accept(s, error) + dialogManager.dismissDialog() + if (error != null) { + toast(error) + } else { + toast(getString(R.string.me_successfully_delete)) + if (pos < adapter.data.size) { + if (bean == adapter.getItem(pos)) { + adapter.remove(pos) + } + } + } + } + }) }) } - private fun createSkillEmptyView(): View { - val textView = TextView(mContext) - val textViewHeight = UIUtil.dip2px(mContext, 47.0) - textView.layoutParams = - ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, textViewHeight) - textView.gravity = Gravity.CENTER - textView.setTextColor(mContext.resources.getColor(R.color.color_666666)) - textView.text = getString(R.string.me_no_skill_card_added_yet) - textView.textSize = 12.0f - val conner = UIUtil.dip2px(mContext, 8.0) - val drawable = GradientDrawable() - drawable.cornerRadius = conner.toFloat() - drawable.setColor(Color.parseColor("#F4F7FF")) - textView.background = drawable - return textView + /** + * 判断自己是不是该世界的创始人 + */ + private fun isThisWorldOwner(bean: WorldDynamicBean?): Boolean { + return bean != null && bean.worldUid == AuthModel.get().currentUid + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onDynamicRefreshEvent(event: DynamicRefreshEvent?) { + if (isResumed) { + vm.userInfoDetailData.observe(this) { + initDynamicList(it.dynamicInfo) + } + } + } + + override fun onDestroyView() { + EventBus.getDefault().unregister(this) + super.onDestroyView() } } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/viewmodel/UserInfoViewModel.kt b/app/src/main/java/com/yizhuan/erban/ui/user/viewmodel/UserInfoViewModel.kt index c4329609d..befe29460 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/viewmodel/UserInfoViewModel.kt +++ b/app/src/main/java/com/yizhuan/erban/ui/user/viewmodel/UserInfoViewModel.kt @@ -4,13 +4,12 @@ import android.annotation.SuppressLint import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.yizhuan.erban.skill.repository.SkillModel import com.yizhuan.xchat_android_core.module_hall.hall.HallModel import com.yizhuan.xchat_android_core.module_hall.hall.bean.ClanAndHallInfo import com.yizhuan.xchat_android_core.user.UserInfoUiMgr import com.yizhuan.xchat_android_core.user.UserModel import com.yizhuan.xchat_android_core.user.bean.UserDetailInfo -import com.yizhuan.xchat_android_core.user.bean.UserInfoSkillEntity +import com.yizhuan.xchat_android_core.user.bean.UserInfo import com.yizhuan.xchat_android_core.utils.net.BeanObserver import com.yizhuan.xchat_android_core.utils.toast import io.reactivex.disposables.CompositeDisposable @@ -23,12 +22,12 @@ class UserInfoViewModel : ViewModel() { var mRoomUid: Long = 0 + private val _userInfoData = MutableLiveData() + val userInfoData: LiveData = _userInfoData + private val _userInfoDetailData = MutableLiveData() val userInfoDetailData: LiveData = _userInfoDetailData - private val _userInfoSkillData = MutableLiveData>() - val userInfoSkillData: LiveData> = _userInfoSkillData - private val _hallData = MutableLiveData() val hallData: LiveData = _hallData @@ -37,6 +36,18 @@ class UserInfoViewModel : ViewModel() { CompositeDisposable() } + fun getUserInfo() { + UserModel.get().getUserInfoFromServer(userId) + .subscribe(object : BeanObserver() { + override fun onErrorMsg(error: String) { error.toast() } + + override fun onSuccess(info: UserInfo) { + _userInfoData.value = info + } + override fun onSubscribe(d: Disposable) { disposable.add(d) } + }) + } + fun getUserInfoDetail() { UserModel.get().getUserInfoDetail(userId) .subscribe(object : BeanObserver() { @@ -65,17 +76,6 @@ class UserInfoViewModel : ViewModel() { disposable.add(subscribe) } - @SuppressLint("CheckResult") - fun getUserSkillData(userId: Long) { - val subscribe = SkillModel.instance.getUserInfoSkillList(userId) - .toFlowable() - .subscribe({ _userInfoSkillData.value = it }, { th -> - th.printStackTrace() - th.message?.toast() - }) - disposable.add(subscribe) - } - override fun onCleared() { super.onCleared() disposable.dispose() diff --git a/app/src/main/res/drawable-xhdpi/ic_avatar_bottom_bg.webp b/app/src/main/res/drawable-xhdpi/ic_avatar_bottom_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca89da4969134bf3a288b0395d7586036d718edc GIT binary patch literal 3198 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_live_bottom.webp b/app/src/main/res/drawable-xhdpi/ic_live_bottom.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca89da4969134bf3a288b0395d7586036d718edc GIT binary patch literal 3198 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_room_yellow_arrow.webp b/app/src/main/res/drawable-xhdpi/ic_room_yellow_arrow.webp new file mode 100644 index 0000000000000000000000000000000000000000..af3baed4bd8d167fc253e9110b1a56f3d3c2f4f0 GIT binary patch literal 734 zcmWIYbaT7L#J~{l>J$(bU=hK^z`$St#Oh$=>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>dDF&IcpE-rwvvCu$MzFlJgn{`fOr5g=P69m3WC zv6CQd8xXs^q@V<-CIG}P3JG!svQvO;jdUb-5)wPPpa`VC2dKs-H>VV27YKk{%#)fI z8Vsa4fLMm1m?4P4oxus=|NKP^3>IG*7?>v@#FAz*Fl=vSV34?l5K~#ez`)m$qafxmJu*g4H?XUG3@gKs8C=10H*-^!UercR{VKzpH(g~_sssLZM}2u z__v&&f9#(|p0p?LJ0022d(9f&Jv@Fze~FQ)_=IV4F8W6f9}8J}GG2vu$pRL6nPA2a znXsnjmbDy>4E%E$JQ@$=s(5xy`F`e%#lPJ@^}jBbxLD7UdpoU5FvlJgcBF!Y0=p99 z&8w_ZrS2v5zT0^0{${^5$<~*4ty1H>ylU4s=WlzbgdNaH4Gi5qCHJ%4Gk+oO-8L@Y Q_OJ03t~#)G|JQUD01jK8?*IS* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_live_bottom.xml b/app/src/main/res/drawable/bg_live_bottom.xml new file mode 100644 index 000000000..52ee1d0cb --- /dev/null +++ b/app/src/main/res/drawable/bg_live_bottom.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_gradient_d3acfe_a486ff.xml b/app/src/main/res/drawable/shape_gradient_d3acfe_a486ff.xml new file mode 100644 index 000000000..464e481db --- /dev/null +++ b/app/src/main/res/drawable/shape_gradient_d3acfe_a486ff.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index d8b4d23cf..13cd125f6 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -9,9 +9,9 @@ + android:layout_height="match_parent" + android:background="@color/color_F3F5FA"> + app:rollviewpager_play_delay="5000"> - - - - - - - - + android:paddingEnd="0dp" + android:paddingBottom="@dimen/dp_15"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + + + + android:layout_height="wrap_content" + android:layout_weight="1" /> - + tools:visibility="visible"> + + + + + + @@ -338,11 +351,11 @@ android:id="@+id/tv_desc" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_10" android:ellipsize="end" android:maxLines="2" android:textColor="@color/color_B3B3C3" android:textSize="@dimen/sp_13" - android:layout_marginTop="@dimen/dp_10" app:layout_constraintTop_toBottomOf="@id/ll_level" tools:text="@string/layout_activity_user_info_04" /> @@ -395,9 +408,9 @@ android:id="@+id/tv_edit" android:layout_width="@dimen/dp_30" android:layout_height="@dimen/dp_30" - android:src="@drawable/icon_home_page_compile" android:layout_alignParentEnd="true" android:layout_centerVertical="true" + android:src="@drawable/icon_home_page_compile" android:visibility="gone" /> @@ -430,8 +443,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginStart="@dimen/dp_15" - android:layout_marginEnd="@dimen/dp_15" android:layout_marginTop="@dimen/dp_5" + android:layout_marginEnd="@dimen/dp_15" android:layout_marginBottom="@dimen/dp_60" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> diff --git a/app/src/main/res/layout/fragment_userinfo_userinfo.xml b/app/src/main/res/layout/fragment_userinfo_userinfo.xml index 208a72679..568d4752e 100644 --- a/app/src/main/res/layout/fragment_userinfo_userinfo.xml +++ b/app/src/main/res/layout/fragment_userinfo_userinfo.xml @@ -10,303 +10,143 @@ android:layout_height="wrap_content"> - - - - - - - - - + android:layout_marginTop="@dimen/dp_12" + android:orientation="horizontal"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:text="@string/user_constellation" + android:textColor="@color/text_title_color" + android:textSize="@dimen/sp_12" /> + android:paddingLeft="6dp" + android:paddingRight="6dp" + android:textColor="@color/white" + android:textSize="@dimen/sp_10" + tools:text="@string/layout_activity_user_info_03" /> + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_constraintTop_toBottomOf="@+id/ll_personal_data" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9a7c342fe..f089a3edf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5041,5 +5041,10 @@ 刪除聲音 確定要刪除這段聲音嗎? 聲音審核中,審核通過即可展示~ + 個人資料 + 星座: + 生日: + 房間: + 公會: \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_userinfo_dynamic.xml b/app/src/module_community/res/layout/item_userinfo_dynamic.xml index fd4d18183..08b2ae2b4 100644 --- a/app/src/module_community/res/layout/item_userinfo_dynamic.xml +++ b/app/src/module_community/res/layout/item_userinfo_dynamic.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/bg_ffffff_8" android:orientation="vertical">