Skip to content

Commit 0cba533

Browse files
graycreateclaude
andauthored
fix: improve font size and layout for better accessibility (#39)
## Summary - Increased font sizes across all settings (7-20% improvement) - Implemented dynamic font scaling throughout the application - Added ViewHolderFontHelper to centralize font management - Fixed layout overlapping issues - Improved dark mode text contrast - Added real-time font size updates in settings - Extended font support to all UI components ## Key Changes - Font dimensions: Small to Extra Large sizes increased for better readability - Scaling ratios: 0.875x (small) to 1.5x (extra large) - Line spacing improved for better text readability - All UI components now respond to font preferences - Settings page updates in real-time when changing font size - Code refactored to eliminate duplication with helper methods - Added constants for better maintainability Fixes #39 Co-authored-by: Claude <noreply@anthropic.com>
1 parent 03ef207 commit 0cba533

20 files changed

+499
-72
lines changed

app/src/main/java/me/ghui/v2er/injector/module/DailyHotModule.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import me.ghui.v2er.module.user.UserHomeActivity;
1818
import me.ghui.v2er.network.bean.DailyHotInfo;
1919
import me.ghui.v2er.util.ViewUtils;
20+
import me.ghui.v2er.util.ViewHolderFontHelper;
2021

2122
/**
2223
* Created by ghui on 27/03/2017.
@@ -41,13 +42,14 @@ protected void convert(ViewHolder holder, DailyHotInfo.Item item, int position)
4142
.load(item.getMember().getAvatar())
4243
.placeholder(R.drawable.avatar_placeholder_drawable)
4344
.into((ImageView) holder.getView(R.id.avatar_img));
44-
holder.setText(R.id.user_name_tv, item.getMember().getUserName());
45-
holder.setText(R.id.time_tv, item.getTime());
46-
holder.setText(R.id.tagview, item.getNode().getTitle());
47-
holder.setText(R.id.title_tv, item.getTitle());
48-
TextView commentTV = holder.getTextView(R.id.comment_num_tv);
49-
commentTV.setText("评论" + item.getReplies());
50-
ViewUtils.highlightCommentNum(commentTV);
45+
46+
// Use centralized font helper
47+
ViewHolderFontHelper.applyCommonListItemFonts(holder,
48+
item.getTitle(),
49+
item.getMember().getUserName(),
50+
item.getTime(),
51+
item.getNode().getTitle(),
52+
"评论" + item.getReplies());
5153
}
5254

5355
@Override

app/src/main/java/me/ghui/v2er/injector/module/MsgModule.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
import me.ghui.v2er.module.user.UserHomeActivity;
1818
import me.ghui.v2er.network.bean.NotificationInfo;
1919
import me.ghui.v2er.util.Utils;
20+
import me.ghui.v2er.util.ViewHolderFontHelper;
21+
import me.ghui.v2er.util.FontSizeUtil;
2022
import me.ghui.v2er.widget.LoadMoreRecyclerView;
2123
import me.ghui.v2er.widget.richtext.RichText;
24+
import android.widget.TextView;
2225

2326
/**
2427
* Created by ghui on 10/05/2017.
@@ -41,19 +44,25 @@ protected void convert(ViewHolder holder, NotificationInfo.Reply reply, int posi
4144
GlideApp.with(mView.getContext()).load(reply.getAvatar())
4245
.placeholder(R.drawable.avatar_placeholder_drawable)
4346
.into((ImageView) holder.getView(R.id.avatar_img));
47+
48+
// Apply font sizing
4449
CharSequence titleWithUserName = Utils.highlight(reply.getName() + " " + reply.getTitle(),
4550
true, new int[]{0, reply.getName().length()});
46-
holder.setText(R.id.msg_title_tv, titleWithUserName);
47-
holder.getView(R.id.msg_content_tv);
51+
TextView titleTv = holder.getTextView(R.id.msg_title_tv);
52+
titleTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize());
53+
titleTv.setText(titleWithUserName);
54+
55+
TextView contentTv = holder.getTextView(R.id.msg_content_tv);
4856
if (!Check.isEmpty(reply.getContent())) {
49-
holder.getView(R.id.msg_content_tv).setVisibility(View.VISIBLE);
50-
// holder.setText(R.id.msg_content_tv, reply.getContent());
51-
RichText.from(reply.getContent())
52-
.into(holder.getTextView(R.id.msg_content_tv));
57+
contentTv.setVisibility(View.VISIBLE);
58+
contentTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getContentSize());
59+
RichText.from(reply.getContent()).into(contentTv);
5360
} else {
54-
holder.getView(R.id.msg_content_tv).setVisibility(View.GONE);
61+
contentTv.setVisibility(View.GONE);
5562
}
56-
holder.setText(R.id.time_tv, reply.getTime());
63+
64+
ViewHolderFontHelper.setTextWithSize(holder, R.id.time_tv,
65+
reply.getTime(), FontSizeUtil.getSubTextSize());
5766
}
5867

5968
@Override

app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import me.ghui.v2er.network.bean.NewsInfo;
1919
import me.ghui.v2er.util.L;
2020
import me.ghui.v2er.util.ViewUtils;
21+
import me.ghui.v2er.util.ViewHolderFontHelper;
2122
import me.ghui.v2er.widget.LoadMoreRecyclerView;
2223

2324
/**
@@ -52,13 +53,14 @@ protected void convert(ViewHolder holder, NewsInfo.Item item, int position) {
5253
.load(item.getAvatar())
5354
.placeholder(R.drawable.avatar_placeholder_drawable)
5455
.into(holder.getImgView(R.id.avatar_img));
55-
holder.setText(R.id.user_name_tv, item.getUserName());
56-
holder.setText(R.id.time_tv, item.getTime());
57-
holder.setText(R.id.tagview, item.getTagName());
58-
holder.setText(R.id.title_tv, item.getTitle());
59-
TextView commentTV = holder.getTextView(R.id.comment_num_tv);
60-
commentTV.setText("评论" + item.getReplies());
61-
ViewUtils.highlightCommentNum(commentTV);
56+
57+
// Use centralized font helper
58+
ViewHolderFontHelper.applyCommonListItemFonts(holder,
59+
item.getTitle(),
60+
item.getUserName(),
61+
item.getTime(),
62+
item.getTagName(),
63+
"评论" + item.getReplies());
6264
}
6365

6466
@Override

app/src/main/java/me/ghui/v2er/injector/module/NodeTopicModule.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import me.ghui.v2er.module.user.UserHomeActivity;
1616
import me.ghui.v2er.network.bean.NodeTopicInfo;
1717
import me.ghui.v2er.util.ViewUtils;
18+
import me.ghui.v2er.util.ViewHolderFontHelper;
19+
import me.ghui.v2er.util.FontSizeUtil;
1820
import me.ghui.v2er.widget.LoadMoreRecyclerView;
1921

2022
/**
@@ -40,11 +42,18 @@ protected void convert(ViewHolder holder, NodeTopicInfo.Item item, int position)
4042
.load(item.getAvatar())
4143
.placeholder(R.drawable.avatar_placeholder_drawable)
4244
.into((ImageView) holder.getView(R.id.avatar_img));
43-
holder.setText(R.id.user_name_tv, item.getUserName());
44-
holder.setText(R.id.title_tv, item.getTitle());
45-
holder.setText(R.id.click_count_tv, "点击" + item.getClickNum());
45+
46+
// Use helper methods for cleaner code
47+
ViewHolderFontHelper.setTextWithSize(holder, R.id.title_tv,
48+
item.getTitle(), FontSizeUtil.getTitleSize());
49+
ViewHolderFontHelper.setTextWithSize(holder, R.id.user_name_tv,
50+
item.getUserName(), FontSizeUtil.getSubTextSize());
51+
ViewHolderFontHelper.setTextWithSize(holder, R.id.click_count_tv,
52+
"点击" + item.getClickNum(), FontSizeUtil.getSubTextSize());
53+
4654
TextView commentTV = holder.getTextView(R.id.comment_num_tv);
47-
commentTV.setText("评论" + item.getCommentNum());
55+
ViewHolderFontHelper.setTextWithSize(holder, R.id.comment_num_tv,
56+
"评论" + item.getCommentNum(), FontSizeUtil.getSubTextSize());
4857
ViewUtils.highlightCommentNum(commentTV);
4958
}
5059

app/src/main/java/me/ghui/v2er/injector/module/NodesNavModule.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import me.ghui.v2er.module.home.NodesNavFragment;
1010
import me.ghui.v2er.module.home.NodesNavPresenter;
1111
import me.ghui.v2er.network.bean.NodesNavInfo;
12+
import me.ghui.v2er.util.ViewHolderFontHelper;
13+
import me.ghui.v2er.util.FontSizeUtil;
1214
import me.ghui.v2er.widget.NavNodesWrapper;
1315

1416
/**
@@ -28,9 +30,13 @@ public CommonAdapter<NodesNavInfo.Item> provideAdapter() {
2830
return new CommonAdapter<NodesNavInfo.Item>(mNavFragment.getContext(), R.layout.nodes_nav_item) {
2931
@Override
3032
protected void convert(ViewHolder holder, NodesNavInfo.Item item, int position) {
31-
holder.setText(R.id.node_nav_category_tv, item.getCategory());
33+
// Apply font sizing for category title
34+
ViewHolderFontHelper.setTextWithSize(holder, R.id.node_nav_category_tv,
35+
item.getCategory(), FontSizeUtil.getTitleSize());
36+
3237
NavNodesWrapper nodesWrapper = holder.getView(R.id.nodes_nav_node_wrapper);
3338
nodesWrapper.setData(item.getNodes());
39+
// The NavNodesWrapper should handle its own font sizing internally
3440
}
3541
};
3642
}

app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import me.ghui.v2er.network.bean.SoV2EXSearchResultInfo;
1313
import me.ghui.v2er.widget.LoadMoreRecyclerView;
1414
import me.ghui.v2er.widget.richtext.RichText;
15+
import me.ghui.v2er.util.ViewHolderFontHelper;
16+
import me.ghui.v2er.util.FontSizeUtil;
1517

1618
/**
1719
* Created by ghui on 02/06/2017.
@@ -35,9 +37,16 @@ public LoadMoreRecyclerView.Adapter<SoV2EXSearchResultInfo.Hit> provideAdapter()
3537
return new CommonLoadMoreAdapter<SoV2EXSearchResultInfo.Hit>(mFragment.getContext(), R.layout.item_bing_search) {
3638
@Override
3739
protected void convert(ViewHolder holder, SoV2EXSearchResultInfo.Hit hit, int position) {
38-
holder.setText(R.id.search_result_title_tv, hit.getSource().getTitle());
40+
// Use helper for cleaner code
41+
ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_title_tv,
42+
hit.getSource().getTitle(), FontSizeUtil.getTitleSize());
43+
3944
String footnote = hit.getSource().getCreator() + " 于 " + hit.getSource().getTime() + " 发表, " + hit.getSource().getReplies() + " 回复";
40-
holder.setText(R.id.search_result_footnote_tv, footnote);
45+
ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_footnote_tv,
46+
footnote, FontSizeUtil.getSubTextSize());
47+
48+
ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_content_tv,
49+
"", FontSizeUtil.getContentSize());
4150
RichText.from(hit.getSource().getContent())
4251
.supportUrlClick(false)
4352
.into(holder.getTextView(R.id.search_result_content_tv));

app/src/main/java/me/ghui/v2er/injector/module/SpecialCareModule.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import me.ghui.v2er.module.user.UserHomeActivity;
2020
import me.ghui.v2er.network.bean.CareInfo;
2121
import me.ghui.v2er.util.ViewUtils;
22+
import me.ghui.v2er.util.ViewHolderFontHelper;
2223
import me.ghui.v2er.widget.LoadMoreRecyclerView;
2324

2425
/**
@@ -43,19 +44,21 @@ protected void convert(ViewHolder holder, CareInfo.Item item, int position) {
4344
.load(item.getAvatar())
4445
.placeholder(R.drawable.avatar_placeholder_drawable)
4546
.into((ImageView) holder.getView(R.id.avatar_img));
46-
holder.setText(R.id.user_name_tv, item.getUserName());
47-
// TODO: 2018/6/9 time is null
48-
if (Check.isEmpty(item.getTime())) {
47+
48+
// Use centralized font helper - handle null time
49+
String timeText = Check.isEmpty(item.getTime()) ? null : item.getTime();
50+
if (timeText == null) {
4951
holder.getView(R.id.time_tv).setVisibility(View.INVISIBLE);
5052
} else {
5153
holder.getView(R.id.time_tv).setVisibility(View.VISIBLE);
52-
holder.setText(R.id.time_tv, item.getTime());
5354
}
54-
holder.setText(R.id.tagview, item.getTagName());
55-
holder.setText(R.id.title_tv, item.getTitle());
56-
TextView commentTV = holder.getTextView(R.id.comment_num_tv);
57-
commentTV.setText("评论" + item.getComentNum());
58-
ViewUtils.highlightCommentNum(commentTV);
55+
56+
ViewHolderFontHelper.applyCommonListItemFonts(holder,
57+
item.getTitle(),
58+
item.getUserName(),
59+
timeText,
60+
item.getTagName(),
61+
"评论" + item.getComentNum());
5962
}
6063

6164
@Override

app/src/main/java/me/ghui/v2er/injector/module/TopicStarModule.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import me.ghui.v2er.module.user.UserHomeActivity;
1818
import me.ghui.v2er.network.bean.TopicStarInfo;
1919
import me.ghui.v2er.util.ViewUtils;
20+
import me.ghui.v2er.util.ViewHolderFontHelper;
2021
import me.ghui.v2er.widget.LoadMoreRecyclerView;
2122

2223
/**
@@ -40,13 +41,14 @@ protected void convert(ViewHolder holder, TopicStarInfo.Item item, int position)
4041
.load(item.getAvatar())
4142
.placeholder(R.drawable.avatar_placeholder_drawable)
4243
.into((ImageView) holder.getView(R.id.avatar_img));
43-
holder.setText(R.id.user_name_tv, item.getUserName());
44-
holder.setText(R.id.time_tv, item.getTime());
45-
holder.setText(R.id.tagview, item.getTag());
46-
holder.setText(R.id.title_tv, item.getTitle());
47-
TextView commentTV = holder.getTextView(R.id.comment_num_tv);
48-
commentTV.setText("评论" + item.getCommentNum());
49-
ViewUtils.highlightCommentNum(commentTV);
44+
45+
// Use centralized font helper
46+
ViewHolderFontHelper.applyCommonListItemFonts(holder,
47+
item.getTitle(),
48+
item.getUserName(),
49+
item.getTime(),
50+
item.getTag(),
51+
"评论" + item.getCommentNum());
5052
}
5153

5254
@Override

app/src/main/java/me/ghui/v2er/injector/module/UserHomeModule.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import me.ghui.v2er.module.user.UserHomePresenter;
1616
import me.ghui.v2er.network.bean.UserPageInfo;
1717
import me.ghui.v2er.util.ViewUtils;
18+
import me.ghui.v2er.util.ViewHolderFontHelper;
19+
import me.ghui.v2er.util.FontSizeUtil;
1820
import me.ghui.v2er.widget.richtext.RichText;
1921

2022
/**
@@ -60,13 +62,14 @@ public boolean isForViewType(@Nullable UserPageInfo.Item item, int position) {
6062
@Override
6163
public void convert(ViewHolder holder, UserPageInfo.Item item, int position) {
6264
UserPageInfo.TopicItem topicItem = (UserPageInfo.TopicItem) item;
63-
holder.setText(R.id.user_name_tv, topicItem.getUserName());
64-
holder.setText(R.id.time_tv, topicItem.getTime());
65-
holder.setText(R.id.tagview, topicItem.getTag());
66-
holder.setText(R.id.title_tv, topicItem.getTitle());
67-
TextView commentTV = holder.getTextView(R.id.comment_num_tv);
68-
commentTV.setText("评论" + topicItem.getReplyNum());
69-
ViewUtils.highlightCommentNum(commentTV);
65+
66+
// Use centralized font helper
67+
ViewHolderFontHelper.applyCommonListItemFonts(holder,
68+
topicItem.getTitle(),
69+
topicItem.getUserName(),
70+
topicItem.getTime(),
71+
topicItem.getTag(),
72+
"评论" + topicItem.getReplyNum());
7073
}
7174
});
7275

@@ -84,11 +87,19 @@ public boolean isForViewType(@Nullable UserPageInfo.Item item, int position) {
8487
@Override
8588
public void convert(ViewHolder holder, UserPageInfo.Item item, int position) {
8689
UserPageInfo.ReplyItem replyItem = (UserPageInfo.ReplyItem) item;
87-
holder.setText(R.id.reply_title_tv, replyItem.getTitle());
90+
91+
// Use helper for cleaner code
92+
ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_title_tv,
93+
replyItem.getTitle(), FontSizeUtil.getTitleSize());
94+
95+
ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_content_tv,
96+
"", FontSizeUtil.getContentSize());
8897
RichText.from(replyItem.getContent())
8998
.widthDelta(43)
9099
.into(holder.getTextView(R.id.reply_content_tv));
91-
holder.setText(R.id.reply_time_tv, replyItem.getTime());
100+
101+
ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_time_tv,
102+
replyItem.getTime(), FontSizeUtil.getSubTextSize());
92103
}
93104
});
94105

app/src/main/java/me/ghui/v2er/module/home/HomeFilterMenu.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
import android.view.animation.Animation;
1010
import android.view.animation.AnimationUtils;
1111
import android.widget.TextView;
12+
import android.util.TypedValue;
1213

1314
import me.ghui.v2er.util.Theme;
15+
import me.ghui.v2er.util.FontSizeUtil;
1416
import me.ghui.v2er.R;
1517
import me.ghui.v2er.adapter.base.CommonAdapter;
1618
import me.ghui.v2er.adapter.base.MultiItemTypeAdapter;
@@ -80,7 +82,10 @@ private void initView() {
8082
CommonAdapter<TabInfo> adapter = new CommonAdapter<TabInfo>(mContext, R.layout.tab_info_item) {
8183
@Override
8284
protected void convert(ViewHolder holder, TabInfo tabInfo, int position) {
83-
holder.setText(R.id.tab_title_tv, tabInfo.title);
85+
TextView titleTv = holder.getTextView(R.id.tab_title_tv);
86+
// Apply font size scaling
87+
titleTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, FontSizeUtil.getTitleSize());
88+
titleTv.setText(tabInfo.title);
8489
}
8590
};
8691
adapter.setData(TabInfo.getDefault());

0 commit comments

Comments
 (0)