点击按钮动态添加TextViewR至FlexboxLayout为何仅显示一个视图?
问题分析与解决方案
嘿,我来帮你排查这个问题!你每次点击按钮只能看到一个TextViewR,主要是这几个原因导致的:
- LayoutParams宽高设置错误:你给每个TextViewR都设置了
MATCH_PARENT的宽和高,这样第一个添加的View就会占满整个FlexboxLayout的空间,后续添加的View都会被挤到布局外面,自然看不到。 - 重复设置FlexboxLayout属性:你把Flexbox的方向、换行规则这些属性放在点击事件里,每次点击都会重复设置一遍——虽然这不是直接导致只显示一个View的原因,但完全没必要,应该放在初始化阶段(比如
onCreate方法里)。 - 统一设置Order属性:所有TextViewR的order都设为1,这个在宽高问题解决后影响不大,但如果不需要统一顺序的话可以不用设置,默认值就够用。
修改后的代码示例
把Flexbox的初始化逻辑移到onCreate,同时调整子View的LayoutParams:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // 初始化FlexboxLayout并设置基础属性 flexboxLayout = findViewById(R.id.your_flexbox_id); flexboxLayout.setFlexDirection(FlexDirection.ROW_REVERSE); flexboxLayout.setFlexWrap(FlexWrap.WRAP); flexboxLayout.setJustifyContent(JustifyContent.CENTER); mButton.setOnClickListener(new View.OnClickListener() { int i = 1; @Override public void onClick(View v) { final TextViewR textViewR = new TextViewR(getApplicationContext(), "Text " + Integer.toString(i++)); // 改用WRAP_CONTENT让View只占据自身内容大小 FlexboxLayout.LayoutParams lp = new FlexboxLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); // 可以添加间距让布局更美观 lp.setMargins(8, 8, 8, 8); textViewR.setLayoutParams(lp); flexboxLayout.addView(textViewR); } }); }
额外说明
- 改用
WRAP_CONTENT后,每个TextViewR只会占用自身内容所需的空间,FlexboxLayout就能按照你设置的规则(反向行、自动换行、居中对齐)正常排列多个View了。 - 给子View添加margin是为了让各个View之间有间隔,避免挤在一起,你可以根据需求调整数值。
- 如果需要调整某个View的排列顺序,再单独给它设置
lp.setOrder()即可,不用统一设置成1。
内容的提问来源于stack exchange,提问作者user8110876
相关产品推荐
相关产品推荐

