设置新LayoutParams后AppCompatTextView消失,求解决方法
问题描述
我有如下ConstraintLayout布局:
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" > <androidx.appcompat.widget.AppCompatTextView android:id="@+id/my_text" android:layout_width="0dp" android:layout_height="0dp" android:text="@string/txt_string" app:layout_constraintBottom_toBottomOf="@id/one" app:layout_constraintEnd_toStartOf="@id/two" app:layout_constraintStart_toEndOf="@id/three" app:layout_constraintTop_toTopOf="@id/four" android:layout_marginTop="@dimen/margin_dim" /> </androidx.constraintlayout.widget.ConstraintLayout>
我想要在代码中修改marginTop的值,以下是我的实现方式,但AppCompatTextView消失了:
AppCompatTextView mytext; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_layout); mytext = findViewById(R.id.my_text); ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT); params.setMargins(0,10,0,0); mytext.setLayoutParams(params); }
请问如何正确修改marginTop值以避免控件消失?
原因分析与解决方案
你的代码问题在于新建了一个空白的LayoutParams对象,完全丢弃了原布局中设置的所有约束条件(比如app:layout_constraintBottom_toBottomOf这类规则),同时把控件宽高改成了WRAP_CONTENT却没重新设置约束,导致控件没有正确的布局定位规则,所以看起来消失了。
正确的做法是获取控件原有的LayoutParams,只修改需要调整的margin项,保留原有约束和宽高设置:
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_layout); mytext = findViewById(R.id.my_text); // 获取控件当前的LayoutParams,保留所有原有约束、宽高配置 ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mytext.getLayoutParams(); // 仅修改marginTop的值(单位为px) params.topMargin = 10; // 重新设置LayoutParams生效 mytext.setLayoutParams(params); }
如果需要使用dp单位(适配不同分辨率设备),可以添加dp转px的工具方法:
private int dpToPx(int dp) { return (int) (dp * getResources().getDisplayMetrics().density); }
之后修改margin时调用该方法:
params.topMargin = dpToPx(10);
内容的提问来源于stack exchange,提问作者sacacorchos
相关产品推荐
相关产品推荐

