From e91dbf43d3692c95007c637f3e6aeea88b36f411 Mon Sep 17 00:00:00 2001 From: ShiQi <3572915148@qq.com> Date: Fri, 19 Dec 2025 10:50:44 +0800 Subject: [PATCH] =?UTF-8?q?UI=E7=95=8C=E9=9D=A2=E7=9A=84=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserProfileReadOnlyActivity.java | 177 ++++++++++ .../livestreaming/UserWorksAdapter.java | 54 +++ .../drawable/bg_avatar_circle_transparent.xml | 4 + .../main/res/drawable/bg_avatar_ring_pink.xml | 5 + .../activity_user_profile_read_only.xml | 316 ++++++++++++++++++ .../src/main/res/layout/item_user_work.xml | 28 ++ 6 files changed, 584 insertions(+) create mode 100644 android-app/app/src/main/java/com/example/livestreaming/UserProfileReadOnlyActivity.java create mode 100644 android-app/app/src/main/java/com/example/livestreaming/UserWorksAdapter.java create mode 100644 android-app/app/src/main/res/drawable/bg_avatar_circle_transparent.xml create mode 100644 android-app/app/src/main/res/drawable/bg_avatar_ring_pink.xml create mode 100644 android-app/app/src/main/res/layout/activity_user_profile_read_only.xml create mode 100644 android-app/app/src/main/res/layout/item_user_work.xml diff --git a/android-app/app/src/main/java/com/example/livestreaming/UserProfileReadOnlyActivity.java b/android-app/app/src/main/java/com/example/livestreaming/UserProfileReadOnlyActivity.java new file mode 100644 index 00000000..5b8c8553 --- /dev/null +++ b/android-app/app/src/main/java/com/example/livestreaming/UserProfileReadOnlyActivity.java @@ -0,0 +1,177 @@ +package com.example.livestreaming; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.example.livestreaming.databinding.ActivityUserProfileReadOnlyBinding; +import com.google.android.material.tabs.TabLayout; + +import java.util.ArrayList; +import java.util.List; + +public class UserProfileReadOnlyActivity extends AppCompatActivity { + + private ActivityUserProfileReadOnlyBinding binding; + + private UserWorksAdapter worksAdapter; + + private static final String EXTRA_USER_ID = "extra_user_id"; + private static final String EXTRA_NAME = "extra_name"; + private static final String EXTRA_LOCATION = "extra_location"; + private static final String EXTRA_BIO = "extra_bio"; + private static final String EXTRA_AVATAR_RES = "extra_avatar_res"; + + private static final String PREFS_FRIENDS = "friends_prefs"; + + public static void start(Context context, String userId, String name, String location, String bio, int avatarRes) { + Intent intent = new Intent(context, UserProfileReadOnlyActivity.class); + intent.putExtra(EXTRA_USER_ID, userId); + intent.putExtra(EXTRA_NAME, name); + intent.putExtra(EXTRA_LOCATION, location); + intent.putExtra(EXTRA_BIO, bio); + intent.putExtra(EXTRA_AVATAR_RES, avatarRes); + context.startActivity(intent); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityUserProfileReadOnlyBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + binding.backButton.setOnClickListener(v -> finish()); + + String userId = getIntent().getStringExtra(EXTRA_USER_ID); + String name = getIntent().getStringExtra(EXTRA_NAME); + String location = getIntent().getStringExtra(EXTRA_LOCATION); + String bio = getIntent().getStringExtra(EXTRA_BIO); + int avatarRes = getIntent().getIntExtra(EXTRA_AVATAR_RES, R.drawable.wish_tree_checker_backup); + + binding.name.setText(name != null ? name : ""); + binding.location.setText(location != null ? location : ""); + binding.bio.setText(bio != null ? bio : ""); + binding.avatar.setImageResource(avatarRes); + + setupTabsAndWorks(); + bindDemoStatsAndWorks(userId); + + boolean isFriend = isFriend(userId); + updateAddFriendButton(isFriend); + + binding.addFriendButton.setOnClickListener(v -> { + if (TextUtils.isEmpty(userId)) { + Toast.makeText(this, "用户信息缺失", Toast.LENGTH_SHORT).show(); + return; + } + + boolean now = isFriend(userId); + if (!now) { + setFriend(userId, true); + updateAddFriendButton(true); + Toast.makeText(this, "已发送好友请求", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "已添加", Toast.LENGTH_SHORT).show(); + } + }); + } + + private void setupTabsAndWorks() { + if (binding == null) return; + + if (binding.tabs.getTabCount() == 0) { + binding.tabs.addTab(binding.tabs.newTab().setText("作品")); + binding.tabs.addTab(binding.tabs.newTab().setText("动态")); + binding.tabs.addTab(binding.tabs.newTab().setText("资料")); + } + + if (worksAdapter == null) { + worksAdapter = new UserWorksAdapter(); + binding.worksRecycler.setLayoutManager(new GridLayoutManager(this, 3)); + binding.worksRecycler.setAdapter(worksAdapter); + } + + showTab(0); + + binding.tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + if (tab == null) return; + showTab(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + if (tab == null) return; + showTab(tab.getPosition()); + } + }); + } + + private void showTab(int index) { + if (binding == null) return; + binding.worksRecycler.setVisibility(index == 0 ? android.view.View.VISIBLE : android.view.View.GONE); + binding.dynamicsPlaceholder.setVisibility(index == 1 ? android.view.View.VISIBLE : android.view.View.GONE); + binding.profilePlaceholder.setVisibility(index == 2 ? android.view.View.VISIBLE : android.view.View.GONE); + } + + private void bindDemoStatsAndWorks(String userId) { + if (binding == null) return; + + String seed = !TextUtils.isEmpty(userId) ? userId : "demo"; + int h = Math.abs(seed.hashCode()); + + int works = 6 + (h % 18); + int following = 10 + (h % 200); + int followers = 50 + (h % 5000); + int likes = 100 + (h % 20000); + + binding.statWorksValue.setText(String.valueOf(works)); + binding.statFollowingValue.setText(String.valueOf(following)); + binding.statFollowersValue.setText(String.valueOf(followers)); + binding.statLikesValue.setText(String.valueOf(likes)); + + List images = new ArrayList<>(); + int[] pool = new int[] { + R.drawable.wish_tree_checker_backup, + R.drawable.wish_tree_prev_no_bg, + R.drawable.wish_tree_trim_backup, + R.drawable.wish_tree_black, + R.drawable.wish_tree + }; + for (int i = 0; i < 12; i++) { + images.add(pool[(h + i) % pool.length]); + } + if (worksAdapter != null) worksAdapter.submitList(images); + } + + private boolean isFriend(String userId) { + if (TextUtils.isEmpty(userId)) return false; + return getSharedPreferences(PREFS_FRIENDS, MODE_PRIVATE).getBoolean(userId, false); + } + + private void setFriend(String userId, boolean value) { + if (TextUtils.isEmpty(userId)) return; + getSharedPreferences(PREFS_FRIENDS, MODE_PRIVATE).edit().putBoolean(userId, value).apply(); + } + + private void updateAddFriendButton(boolean isFriend) { + if (binding == null) return; + if (isFriend) { + binding.addFriendButton.setText("已添加"); + binding.addFriendButton.setAlpha(0.7f); + } else { + binding.addFriendButton.setText("加好友"); + binding.addFriendButton.setAlpha(1f); + } + } +} diff --git a/android-app/app/src/main/java/com/example/livestreaming/UserWorksAdapter.java b/android-app/app/src/main/java/com/example/livestreaming/UserWorksAdapter.java new file mode 100644 index 00000000..6319f67c --- /dev/null +++ b/android-app/app/src/main/java/com/example/livestreaming/UserWorksAdapter.java @@ -0,0 +1,54 @@ +package com.example.livestreaming; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.livestreaming.databinding.ItemUserWorkBinding; + +import java.util.ArrayList; +import java.util.List; + +public class UserWorksAdapter extends RecyclerView.Adapter { + + private final List items = new ArrayList<>(); + + public void submitList(List list) { + items.clear(); + if (list != null) items.addAll(list); + notifyDataSetChanged(); + } + + @NonNull + @Override + public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemUserWorkBinding binding = ItemUserWorkBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new VH(binding); + } + + @Override + public void onBindViewHolder(@NonNull VH holder, int position) { + holder.bind(items.get(position)); + } + + @Override + public int getItemCount() { + return items.size(); + } + + static class VH extends RecyclerView.ViewHolder { + + private final ItemUserWorkBinding binding; + + VH(ItemUserWorkBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + void bind(int drawableRes) { + binding.image.setImageResource(drawableRes); + } + } +} diff --git a/android-app/app/src/main/res/drawable/bg_avatar_circle_transparent.xml b/android-app/app/src/main/res/drawable/bg_avatar_circle_transparent.xml new file mode 100644 index 00000000..8165a9fc --- /dev/null +++ b/android-app/app/src/main/res/drawable/bg_avatar_circle_transparent.xml @@ -0,0 +1,4 @@ + + + + diff --git a/android-app/app/src/main/res/drawable/bg_avatar_ring_pink.xml b/android-app/app/src/main/res/drawable/bg_avatar_ring_pink.xml new file mode 100644 index 00000000..367b3a2b --- /dev/null +++ b/android-app/app/src/main/res/drawable/bg_avatar_ring_pink.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android-app/app/src/main/res/layout/activity_user_profile_read_only.xml b/android-app/app/src/main/res/layout/activity_user_profile_read_only.xml new file mode 100644 index 00000000..b9c033b4 --- /dev/null +++ b/android-app/app/src/main/res/layout/activity_user_profile_read_only.xml @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android-app/app/src/main/res/layout/item_user_work.xml b/android-app/app/src/main/res/layout/item_user_work.xml new file mode 100644 index 00000000..01d71784 --- /dev/null +++ b/android-app/app/src/main/res/layout/item_user_work.xml @@ -0,0 +1,28 @@ + + + + + + + + + +