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..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,6 +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.ViewHolderFontHelper; /** * Created by ghui on 27/03/2017. @@ -41,13 +42,14 @@ 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()); - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - 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/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/NewsModule.java b/app/src/main/java/me/ghui/v2er/injector/module/NewsModule.java index 7d665734..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,6 +18,7 @@ import me.ghui.v2er.network.bean.NewsInfo; import me.ghui.v2er.util.L; import me.ghui.v2er.util.ViewUtils; +import me.ghui.v2er.util.ViewHolderFontHelper; import me.ghui.v2er.widget.LoadMoreRecyclerView; /** @@ -52,13 +53,14 @@ 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()); - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - 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 9b102812..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,6 +15,8 @@ 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; /** @@ -40,11 +42,18 @@ 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()); + + // 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.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/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/injector/module/SearchModule.java b/app/src/main/java/me/ghui/v2er/injector/module/SearchModule.java index f5ae5691..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,6 +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; /** * Created by ghui on 02/06/2017. @@ -35,9 +37,16 @@ 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()); + // 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() + " 回复"; - holder.setText(R.id.search_result_footnote_tv, footnote); + ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_footnote_tv, + footnote, FontSizeUtil.getSubTextSize()); + + ViewHolderFontHelper.setTextWithSize(holder, R.id.search_result_content_tv, + "", FontSizeUtil.getContentSize()); RichText.from(hit.getSource().getContent()) .supportUrlClick(false) .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 7b028fee..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,6 +19,7 @@ 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.ViewHolderFontHelper; import me.ghui.v2er.widget.LoadMoreRecyclerView; /** @@ -43,19 +44,21 @@ 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()); - // TODO: 2018/6/9 time is null - if (Check.isEmpty(item.getTime())) { + + // 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 { holder.getView(R.id.time_tv).setVisibility(View.VISIBLE); - holder.setText(R.id.time_tv, item.getTime()); } - holder.setText(R.id.tagview, item.getTagName()); - holder.setText(R.id.title_tv, item.getTitle()); - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - 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 3b729921..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,6 +17,7 @@ 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.ViewHolderFontHelper; import me.ghui.v2er.widget.LoadMoreRecyclerView; /** @@ -40,13 +41,14 @@ 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()); - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - 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 39cab6d5..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,6 +15,8 @@ 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; /** @@ -60,13 +62,14 @@ 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()); - TextView commentTV = holder.getTextView(R.id.comment_num_tv); - commentTV.setText("评论" + topicItem.getReplyNum()); - ViewUtils.highlightCommentNum(commentTV); + + // Use centralized font helper + ViewHolderFontHelper.applyCommonListItemFonts(holder, + topicItem.getTitle(), + topicItem.getUserName(), + topicItem.getTime(), + topicItem.getTag(), + "评论" + topicItem.getReplyNum()); } }); @@ -84,11 +87,19 @@ 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()); + + // Use helper for cleaner code + ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_title_tv, + replyItem.getTitle(), FontSizeUtil.getTitleSize()); + + ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_content_tv, + "", 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()); + + ViewHolderFontHelper.setTextWithSize(holder, R.id.reply_time_tv, + replyItem.getTime(), FontSizeUtil.getSubTextSize()); } }); 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()); 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..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 @@ -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,66 @@ private void initCheckIn() { mCheckInPresenter.start(); } + private void applyFontSizeToNavigationMenu() { + // 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); + } + + private void applyFontScalingToMenuItems() { + // Apply scaling only once to avoid repeated scaling + 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++) { + 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) { + if (view.getTag(R.id.font_scaled_tag) == null) { + applyScalingToView(view); + view.setTag(R.id.font_scaled_tag, true); + } + } + + @Override + public void onChildViewDetachedFromWindow(View view) { + // No action needed + } + }); + } + } + + private void applyScalingToView(View view) { + if (view instanceof TextView) { + TextView textView = (TextView) view; + // 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++) { + applyScalingToView(viewGroup.getChildAt(i)); + } + } + } + private void updateDrawLayout() { UserInfo userInfo = UserUtils.getUserInfo(); if (userInfo != null) { 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..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 @@ -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,15 +27,21 @@ 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; +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 static final float SCALING_THRESHOLD = 0.01f; + private ListView mListView; + private android.widget.AbsListView.OnScrollListener mScrollListener; private Preference cachePref; private Preference loginPreference; @@ -68,6 +78,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; }); @@ -76,6 +89,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 @@ -83,11 +103,126 @@ 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(mListView); + } + } + + 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) < SCALING_THRESHOLD) { + // 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 (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 + } + + @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); + } + } + } + }; + listView.setOnScrollListener(mScrollListener); + } + }, 100); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onTextSizeChange(TextSizeChangeEvent event) { + // Clear all existing scaling and reapply with new size + if (mListView != null) { + // Clear tags and restore original sizes + clearFontScalingTags(); + // Small delay to ensure views are restored before reapplying + mListView.postDelayed(() -> { + applyFontScalingToPreferences(mListView); + }, 50); + } + } + + 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; + + // 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); + if (originalSize instanceof Float) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, (Float) originalSize); + } + } + + // 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; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + clearTagsRecursively(viewGroup.getChildAt(i)); + } + } + } + + 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/java/me/ghui/v2er/util/FontSizeUtil.java b/app/src/main/java/me/ghui/v2er/util/FontSizeUtil.java index 3a7da459..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,29 +5,99 @@ 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 - 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() { + return getFontSizeForPreference( + R.dimen.smallTextSize, + R.dimen.mediumTextSize, + R.dimen.largeTextSize, + R.dimen.extralargeTextSize + ); + } + + public static float getSubTextSize() { + return getFontSizeForPreference( + R.dimen.microTextSize, + R.dimen.smallTextSize, + R.dimen.mediumTextSize, + R.dimen.largeTextSize + ); + } + 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 SMALL_SCALE; + case "大": + return LARGE_SCALE; + case "特大": + return EXTRA_LARGE_SCALE; + case "中": + default: + return MEDIUM_SCALE; + } + } + + /** + * 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 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); diff --git a/app/src/main/res/layout/common_list_item.xml b/app/src/main/res/layout/common_list_item.xml index b9b688cc..27d70e17 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/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 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e43ecda0..6a7fac8a 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.1