From 69dde5a2647620d40059f1bf2c0d354b7badf214 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 19:38:09 +0800 Subject: [PATCH 01/10] fix: improve font size and layout for issue #39 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increase font sizes: extra large (24dp), large (20dp), medium (17dp), small (15dp) - Improve dark mode text contrast with better opacity values - Add dynamic font size scaling to all list modules (News, DailyHot, TopicStar, SpecialCare) - Fix layout overlapping issue by repositioning title below time/comment elements - Add proper spacing between UI elements - Enhance line spacing for better readability Fixes #39 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../v2er/injector/module/DailyHotModule.java | 25 ++++++++++-- .../ghui/v2er/injector/module/NewsModule.java | 25 ++++++++++-- .../injector/module/SpecialCareModule.java | 29 +++++++++++--- .../v2er/injector/module/TopicStarModule.java | 25 ++++++++++-- .../java/me/ghui/v2er/util/FontSizeUtil.java | 40 +++++++++++++++++++ app/src/main/res/layout/common_list_item.xml | 3 +- app/src/main/res/values-night/colors.xml | 4 +- app/src/main/res/values/dimens.xml | 8 ++-- app/src/main/res/values/styles.xml | 1 + 9 files changed, 135 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java b/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java index 73546bd5..34f24d01 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java @@ -17,6 +17,8 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.DailyHotInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; +import android.util.TypedValue; /** * Created by ghui on 27/03/2017. @@ -41,11 +43,26 @@ protected void convert(ViewHolder holder, DailyHotInfo.Item item, int position) .load(item.getMember().getAvatar()) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - holder.setText(R.id.user_name_tv, item.getMember().getUserName()); - holder.setText(R.id.time_tv, item.getTime()); - holder.setText(R.id.tagview, item.getNode().getTitle()); - holder.setText(R.id.title_tv, item.getTitle()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(item.getTitle()); + + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(item.getMember().getUserName()); + + TextView timeTv = holder.getTextView(R.id.time_tv); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(item.getTime()); + + TextView tagTv = holder.getTextView(R.id.tagview); + tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + tagTv.setText(item.getNode().getTitle()); + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); commentTV.setText("评论" + item.getReplies()); ViewUtils.highlightCommentNum(commentTV); } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java b/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java index 7d665734..a871ea4e 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java @@ -18,7 +18,9 @@ import me.ghui.v2er.network.bean.NewsInfo; import me.ghui.v2er.util.L; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.LoadMoreRecyclerView; +import android.util.TypedValue; /** * Created by ghui on 03/04/2017. @@ -52,11 +54,26 @@ protected void convert(ViewHolder holder, NewsInfo.Item item, int position) { .load(item.getAvatar()) .placeholder(R.drawable.avatar_placeholder_drawable) .into(holder.getImgView(R.id.avatar_img)); - holder.setText(R.id.user_name_tv, item.getUserName()); - holder.setText(R.id.time_tv, item.getTime()); - holder.setText(R.id.tagview, item.getTagName()); - holder.setText(R.id.title_tv, item.getTitle()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(item.getTitle()); + + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(item.getUserName()); + + TextView timeTv = holder.getTextView(R.id.time_tv); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(item.getTime()); + + TextView tagTv = holder.getTextView(R.id.tagview); + tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + tagTv.setText(item.getTagName()); + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); commentTV.setText("评论" + item.getReplies()); ViewUtils.highlightCommentNum(commentTV); } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java b/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java index 7b028fee..8e7d458f 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java @@ -19,7 +19,9 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.CareInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.LoadMoreRecyclerView; +import android.util.TypedValue; /** * Created by ghui on 16/05/2017. @@ -43,17 +45,32 @@ protected void convert(ViewHolder holder, CareInfo.Item item, int position) { .load(item.getAvatar()) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - holder.setText(R.id.user_name_tv, item.getUserName()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(item.getTitle()); + + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(item.getUserName()); + // TODO: 2018/6/9 time is null + TextView timeTv = holder.getTextView(R.id.time_tv); if (Check.isEmpty(item.getTime())) { - holder.getView(R.id.time_tv).setVisibility(View.INVISIBLE); + timeTv.setVisibility(View.INVISIBLE); } else { - holder.getView(R.id.time_tv).setVisibility(View.VISIBLE); - holder.setText(R.id.time_tv, item.getTime()); + timeTv.setVisibility(View.VISIBLE); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(item.getTime()); } - holder.setText(R.id.tagview, item.getTagName()); - holder.setText(R.id.title_tv, item.getTitle()); + + TextView tagTv = holder.getTextView(R.id.tagview); + tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + tagTv.setText(item.getTagName()); + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); commentTV.setText("评论" + item.getComentNum()); ViewUtils.highlightCommentNum(commentTV); } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java b/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java index 3b729921..99c8e15f 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java @@ -17,7 +17,9 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.TopicStarInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.LoadMoreRecyclerView; +import android.util.TypedValue; /** * Created by ghui on 17/05/2017. @@ -40,11 +42,26 @@ protected void convert(ViewHolder holder, TopicStarInfo.Item item, int position) .load(item.getAvatar()) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - holder.setText(R.id.user_name_tv, item.getUserName()); - holder.setText(R.id.time_tv, item.getTime()); - holder.setText(R.id.tagview, item.getTag()); - holder.setText(R.id.title_tv, item.getTitle()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(item.getTitle()); + + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(item.getUserName()); + + TextView timeTv = holder.getTextView(R.id.time_tv); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(item.getTime()); + + TextView tagTv = holder.getTextView(R.id.tagview); + tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + tagTv.setText(item.getTag()); + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); commentTV.setText("评论" + item.getCommentNum()); ViewUtils.highlightCommentNum(commentTV); } diff --git a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java index 3a7da459..361462f1 100644 --- a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java +++ b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java @@ -26,6 +26,46 @@ public static float getContentSize() { return App.get().getResources().getDimension(id); } + public static float getTitleSize() { + String size = Pref.read(R.string.pref_key_fontsize); + int id; + switch (size) { + case "小": + id = R.dimen.smallTextSize; + break; + case "大": + id = R.dimen.largeTextSize; + break; + case "特大": + id = R.dimen.extralargeTextSize; + break; + case "中": + default: + id = R.dimen.mediumTextSize; + } + return App.get().getResources().getDimension(id); + } + + public static float getSubTextSize() { + String size = Pref.read(R.string.pref_key_fontsize); + int id; + switch (size) { + case "小": + id = R.dimen.microTextSize; + break; + case "大": + id = R.dimen.mediumTextSize; + break; + case "特大": + id = R.dimen.largeTextSize; + break; + case "中": + default: + id = R.dimen.smallTextSize; + } + return App.get().getResources().getDimension(id); + } + public static float getHtmlFontSize() { return ScaleUtils.px2Dp(getContentSize()); } diff --git a/app/src/main/res/layout/common_list_item.xml b/app/src/main/res/layout/common_list_item.xml index b9b688cc..3bf54fb3 100644 --- a/app/src/main/res/layout/common_list_item.xml +++ b/app/src/main/res/layout/common_list_item.xml @@ -12,7 +12,8 @@ #66000000 #ffffff #111214 - #E6FFFFFF - #B3B3B3 + #F2FFFFFF + #CCCCCC #1A000000 #1AFFFFFF diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 35cac2dd..58c65d9e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,8 +1,8 @@ - 20dp - 18dp - 16dp - 14dp + 24dp + 20dp + 17dp + 15dp 12dp 10dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e43ecda0..fb3c31ff 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -134,6 +134,7 @@ @dimen/mediumTextSize normal 6dp + 1.3 From a7c1d21a2bc4a148eb21d7a612fbecf717303ef7 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 19:50:34 +0800 Subject: [PATCH 02/10] fix: extend font size improvements to more UI components for issue #39 - Add dynamic font sizing to UserHome module (topics and replies) - Add dynamic font sizing to NodeTopic module - Add dynamic font sizing to Search module results - Ensure all list views now properly scale with font size preference - Dark mode text contrast already improved in previous commit --- .../v2er/injector/module/NodeTopicModule.java | 20 +++++++-- .../v2er/injector/module/SearchModule.java | 18 ++++++-- .../v2er/injector/module/UserHomeModule.java | 41 +++++++++++++++---- 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java b/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java index 9b102812..6bbf319b 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java @@ -15,7 +15,9 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.NodeTopicInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.LoadMoreRecyclerView; +import android.util.TypedValue; /** * Created by ghui on 27/05/2017. @@ -40,10 +42,22 @@ protected void convert(ViewHolder holder, NodeTopicInfo.Item item, int position) .load(item.getAvatar()) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - holder.setText(R.id.user_name_tv, item.getUserName()); - holder.setText(R.id.title_tv, item.getTitle()); - holder.setText(R.id.click_count_tv, "点击" + item.getClickNum()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(item.getTitle()); + + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(item.getUserName()); + + TextView clickCountTv = holder.getTextView(R.id.click_count_tv); + clickCountTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + clickCountTv.setText("点击" + item.getClickNum()); + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); commentTV.setText("评论" + item.getCommentNum()); ViewUtils.highlightCommentNum(commentTV); } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java b/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java index f5ae5691..6d1b5411 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java @@ -12,6 +12,9 @@ import me.ghui.v2er.network.bean.SoV2EXSearchResultInfo; import me.ghui.v2er.widget.LoadMoreRecyclerView; import me.ghui.v2er.widget.richtext.RichText; +import me.ghui.v2er.util.FontSizeUtil; +import android.util.TypedValue; +import android.widget.TextView; /** * Created by ghui on 02/06/2017. @@ -35,12 +38,21 @@ public LoadMoreRecyclerView.Adapter provideAdapter() return new CommonLoadMoreAdapter(mFragment.getContext(), R.layout.item_bing_search) { @Override protected void convert(ViewHolder holder, SoV2EXSearchResultInfo.Hit hit, int position) { - holder.setText(R.id.search_result_title_tv, hit.getSource().getTitle()); + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.search_result_title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(hit.getSource().getTitle()); + String footnote = hit.getSource().getCreator() + " 于 " + hit.getSource().getTime() + " 发表, " + hit.getSource().getReplies() + " 回复"; - holder.setText(R.id.search_result_footnote_tv, footnote); + TextView footnoteTv = holder.getTextView(R.id.search_result_footnote_tv); + footnoteTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + footnoteTv.setText(footnote); + + TextView contentTv = holder.getTextView(R.id.search_result_content_tv); + contentTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getContentSize()); RichText.from(hit.getSource().getContent()) .supportUrlClick(false) - .into(holder.getTextView(R.id.search_result_content_tv)); + .into(contentTv); } }; } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java b/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java index 39cab6d5..b20c9800 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java @@ -15,7 +15,9 @@ import me.ghui.v2er.module.user.UserHomePresenter; import me.ghui.v2er.network.bean.UserPageInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.richtext.RichText; +import android.util.TypedValue; /** * Created by ghui on 01/06/2017. @@ -60,11 +62,26 @@ public boolean isForViewType(@Nullable UserPageInfo.Item item, int position) { @Override public void convert(ViewHolder holder, UserPageInfo.Item item, int position) { UserPageInfo.TopicItem topicItem = (UserPageInfo.TopicItem) item; - holder.setText(R.id.user_name_tv, topicItem.getUserName()); - holder.setText(R.id.time_tv, topicItem.getTime()); - holder.setText(R.id.tagview, topicItem.getTag()); - holder.setText(R.id.title_tv, topicItem.getTitle()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(topicItem.getTitle()); + + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(topicItem.getUserName()); + + TextView timeTv = holder.getTextView(R.id.time_tv); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(topicItem.getTime()); + + TextView tagTv = holder.getTextView(R.id.tagview); + tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + tagTv.setText(topicItem.getTag()); + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); commentTV.setText("评论" + topicItem.getReplyNum()); ViewUtils.highlightCommentNum(commentTV); } @@ -84,11 +101,21 @@ public boolean isForViewType(@Nullable UserPageInfo.Item item, int position) { @Override public void convert(ViewHolder holder, UserPageInfo.Item item, int position) { UserPageInfo.ReplyItem replyItem = (UserPageInfo.ReplyItem) item; - holder.setText(R.id.reply_title_tv, replyItem.getTitle()); + + // Apply dynamic font sizing + TextView titleTv = holder.getTextView(R.id.reply_title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(replyItem.getTitle()); + + TextView contentTv = holder.getTextView(R.id.reply_content_tv); + contentTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getContentSize()); RichText.from(replyItem.getContent()) .widthDelta(43) - .into(holder.getTextView(R.id.reply_content_tv)); - holder.setText(R.id.reply_time_tv, replyItem.getTime()); + .into(contentTv); + + TextView timeTv = holder.getTextView(R.id.reply_time_tv); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(replyItem.getTime()); } }); From d167c66089cee6af67808a7aefc278c455455642 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:02:50 +0800 Subject: [PATCH 03/10] refactor: implement more elegant font size scaling solution - Created ViewHolderFontHelper to centralize font size application logic - Added scaling ratio support in FontSizeUtil (0.875x to 1.5x) - Refactored all modules to use the new helper, removing duplicate code - Simplified font size application with reusable helper methods - Support for scaling any TextView based on user preference This provides a much cleaner and maintainable solution for font size management. --- .../v2er/injector/module/DailyHotModule.java | 31 ++----- .../ghui/v2er/injector/module/NewsModule.java | 31 ++----- .../v2er/injector/module/NodeTopicModule.java | 25 +++--- .../v2er/injector/module/SearchModule.java | 21 ++--- .../injector/module/SpecialCareModule.java | 38 +++----- .../v2er/injector/module/TopicStarModule.java | 31 ++----- .../v2er/injector/module/UserHomeModule.java | 48 ++++------ .../java/me/ghui/v2er/util/FontSizeUtil.java | 29 +++++++ .../ghui/v2er/util/ViewHolderFontHelper.java | 87 +++++++++++++++++++ 9 files changed, 187 insertions(+), 154 deletions(-) create mode 100644 app/src/main/java/me/ghui/v2er/util/ViewHolderFontHelper.java diff --git a/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java b/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java index 34f24d01..44737855 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java @@ -17,8 +17,7 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.DailyHotInfo; import me.ghui.v2er.util.ViewUtils; -import me.ghui.v2er.util.FontSizeUtil; -import android.util.TypedValue; +import me.ghui.v2er.util.ViewHolderFontHelper; /** * Created by ghui on 27/03/2017. @@ -44,27 +43,13 @@ protected void convert(ViewHolder holder, DailyHotInfo.Item item, int position) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(item.getTitle()); - - TextView userNameTv = holder.getTextView(R.id.user_name_tv); - userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - userNameTv.setText(item.getMember().getUserName()); - - TextView timeTv = holder.getTextView(R.id.time_tv); - timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - timeTv.setText(item.getTime()); - - TextView tagTv = holder.getTextView(R.id.tagview); - tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - tagTv.setText(item.getNode().getTitle()); - - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - commentTV.setText("评论" + item.getReplies()); - ViewUtils.highlightCommentNum(commentTV); + // Use centralized font helper + ViewHolderFontHelper.applyCommonListItemFonts(holder, + item.getTitle(), + item.getMember().getUserName(), + item.getTime(), + item.getNode().getTitle(), + "评论" + item.getReplies()); } @Override diff --git a/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java b/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java index a871ea4e..6c890d5c 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java @@ -18,9 +18,8 @@ import me.ghui.v2er.network.bean.NewsInfo; import me.ghui.v2er.util.L; import me.ghui.v2er.util.ViewUtils; -import me.ghui.v2er.util.FontSizeUtil; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.widget.LoadMoreRecyclerView; -import android.util.TypedValue; /** * Created by ghui on 03/04/2017. @@ -55,27 +54,13 @@ protected void convert(ViewHolder holder, NewsInfo.Item item, int position) { .placeholder(R.drawable.avatar_placeholder_drawable) .into(holder.getImgView(R.id.avatar_img)); - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(item.getTitle()); - - TextView userNameTv = holder.getTextView(R.id.user_name_tv); - userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - userNameTv.setText(item.getUserName()); - - TextView timeTv = holder.getTextView(R.id.time_tv); - timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - timeTv.setText(item.getTime()); - - TextView tagTv = holder.getTextView(R.id.tagview); - tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - tagTv.setText(item.getTagName()); - - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - commentTV.setText("评论" + item.getReplies()); - ViewUtils.highlightCommentNum(commentTV); + // Use centralized font helper + ViewHolderFontHelper.applyCommonListItemFonts(holder, + item.getTitle(), + item.getUserName(), + item.getTime(), + item.getTagName(), + "评论" + item.getReplies()); } @Override diff --git a/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java b/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java index 6bbf319b..e73bb414 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java @@ -15,9 +15,9 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.NodeTopicInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.LoadMoreRecyclerView; -import android.util.TypedValue; /** * Created by ghui on 27/05/2017. @@ -43,22 +43,17 @@ protected void convert(ViewHolder holder, NodeTopicInfo.Item item, int position) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(item.getTitle()); - - TextView userNameTv = holder.getTextView(R.id.user_name_tv); - userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - userNameTv.setText(item.getUserName()); - - TextView clickCountTv = holder.getTextView(R.id.click_count_tv); - clickCountTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - clickCountTv.setText("点击" + item.getClickNum()); + // Use helper methods for cleaner code + ViewHolderFontHelper.setTextWithSize(holder, R.id.title_tv, + item.getTitle(), FontSizeUtil.getTitleSize()); + ViewHolderFontHelper.setTextWithSize(holder, R.id.user_name_tv, + item.getUserName(), FontSizeUtil.getSubTextSize()); + ViewHolderFontHelper.setTextWithSize(holder, R.id.click_count_tv, + "点击" + item.getClickNum(), FontSizeUtil.getSubTextSize()); TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - commentTV.setText("评论" + item.getCommentNum()); + ViewHolderFontHelper.setTextWithSize(holder, R.id.comment_num_tv, + "评论" + item.getCommentNum(), FontSizeUtil.getSubTextSize()); ViewUtils.highlightCommentNum(commentTV); } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java b/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java index 6d1b5411..1532f831 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java @@ -12,9 +12,8 @@ import me.ghui.v2er.network.bean.SoV2EXSearchResultInfo; import me.ghui.v2er.widget.LoadMoreRecyclerView; import me.ghui.v2er.widget.richtext.RichText; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.util.FontSizeUtil; -import android.util.TypedValue; -import android.widget.TextView; /** * Created by ghui on 02/06/2017. @@ -38,21 +37,19 @@ public LoadMoreRecyclerView.Adapter provideAdapter() return new CommonLoadMoreAdapter(mFragment.getContext(), R.layout.item_bing_search) { @Override protected void convert(ViewHolder holder, SoV2EXSearchResultInfo.Hit hit, int position) { - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.search_result_title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(hit.getSource().getTitle()); + // Use helper for cleaner code + ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_title_tv, + hit.getSource().getTitle(), FontSizeUtil.getTitleSize()); String footnote = hit.getSource().getCreator() + " 于 " + hit.getSource().getTime() + " 发表, " + hit.getSource().getReplies() + " 回复"; - TextView footnoteTv = holder.getTextView(R.id.search_result_footnote_tv); - footnoteTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - footnoteTv.setText(footnote); + ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_footnote_tv, + footnote, FontSizeUtil.getSubTextSize()); - TextView contentTv = holder.getTextView(R.id.search_result_content_tv); - contentTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getContentSize()); + ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_content_tv, + "", FontSizeUtil.getContentSize()); RichText.from(hit.getSource().getContent()) .supportUrlClick(false) - .into(contentTv); + .into(holder.getTextView(R.id.search_result_content_tv)); } }; } diff --git a/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java b/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java index 8e7d458f..1add974a 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java @@ -19,9 +19,8 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.CareInfo; import me.ghui.v2er.util.ViewUtils; -import me.ghui.v2er.util.FontSizeUtil; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.widget.LoadMoreRecyclerView; -import android.util.TypedValue; /** * Created by ghui on 16/05/2017. @@ -46,33 +45,20 @@ protected void convert(ViewHolder holder, CareInfo.Item item, int position) { .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(item.getTitle()); - - TextView userNameTv = holder.getTextView(R.id.user_name_tv); - userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - userNameTv.setText(item.getUserName()); - - // TODO: 2018/6/9 time is null - TextView timeTv = holder.getTextView(R.id.time_tv); - if (Check.isEmpty(item.getTime())) { - timeTv.setVisibility(View.INVISIBLE); + // Use centralized font helper - handle null time + String timeText = Check.isEmpty(item.getTime()) ? null : item.getTime(); + if (timeText == null) { + holder.getView(R.id.time_tv).setVisibility(View.INVISIBLE); } else { - timeTv.setVisibility(View.VISIBLE); - timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - timeTv.setText(item.getTime()); + holder.getView(R.id.time_tv).setVisibility(View.VISIBLE); } - TextView tagTv = holder.getTextView(R.id.tagview); - tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - tagTv.setText(item.getTagName()); - - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - commentTV.setText("评论" + item.getComentNum()); - ViewUtils.highlightCommentNum(commentTV); + ViewHolderFontHelper.applyCommonListItemFonts(holder, + item.getTitle(), + item.getUserName(), + timeText, + item.getTagName(), + "评论" + item.getComentNum()); } @Override diff --git a/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java b/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java index 99c8e15f..07334842 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java @@ -17,9 +17,8 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.TopicStarInfo; import me.ghui.v2er.util.ViewUtils; -import me.ghui.v2er.util.FontSizeUtil; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.widget.LoadMoreRecyclerView; -import android.util.TypedValue; /** * Created by ghui on 17/05/2017. @@ -43,27 +42,13 @@ protected void convert(ViewHolder holder, TopicStarInfo.Item item, int position) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(item.getTitle()); - - TextView userNameTv = holder.getTextView(R.id.user_name_tv); - userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - userNameTv.setText(item.getUserName()); - - TextView timeTv = holder.getTextView(R.id.time_tv); - timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - timeTv.setText(item.getTime()); - - TextView tagTv = holder.getTextView(R.id.tagview); - tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - tagTv.setText(item.getTag()); - - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - commentTV.setText("评论" + item.getCommentNum()); - ViewUtils.highlightCommentNum(commentTV); + // Use centralized font helper + ViewHolderFontHelper.applyCommonListItemFonts(holder, + item.getTitle(), + item.getUserName(), + item.getTime(), + item.getTag(), + "评论" + item.getCommentNum()); } @Override diff --git a/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java b/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java index b20c9800..c045b5cc 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java @@ -15,9 +15,9 @@ import me.ghui.v2er.module.user.UserHomePresenter; import me.ghui.v2er.network.bean.UserPageInfo; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.richtext.RichText; -import android.util.TypedValue; /** * Created by ghui on 01/06/2017. @@ -63,27 +63,13 @@ public boolean isForViewType(@Nullable UserPageInfo.Item item, int position) { public void convert(ViewHolder holder, UserPageInfo.Item item, int position) { UserPageInfo.TopicItem topicItem = (UserPageInfo.TopicItem) item; - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(topicItem.getTitle()); - - TextView userNameTv = holder.getTextView(R.id.user_name_tv); - userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - userNameTv.setText(topicItem.getUserName()); - - TextView timeTv = holder.getTextView(R.id.time_tv); - timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - timeTv.setText(topicItem.getTime()); - - TextView tagTv = holder.getTextView(R.id.tagview); - tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - tagTv.setText(topicItem.getTag()); - - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - commentTV.setText("评论" + topicItem.getReplyNum()); - ViewUtils.highlightCommentNum(commentTV); + // Use centralized font helper + ViewHolderFontHelper.applyCommonListItemFonts(holder, + topicItem.getTitle(), + topicItem.getUserName(), + topicItem.getTime(), + topicItem.getTag(), + "评论" + topicItem.getReplyNum()); } }); @@ -102,20 +88,18 @@ public boolean isForViewType(@Nullable UserPageInfo.Item item, int position) { public void convert(ViewHolder holder, UserPageInfo.Item item, int position) { UserPageInfo.ReplyItem replyItem = (UserPageInfo.ReplyItem) item; - // Apply dynamic font sizing - TextView titleTv = holder.getTextView(R.id.reply_title_tv); - titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); - titleTv.setText(replyItem.getTitle()); + // Use helper for cleaner code + ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_title_tv, + replyItem.getTitle(), FontSizeUtil.getTitleSize()); - TextView contentTv = holder.getTextView(R.id.reply_content_tv); - contentTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getContentSize()); + ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_content_tv, + "", FontSizeUtil.getContentSize()); RichText.from(replyItem.getContent()) .widthDelta(43) - .into(contentTv); + .into(holder.getTextView(R.id.reply_content_tv)); - TextView timeTv = holder.getTextView(R.id.reply_time_tv); - timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); - timeTv.setText(replyItem.getTime()); + ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_time_tv, + replyItem.getTime(), FontSizeUtil.getSubTextSize()); } }); diff --git a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java index 361462f1..e7f0e3b1 100644 --- a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java +++ b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java @@ -70,4 +70,33 @@ public static float getHtmlFontSize() { return ScaleUtils.px2Dp(getContentSize()); } + /** + * Get scaling ratio based on font size preference + * This ratio can be applied to any text view to scale it proportionally + * @return scaling ratio (1.0 for medium/default, higher for larger sizes) + */ + public static float getScalingRatio() { + String size = Pref.read(R.string.pref_key_fontsize); + switch (size) { + case "小": + return 0.875f; // 87.5% of default + case "大": + return 1.25f; // 125% of default + case "特大": + return 1.5f; // 150% of default + case "中": + default: + return 1.0f; // 100% default + } + } + + /** + * Apply scaling to a given font size in pixels + * @param originalSize the original font size in pixels + * @return scaled font size in pixels + */ + public static float getScaledSize(float originalSize) { + return originalSize * getScalingRatio(); + } + } diff --git a/app/src/main/java/me/ghui/v2er/util/ViewHolderFontHelper.java b/app/src/main/java/me/ghui/v2er/util/ViewHolderFontHelper.java new file mode 100644 index 00000000..56fe4388 --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/util/ViewHolderFontHelper.java @@ -0,0 +1,87 @@ +package me.ghui.v2er.util; + +import android.util.TypedValue; +import android.widget.TextView; +import me.ghui.v2er.R; +import me.ghui.v2er.adapter.base.ViewHolder; + +/** + * Helper class to apply dynamic font sizing to ViewHolder items + * Centralizes font size application logic to avoid code duplication + */ +public class ViewHolderFontHelper { + + /** + * Apply standard font sizing to common list item layout + * @param holder The ViewHolder containing the views + * @param title The title text + * @param userName The username text + * @param time The time text + * @param tag The tag text + * @param commentNum The comment number text + */ + public static void applyCommonListItemFonts(ViewHolder holder, + String title, String userName, String time, String tag, String commentNum) { + + // Title + TextView titleTv = holder.getTextView(R.id.title_tv); + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(title); + + // Username + if (userName != null) { + TextView userNameTv = holder.getTextView(R.id.user_name_tv); + userNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + userNameTv.setText(userName); + } + + // Time + if (time != null) { + TextView timeTv = holder.getTextView(R.id.time_tv); + timeTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + timeTv.setText(time); + } + + // Tag + if (tag != null) { + TextView tagTv = holder.getTextView(R.id.tagview); + tagTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + tagTv.setText(tag); + } + + // Comment number + if (commentNum != null) { + TextView commentTV = holder.getTextView(R.id.comment_num_tv); + commentTV.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); + commentTV.setText(commentNum); + ViewUtils.highlightCommentNum(commentTV); + } + } + + /** + * Apply font size with custom IDs + */ + public static void setTextWithSize(ViewHolder holder, int viewId, String text, float size) { + TextView tv = holder.getTextView(viewId); + tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); + tv.setText(text); + } + + /** + * Apply scaled font size to any TextView based on its current size + * @param textView The TextView to scale + */ + public static void applyScaledFontSize(TextView textView) { + float currentSize = textView.getTextSize(); + float scaledSize = currentSize * FontSizeUtil.getScalingRatio(); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledSize); + } + + /** + * Apply scaled font size to a TextView in ViewHolder + */ + public static void applyScaledFontSize(ViewHolder holder, int viewId) { + TextView tv = holder.getTextView(viewId); + applyScaledFontSize(tv); + } +} \ No newline at end of file From 8157ea48e0452269822f9dfa9dd1d4e596768211 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:12:35 +0800 Subject: [PATCH 04/10] feat: complete font size adaptation for all remaining UI components - Add font sizing to Message/Notification pages (MsgModule) - Add font sizing to Node navigation pages (NodesNavModule) - Add font sizing to Navigation drawer menu items and header - Add scaling support to NavNodesWrapper for node tags - Settings page uses system preferences (already scaled) All UI components now properly respond to font size preferences. --- .../ghui/v2er/injector/module/MsgModule.java | 25 +++++++---- .../v2er/injector/module/NodesNavModule.java | 8 +++- .../ghui/v2er/module/home/MainActivity.java | 44 +++++++++++++++++++ .../me/ghui/v2er/widget/NavNodesWrapper.java | 4 ++ 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/injector/module/MsgModule.java b/app/src/main/java/me/ghui/v2er/injector/module/MsgModule.java index 3437b824..0f90c475 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/MsgModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/MsgModule.java @@ -17,8 +17,11 @@ import me.ghui.v2er.module.user.UserHomeActivity; import me.ghui.v2er.network.bean.NotificationInfo; import me.ghui.v2er.util.Utils; +import me.ghui.v2er.util.ViewHolderFontHelper; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.LoadMoreRecyclerView; import me.ghui.v2er.widget.richtext.RichText; +import android.widget.TextView; /** * Created by ghui on 10/05/2017. @@ -41,19 +44,25 @@ protected void convert(ViewHolder holder, NotificationInfo.Reply reply, int posi GlideApp.with(mView.getContext()).load(reply.getAvatar()) .placeholder(R.drawable.avatar_placeholder_drawable) .into((ImageView) holder.getView(R.id.avatar_img)); + + // Apply font sizing CharSequence titleWithUserName = Utils.highlight(reply.getName() + " " + reply.getTitle(), true, new int[]{0, reply.getName().length()}); - holder.setText(R.id.msg_title_tv, titleWithUserName); - holder.getView(R.id.msg_content_tv); + TextView titleTv = holder.getTextView(R.id.msg_title_tv); + titleTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(titleWithUserName); + + TextView contentTv = holder.getTextView(R.id.msg_content_tv); if (!Check.isEmpty(reply.getContent())) { - holder.getView(R.id.msg_content_tv).setVisibility(View.VISIBLE); -// holder.setText(R.id.msg_content_tv, reply.getContent()); - RichText.from(reply.getContent()) - .into(holder.getTextView(R.id.msg_content_tv)); + contentTv.setVisibility(View.VISIBLE); + contentTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getContentSize()); + RichText.from(reply.getContent()).into(contentTv); } else { - holder.getView(R.id.msg_content_tv).setVisibility(View.GONE); + contentTv.setVisibility(View.GONE); } - holder.setText(R.id.time_tv, reply.getTime()); + + ViewHolderFontHelper.setTextWithSize(holder, R.id.time_tv, + reply.getTime(), FontSizeUtil.getSubTextSize()); } @Override diff --git a/app/src/main/java/me/ghui/v2er/injector/module/NodesNavModule.java b/app/src/main/java/me/ghui/v2er/injector/module/NodesNavModule.java index 14db1cd9..3100cd9f 100644 --- a/app/src/main/java/me/ghui/v2er/injector/module/NodesNavModule.java +++ b/app/src/main/java/me/ghui/v2er/injector/module/NodesNavModule.java @@ -9,6 +9,8 @@ import me.ghui.v2er.module.home.NodesNavFragment; import me.ghui.v2er.module.home.NodesNavPresenter; import me.ghui.v2er.network.bean.NodesNavInfo; +import me.ghui.v2er.util.ViewHolderFontHelper; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.NavNodesWrapper; /** @@ -28,9 +30,13 @@ public CommonAdapter provideAdapter() { return new CommonAdapter(mNavFragment.getContext(), R.layout.nodes_nav_item) { @Override protected void convert(ViewHolder holder, NodesNavInfo.Item item, int position) { - holder.setText(R.id.node_nav_category_tv, item.getCategory()); + // Apply font sizing for category title + ViewHolderFontHelper.setTextWithSize(holder, R.id.node_nav_category_tv, + item.getCategory(), FontSizeUtil.getTitleSize()); + NavNodesWrapper nodesWrapper = holder.getView(R.id.nodes_nav_node_wrapper); nodesWrapper.setData(item.getNodes()); + // The NavNodesWrapper should handle its own font sizing internally } }; } diff --git a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java index 09c70c67..5289ea05 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java @@ -53,6 +53,7 @@ import me.ghui.v2er.util.UserUtils; import me.ghui.v2er.util.Utils; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.widget.BaseToolBar; import me.ghui.v2er.widget.CSlidingTabLayout; import me.ghui.v2er.widget.FollowProgressBtn; @@ -169,6 +170,12 @@ protected void init() { mAvatarImg.setOnClickListener(this); mUserNameTv.setOnClickListener(this); mCheckInBtn.setOnClickListener(this); + + // Apply font size to navigation header + mUserNameTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + + // Apply font size scaling to navigation menu items + applyFontSizeToNavigationMenu(); mNightMenuItem = mNavigationView.getMenu().findItem(R.id.day_night_item); mAvatarImg.setOnLongClickListener(v -> { @@ -298,6 +305,43 @@ private void initCheckIn() { mCheckInPresenter.start(); } + private void applyFontSizeToNavigationMenu() { + Menu menu = mNavigationView.getMenu(); + float scalingRatio = FontSizeUtil.getScalingRatio(); + + // Apply text scaling to NavigationView items + // NavigationView uses internal text views that we need to scale + ViewGroup menuView = (ViewGroup) mNavigationView.getChildAt(0); + if (menuView != null && menuView instanceof RecyclerView) { + RecyclerView recyclerView = (RecyclerView) menuView; + recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { + @Override + public void onChildViewAttachedToWindow(View view) { + applyScalingToView(view); + } + + @Override + public void onChildViewDetachedFromWindow(View view) { + // No action needed + } + }); + } + } + + private void applyScalingToView(View view) { + if (view instanceof TextView) { + TextView textView = (TextView) view; + float currentSize = textView.getTextSize(); + float scaledSize = FontSizeUtil.getScaledSize(currentSize); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledSize); + } else if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + applyScalingToView(viewGroup.getChildAt(i)); + } + } + } + private void updateDrawLayout() { UserInfo userInfo = UserUtils.getUserInfo(); if (userInfo != null) { diff --git a/app/src/main/java/me/ghui/v2er/widget/NavNodesWrapper.java b/app/src/main/java/me/ghui/v2er/widget/NavNodesWrapper.java index 756677fd..a677c6ea 100644 --- a/app/src/main/java/me/ghui/v2er/widget/NavNodesWrapper.java +++ b/app/src/main/java/me/ghui/v2er/widget/NavNodesWrapper.java @@ -16,6 +16,8 @@ import me.ghui.v2er.network.bean.NodesNavInfo; import me.ghui.v2er.util.UriUtils; import me.ghui.v2er.util.Utils; +import me.ghui.v2er.util.FontSizeUtil; +import android.util.TypedValue; /** * Created by ghui on 22/05/2017. @@ -44,6 +46,8 @@ public void setData(List nodes) { view.setText(item.getName()); view.setTag(item.getLink()); view.setOnClickListener(this); + // Apply font size scaling for node tags + view.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getSubTextSize()); } int childCount = getChildCount(); int start = Utils.listSize(nodes); From 92a59f97867912c0e6b1a0b17269e8a5936ff5e7 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:16:30 +0800 Subject: [PATCH 05/10] fix: prevent duplicate font scaling and add settings page support - Fix sliding menu applying scaling multiple times on each open - Use tags to track already scaled views to prevent re-scaling - Save original text size to avoid cumulative scaling - Add font scaling support to PreferenceFragment settings page - Apply scaling to ListView items with scroll listener This ensures font scaling is only applied once per view and works correctly across all UI components including settings. --- .../ghui/v2er/module/home/MainActivity.java | 39 ++++++++--- .../v2er/module/settings/SettingFragment.java | 69 +++++++++++++++++++ app/src/main/res/values/ids.xml | 4 ++ 3 files changed, 104 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java index 5289ea05..12bdf131 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java @@ -306,18 +306,36 @@ private void initCheckIn() { } private void applyFontSizeToNavigationMenu() { - Menu menu = mNavigationView.getMenu(); - float scalingRatio = FontSizeUtil.getScalingRatio(); + // Apply font size based on preference + // This is better handled by setting text appearance in styles + // We'll use a post delay to ensure the menu is fully initialized + mNavigationView.postDelayed(() -> { + applyFontScalingToMenuItems(); + }, 100); + } - // Apply text scaling to NavigationView items - // NavigationView uses internal text views that we need to scale + private void applyFontScalingToMenuItems() { + // Apply scaling only once to avoid repeated scaling ViewGroup menuView = (ViewGroup) mNavigationView.getChildAt(0); if (menuView != null && menuView instanceof RecyclerView) { RecyclerView recyclerView = (RecyclerView) menuView; + // Apply to currently visible items + for (int i = 0; i < recyclerView.getChildCount(); i++) { + View child = recyclerView.getChildAt(i); + if (child != null && child.getTag(R.id.font_scaled_tag) == null) { + applyScalingToView(child); + child.setTag(R.id.font_scaled_tag, true); + } + } + + // Set up listener for future items but check if already scaled recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(View view) { - applyScalingToView(view); + if (view.getTag(R.id.font_scaled_tag) == null) { + applyScalingToView(view); + view.setTag(R.id.font_scaled_tag, true); + } } @Override @@ -331,9 +349,14 @@ public void onChildViewDetachedFromWindow(View view) { private void applyScalingToView(View view) { if (view instanceof TextView) { TextView textView = (TextView) view; - float currentSize = textView.getTextSize(); - float scaledSize = FontSizeUtil.getScaledSize(currentSize); - textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledSize); + // Save original size if not already saved + Object originalSize = textView.getTag(R.id.original_text_size_tag); + if (originalSize == null) { + textView.setTag(R.id.original_text_size_tag, textView.getTextSize()); + float baseSize = textView.getTextSize(); + float scaledSize = FontSizeUtil.getScaledSize(baseSize); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledSize); + } } else if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int i = 0; i < viewGroup.getChildCount(); i++) { diff --git a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java index bdc3c94b..2f2b50e0 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java @@ -10,7 +10,11 @@ import androidx.annotation.StringRes; import android.view.View; +import android.view.ViewGroup; import android.widget.ListView; +import android.widget.TextView; +import android.widget.Adapter; +import android.widget.ListAdapter; import me.ghui.v2er.util.Theme; import me.ghui.v2er.R; @@ -23,6 +27,7 @@ import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.util.GlideCatchUtil; import me.ghui.v2er.util.UserUtils; +import android.util.TypedValue; import me.ghui.v2er.util.Utils; import me.ghui.v2er.util.Voast; import me.ghui.v2er.widget.dialog.ConfirmDialog; @@ -88,6 +93,70 @@ public void onActivityCreated(Bundle savedInstanceState) { list.setDivider(null); // list.setDivider(getActivity().getDrawable(R.drawable.common_divider)); Utils.setPaddingForNavbar(list); + + // Apply font scaling to preference items + applyFontScalingToPreferences(list); + } + } + + private void applyFontScalingToPreferences(ListView listView) { + // Apply font scaling after a short delay to ensure views are created + listView.postDelayed(() -> { + float scalingRatio = FontSizeUtil.getScalingRatio(); + if (Math.abs(scalingRatio - 1.0f) < 0.01f) { + // No scaling needed for default size + return; + } + + // Apply to all visible items + for (int i = 0; i < listView.getChildCount(); i++) { + View child = listView.getChildAt(i); + applyFontScalingToView(child); + } + + // Add scroll listener to apply scaling to new items + listView.setOnScrollListener(new android.widget.AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(android.widget.AbsListView view, int scrollState) { + // Not needed + } + + @Override + public void onScroll(android.widget.AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + // Apply scaling to newly visible items + for (int i = 0; i < visibleItemCount; i++) { + View child = view.getChildAt(i); + if (child != null && child.getTag(R.id.font_scaled_tag) == null) { + applyFontScalingToView(child); + child.setTag(R.id.font_scaled_tag, true); + } + } + } + }); + }, 100); + } + + private void applyFontScalingToView(View view) { + if (view == null) return; + + if (view instanceof TextView) { + TextView textView = (TextView) view; + // Check if already scaled + if (textView.getTag(R.id.original_text_size_tag) == null) { + float originalSize = textView.getTextSize(); + textView.setTag(R.id.original_text_size_tag, originalSize); + float scaledSize = FontSizeUtil.getScaledSize(originalSize); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledSize); + } + } + + if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + View child = viewGroup.getChildAt(i); + applyFontScalingToView(child); + } } } diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index a1fe57bf..8c043c84 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -30,4 +30,8 @@ + + + + \ No newline at end of file From 4ab94af9ed6a4df14f727a9d848a3d35ad41328f Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:21:26 +0800 Subject: [PATCH 06/10] feat: add real-time font size update in settings page - Settings page now updates immediately when font size preference changes - Subscribe to TextSizeChangeEvent using EventBus - Clear all scaling tags before applying new font size - Reset text to original size before reapplying scaling - No need to exit and re-enter settings to see changes Users can now see font size changes instantly in the settings page itself. --- .../v2er/module/settings/SettingFragment.java | 69 +++++++++++++++++-- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java index 2f2b50e0..b6df4468 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java @@ -31,12 +31,15 @@ import me.ghui.v2er.util.Utils; import me.ghui.v2er.util.Voast; import me.ghui.v2er.widget.dialog.ConfirmDialog; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; /** * Created by ghui on 10/06/2017. */ public class SettingFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener { + private ListView mListView; private Preference cachePref; private Preference loginPreference; @@ -73,6 +76,9 @@ public void onCreate(Bundle savedInstanceState) { fontItem.setSummary(fontItem.getValue()); fontItem.setOnPreferenceChangeListener((preference, newValue) -> { fontItem.setSummary(newValue + ""); + // Clear all scaling tags before applying new scaling + clearFontScalingTags(); + // Post event will trigger onTextSizeChange to reapply scaling Bus.post(new TextSizeChangeEvent(FontSizeUtil.getContentSize())); return true; }); @@ -81,6 +87,13 @@ public void onCreate(Bundle savedInstanceState) { @Override public void onStart() { super.onStart(); + Bus.register(this); + } + + @Override + public void onStop() { + super.onStop(); + Bus.unRegister(this); } @Override @@ -88,14 +101,14 @@ public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); View rootView = getView(); rootView.setBackgroundColor(Theme.getColor(R.attr.page_bg_color, getActivity())); - ListView list = rootView.findViewById(android.R.id.list); - if (list != null) { - list.setDivider(null); -// list.setDivider(getActivity().getDrawable(R.drawable.common_divider)); - Utils.setPaddingForNavbar(list); + mListView = rootView.findViewById(android.R.id.list); + if (mListView != null) { + mListView.setDivider(null); +// mListView.setDivider(getActivity().getDrawable(R.drawable.common_divider)); + Utils.setPaddingForNavbar(mListView); // Apply font scaling to preference items - applyFontScalingToPreferences(list); + applyFontScalingToPreferences(mListView); } } @@ -137,6 +150,50 @@ public void onScroll(android.widget.AbsListView view, int firstVisibleItem, }, 100); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onTextSizeChange(TextSizeChangeEvent event) { + // Clear all existing scaling and reapply with new size + if (mListView != null) { + clearFontScalingTags(); + applyFontScalingToPreferences(mListView); + } + } + + private void clearFontScalingTags() { + if (mListView == null) return; + + // Clear tags from all visible items + for (int i = 0; i < mListView.getChildCount(); i++) { + View child = mListView.getChildAt(i); + clearTagsRecursively(child); + } + } + + private void clearTagsRecursively(View view) { + if (view == null) return; + + // Clear the scaling tags + view.setTag(R.id.font_scaled_tag, null); + view.setTag(R.id.original_text_size_tag, null); + + // Reset text size to original if it's a TextView + if (view instanceof TextView) { + TextView textView = (TextView) view; + Object originalSize = textView.getTag(R.id.original_text_size_tag); + if (originalSize instanceof Float) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, (Float) originalSize); + } + } + + // Recursively clear children + if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + clearTagsRecursively(viewGroup.getChildAt(i)); + } + } + } + private void applyFontScalingToView(View view) { if (view == null) return; From 8878d7d6d8e6e06713c159bdbff233af81cdfdab Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:28:05 +0800 Subject: [PATCH 07/10] fix: font size reduction now works correctly in settings - Restore original text size BEFORE clearing tags - Add small delay between clearing and reapplying scaling - This ensures text size can both increase and decrease properly Both enlarging and reducing font size now work correctly in real-time. --- .../v2er/module/settings/SettingFragment.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java index b6df4468..99def5ea 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java @@ -154,8 +154,12 @@ public void onScroll(android.widget.AbsListView view, int firstVisibleItem, public void onTextSizeChange(TextSizeChangeEvent event) { // Clear all existing scaling and reapply with new size if (mListView != null) { + // Clear tags and restore original sizes clearFontScalingTags(); - applyFontScalingToPreferences(mListView); + // Small delay to ensure views are restored before reapplying + mListView.postDelayed(() -> { + applyFontScalingToPreferences(mListView); + }, 50); } } @@ -172,11 +176,7 @@ private void clearFontScalingTags() { private void clearTagsRecursively(View view) { if (view == null) return; - // Clear the scaling tags - view.setTag(R.id.font_scaled_tag, null); - view.setTag(R.id.original_text_size_tag, null); - - // Reset text size to original if it's a TextView + // Reset text size to original if it's a TextView (BEFORE clearing tags) if (view instanceof TextView) { TextView textView = (TextView) view; Object originalSize = textView.getTag(R.id.original_text_size_tag); @@ -185,6 +185,10 @@ private void clearTagsRecursively(View view) { } } + // Clear the scaling tags AFTER restoring original size + view.setTag(R.id.font_scaled_tag, null); + view.setTag(R.id.original_text_size_tag, null); + // Recursively clear children if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; From 92684fa3943124af437bb332486a3c12f34abc81 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:32:56 +0800 Subject: [PATCH 08/10] feat: add font size support to home filter menu - Apply dynamic font sizing to filter menu tab items - Tab titles now scale according to user font size preference - Uses getTitleSize() for consistent sizing with other UI elements Filter menu now properly responds to font size settings. --- .../main/java/me/ghui/v2er/module/home/HomeFilterMenu.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/me/ghui/v2er/module/home/HomeFilterMenu.java b/app/src/main/java/me/ghui/v2er/module/home/HomeFilterMenu.java index d8993191..7c527ef3 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/HomeFilterMenu.java +++ b/app/src/main/java/me/ghui/v2er/module/home/HomeFilterMenu.java @@ -9,8 +9,10 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.TextView; +import android.util.TypedValue; import me.ghui.v2er.util.Theme; +import me.ghui.v2er.util.FontSizeUtil; import me.ghui.v2er.R; import me.ghui.v2er.adapter.base.CommonAdapter; import me.ghui.v2er.adapter.base.MultiItemTypeAdapter; @@ -80,7 +82,10 @@ private void initView() { CommonAdapter adapter = new CommonAdapter(mContext, R.layout.tab_info_item) { @Override protected void convert(ViewHolder holder, TabInfo tabInfo, int position) { - holder.setText(R.id.tab_title_tv, tabInfo.title); + TextView titleTv = holder.getTextView(R.id.tab_title_tv); + // Apply font size scaling + titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize()); + titleTv.setText(tabInfo.title); } }; adapter.setData(TabInfo.getDefault()); From 7373ac0deabd31f7e05844b6fcab90ab12df3f7f Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:36:42 +0800 Subject: [PATCH 09/10] fix: address PR review comments - Refactor FontSizeUtil to reduce code duplication by extracting common helper method - Change layout margin from 8dp to 2dp as requested - Adjust line spacing multiplier from 1.3 to 1.1 for better readability Addresses feedback from Copilot and @graycreate in PR #131 --- .../java/me/ghui/v2er/util/FontSizeUtil.java | 74 +++++++++---------- app/src/main/res/layout/common_list_item.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java index e7f0e3b1..beb9ff95 100644 --- a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java +++ b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java @@ -6,64 +6,60 @@ public class FontSizeUtil { - public static float getContentSize() { + /** + * Common helper method to get font dimension based on size preference + * @param smallDimen dimension resource for "小" size + * @param mediumDimen dimension resource for "中" size (default) + * @param largeDimen dimension resource for "大" size + * @param extraLargeDimen dimension resource for "特大" size + * @return font size in pixels + */ + private static float getFontSizeForPreference(int smallDimen, int mediumDimen, + int largeDimen, int extraLargeDimen) { String size = Pref.read(R.string.pref_key_fontsize); int id; switch (size) { case "小": - id = R.dimen.smallTextSize; + id = smallDimen; break; case "大": - id = R.dimen.largeTextSize; + id = largeDimen; break; case "特大": - id = R.dimen.extralargeTextSize; + id = extraLargeDimen; break; case "中": default: - id = R.dimen.mediumTextSize; + id = mediumDimen; } return App.get().getResources().getDimension(id); } + public static float getContentSize() { + return getFontSizeForPreference( + R.dimen.smallTextSize, + R.dimen.mediumTextSize, + R.dimen.largeTextSize, + R.dimen.extralargeTextSize + ); + } + public static float getTitleSize() { - String size = Pref.read(R.string.pref_key_fontsize); - int id; - switch (size) { - case "小": - id = R.dimen.smallTextSize; - break; - case "大": - id = R.dimen.largeTextSize; - break; - case "特大": - id = R.dimen.extralargeTextSize; - break; - case "中": - default: - id = R.dimen.mediumTextSize; - } - return App.get().getResources().getDimension(id); + return getFontSizeForPreference( + R.dimen.smallTextSize, + R.dimen.mediumTextSize, + R.dimen.largeTextSize, + R.dimen.extralargeTextSize + ); } public static float getSubTextSize() { - String size = Pref.read(R.string.pref_key_fontsize); - int id; - switch (size) { - case "小": - id = R.dimen.microTextSize; - break; - case "大": - id = R.dimen.mediumTextSize; - break; - case "特大": - id = R.dimen.largeTextSize; - break; - case "中": - default: - id = R.dimen.smallTextSize; - } - return App.get().getResources().getDimension(id); + return getFontSizeForPreference( + R.dimen.microTextSize, + R.dimen.smallTextSize, + R.dimen.mediumTextSize, + R.dimen.largeTextSize + ); } public static float getHtmlFontSize() { diff --git a/app/src/main/res/layout/common_list_item.xml b/app/src/main/res/layout/common_list_item.xml index 3bf54fb3..27d70e17 100644 --- a/app/src/main/res/layout/common_list_item.xml +++ b/app/src/main/res/layout/common_list_item.xml @@ -13,7 +13,7 @@ android:id="@+id/title_tv" style="@style/TopicTitle" android:layout_below="@id/time_tv" - android:layout_marginTop="8dp" + android:layout_marginTop="2dp" tools:text="[macOS]有人用 magnet 分屏的吗?好像有会导致系统卡顿的奇怪是的呵呵,里" /> @dimen/mediumTextSize normal 6dp - 1.3 + 1.1 From f63af0e0f93325ea9ac6213ecbb72eebaa2303a8 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 20 Sep 2025 20:44:14 +0800 Subject: [PATCH 10/10] fix: address Copilot review comments for code quality - Extract magic number 0.01f to SCALING_THRESHOLD constant in SettingFragment - Extract scaling ratios to named constants in FontSizeUtil for better maintainability - Fix potential duplicate scroll listeners by checking if already set - Simplify instanceof check in MainActivity (remove unnecessary null check) - Add field to track scroll listener to prevent duplicates Addresses all code quality feedback from Copilot in PR #131 --- .../java/me/ghui/v2er/module/home/MainActivity.java | 4 ++-- .../ghui/v2er/module/settings/SettingFragment.java | 13 +++++++++---- .../main/java/me/ghui/v2er/util/FontSizeUtil.java | 13 +++++++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java index 12bdf131..651fa563 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java @@ -316,8 +316,8 @@ private void applyFontSizeToNavigationMenu() { private void applyFontScalingToMenuItems() { // Apply scaling only once to avoid repeated scaling - ViewGroup menuView = (ViewGroup) mNavigationView.getChildAt(0); - if (menuView != null && menuView instanceof RecyclerView) { + View menuView = mNavigationView.getChildAt(0); + if (menuView instanceof RecyclerView) { RecyclerView recyclerView = (RecyclerView) menuView; // Apply to currently visible items for (int i = 0; i < recyclerView.getChildCount(); i++) { diff --git a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java index 99def5ea..39bdaf34 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java @@ -39,7 +39,9 @@ */ public class SettingFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener { + private static final float SCALING_THRESHOLD = 0.01f; private ListView mListView; + private android.widget.AbsListView.OnScrollListener mScrollListener; private Preference cachePref; private Preference loginPreference; @@ -116,7 +118,7 @@ private void applyFontScalingToPreferences(ListView listView) { // Apply font scaling after a short delay to ensure views are created listView.postDelayed(() -> { float scalingRatio = FontSizeUtil.getScalingRatio(); - if (Math.abs(scalingRatio - 1.0f) < 0.01f) { + if (Math.abs(scalingRatio - 1.0f) < SCALING_THRESHOLD) { // No scaling needed for default size return; } @@ -127,8 +129,9 @@ private void applyFontScalingToPreferences(ListView listView) { applyFontScalingToView(child); } - // Add scroll listener to apply scaling to new items - listView.setOnScrollListener(new android.widget.AbsListView.OnScrollListener() { + // Add scroll listener to apply scaling to new items (only if not already set) + if (mScrollListener == null) { + mScrollListener = new android.widget.AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(android.widget.AbsListView view, int scrollState) { // Not needed @@ -146,7 +149,9 @@ public void onScroll(android.widget.AbsListView view, int firstVisibleItem, } } } - }); + }; + listView.setOnScrollListener(mScrollListener); + } }, 100); } diff --git a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java index beb9ff95..6d5a6ab7 100644 --- a/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java +++ b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java @@ -5,6 +5,11 @@ import me.ghui.v2er.general.Pref; public class FontSizeUtil { + // Scaling ratio constants + private static final float SMALL_SCALE = 0.875f; // 87.5% of default + private static final float MEDIUM_SCALE = 1.0f; // 100% default + private static final float LARGE_SCALE = 1.25f; // 125% of default + private static final float EXTRA_LARGE_SCALE = 1.5f; // 150% of default /** * Common helper method to get font dimension based on size preference @@ -75,14 +80,14 @@ public static float getScalingRatio() { String size = Pref.read(R.string.pref_key_fontsize); switch (size) { case "小": - return 0.875f; // 87.5% of default + return SMALL_SCALE; case "大": - return 1.25f; // 125% of default + return LARGE_SCALE; case "特大": - return 1.5f; // 150% of default + return EXTRA_LARGE_SCALE; case "中": default: - return 1.0f; // 100% default + return MEDIUM_SCALE; } }