如何为TextSwitcher内动态创建的TextView设置layout_marginStart?
问题解决:动态给TextSwitcher的TextView设置margin报错
报错原因
你遇到的FrameLayout$LayoutParams转换错误,本质是TextSwitcher内部默认用FrameLayout作为子View的容器——不管外层布局是什么,你动态创建的TextView的直接父容器是TextSwitcher内部的FrameLayout,所以必须用FrameLayout.LayoutParams,而非外层LinearLayout的LayoutParams。
修复代码
把LinearLayout.LayoutParams替换为FrameLayout.LayoutParams,同时注意setMargins接收的是像素值,需要把你要的10pt转换成对应像素:
textswitch.setFactory(new ViewSwitcher.ViewFactory() { @Override public View makeView() { TextView text = new TextView(record_viewer.this); text.setTextColor(Color.WHITE); text.setGravity(Gravity.START); // 将10pt转换为设备像素 float ptSize = 10; float pxSize = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_PT, ptSize, getResources().getDisplayMetrics() ); // 使用FrameLayout.LayoutParams匹配父容器类型 FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT ); params.setMargins((int)pxSize, 0, 0, 0); // 若需适配RTL布局,可替换为setMarginStart // params.setMarginStart((int)pxSize); text.setLayoutParams(params); return text; } });
额外说明
- 如果要实现和
android:layout_marginStart完全一致的效果(适配从右到左的布局),推荐用params.setMarginStart((int)pxSize)替代setMargins的left参数,该方法从API 17开始支持。 - 动态添加View时,LayoutParams的类型必须和直接父容器的类型匹配,和外层布局无关。
内容的提问来源于stack exchange,提问作者user19599863
相关产品推荐
相关产品推荐

