如何在同一Android应用的单个布局中设置RTL,其他布局不设置?
如何在同一Android应用的单个布局中设置RTL,其他布局不设置?
嘿,我懂你现在的处境——用AppCompatDelegate.setApplicationLocales(LocaleListCompat.create(Locale.forLanguageTag(sLang)));全局开RTL确实省心,但碰到这种要单独给某个Tab页、某个表格布局改方向,其他页面保持原样的场景,全局设置就不太灵光了,尤其是你还在复用BaseAdapter做文本表格,得精准控制对吧?
给你分享几个适配你场景的实用方法:
单个布局/View的局部RTL设置
不用动全局Locale,直接给目标布局的根View单独设置布局方向就行,这样只有这个View及其子View会变成RTL,其他页面完全不受影响,刚好适配你Tab页分开控制的需求。
Java代码示例:// 找到你要改的那个布局的根View View targetTabLayout = findViewById(R.id.target_tab_root_layout); targetTabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);Kotlin代码示例:
val targetTabLayout = findViewById<View>(R.id.target_tab_root_layout) targetTabLayout.layoutDirection = View.LAYOUT_DIRECTION_RTL复用BaseAdapter的文本表格适配
因为你是同一个BaseAdapter给不同Tab用,甚至同数据不同过滤规则,那可以给Adapter加个布局方向的参数,在创建Adapter的时候按需传入,在渲染单元格时应用方向:- 先修改你的BaseAdapter,加个参数保存布局方向:
public class YourTextTableAdapter extends BaseAdapter { private int mLayoutDirection; // 构造方法传入布局方向,按需设置RTL/LTR public YourTextTableAdapter(int layoutDirection) { mLayoutDirection = layoutDirection; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.your_text_cell_layout, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 给每个文本单元格设置布局方向 holder.cellTextView.setLayoutDirection(mLayoutDirection); // 这里继续你的数据绑定逻辑... return convertView; } static class ViewHolder { TextView cellTextView; ViewHolder(View view) { cellTextView = view.findViewById(R.id.text_cell); } } }- 然后在创建不同Tab的Adapter时,按需传入方向:
// 要开RTL的Tab页用这个Adapter YourTextTableAdapter rtlTableAdapter = new YourTextTableAdapter(View.LAYOUT_DIRECTION_RTL); // 保持原方向的Tab页用这个 YourTextTableAdapter ltrTableAdapter = new YourTextTableAdapter(View.LAYOUT_DIRECTION_LTR);额外小技巧:仅调整文本对齐的情况
如果你只是想让文本靠右显示(类似RTL的视觉效果),但不需要反转整个布局结构,那直接给TextView设置gravity就行:textView.setGravity(Gravity.END);这样文本会自动对齐到容器的末端,布局结构完全不变,适合只调文本位置的需求。
备注:内容来源于stack exchange,提问作者Jan Bergström
相关产品推荐
相关产品推荐

