删除以编程方式添加的 RelativeLayout.END_OF
Removing RelativeLayout.END_OF which is added programmatically
我正在尝试从以编程方式添加的视图布局参数中删除 RelativeLayout.END_OF
,但似乎只写 viewLayoutParams.removeRule(RelativeLayout.END_OF)
不起作用,我不知道为什么!
我正在尝试根据选项进行实时预览,这是我的代码。
XML:
<RelativeLayout
android:id="@+id/liveExample"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/liveExampleLabel">
<TextView
android:id="@+id/iranianDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Monday, 8 Bahman 1370"
android:textAppearance="@style/AppTheme.Text.IranianDate"
tools:ignore="HardcodedText"/>
<TextView
android:id="@+id/islamicDate_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@id/iranianDate"
android:text="@string/islamic"
android:textAppearance="@style/AppTheme.Text.IslamicLabel"/>
<TextView
android:id="@+id/islamicDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8 Rajab 1436"
android:layout_below="@id/iranianDate"
android:textAppearance="@style/AppTheme.Text.IslamicDate"
tools:ignore="HardcodedText"/>
</RelativeLayout>
Java:
private void updateLivePreviewDatesLayout(boolean isChecked) {
RelativeLayout.LayoutParams iranianDateLayoutParams = (RelativeLayout.LayoutParams) iranianDate
.getLayoutParams();
RelativeLayout.LayoutParams islamicDateLayoutParams = (RelativeLayout.LayoutParams) islamicDate
.getLayoutParams();
if (isChecked) {
iranianDateLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
islamicDateLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
islamicDateLayoutParams.setMarginStart(0);
islamicDateLayoutParams.removeRule(RelativeLayout.END_OF);
} else {
iranianDateLayoutParams.removeRule(RelativeLayout.CENTER_HORIZONTAL);
islamicDateLayoutParams.removeRule(RelativeLayout.CENTER_HORIZONTAL);
if (displayIslamicLabel.isChecked()) {
islamicDateLayoutParams.setMarginStart(8);
islamicDateLayoutParams.addRule(RelativeLayout.END_OF,
R.id.islamicDate_label);
}
}
iranianDate.setLayoutParams(iranianDateLayoutParams);
islamicDate.setLayoutParams(islamicDateLayoutParams);
}
centerHorizontal.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
editor.putBoolean("w_centerHorizontal", isChecked).apply();
updateLivePreviewDatesLayout(isChecked);
}
});
它第一次工作(删除 toEndOf 布局参数)但下一次,它不会被删除,因为我以编程方式添加了参数。
更新
我需要将 layout_toEndOf
布局参数添加到视图,因为视图的默认位置与另一个视图相关,它们应该放在一起,之后,视图可能位于中心它的布局,所以我应该删除 RelativeLayout.END_OF
而不是添加 RelativeLayout.CENTER_HORIZONTAL
参数。很高兴知道这两个参数不能一起工作,RelativeLayout.END_OF
比另一个参数更强大。
截图
勾选选项前:“4 Sha'ban 1436”的默认位置是"Islamic"标签的末尾。
检查选项后:“4 Sha'ban 1436”未位于中心,因为RelativeLayout.END_OF
参数未正确删除,这就是问题所在!
我终于找到了解决这个问题的方法。我应该使用 new RelativeLayout.LayoutParams()
.
为每个视图创建一个新的布局参数
我正在尝试从以编程方式添加的视图布局参数中删除 RelativeLayout.END_OF
,但似乎只写 viewLayoutParams.removeRule(RelativeLayout.END_OF)
不起作用,我不知道为什么!
我正在尝试根据选项进行实时预览,这是我的代码。
XML:
<RelativeLayout
android:id="@+id/liveExample"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/liveExampleLabel">
<TextView
android:id="@+id/iranianDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Monday, 8 Bahman 1370"
android:textAppearance="@style/AppTheme.Text.IranianDate"
tools:ignore="HardcodedText"/>
<TextView
android:id="@+id/islamicDate_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@id/iranianDate"
android:text="@string/islamic"
android:textAppearance="@style/AppTheme.Text.IslamicLabel"/>
<TextView
android:id="@+id/islamicDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8 Rajab 1436"
android:layout_below="@id/iranianDate"
android:textAppearance="@style/AppTheme.Text.IslamicDate"
tools:ignore="HardcodedText"/>
</RelativeLayout>
Java:
private void updateLivePreviewDatesLayout(boolean isChecked) {
RelativeLayout.LayoutParams iranianDateLayoutParams = (RelativeLayout.LayoutParams) iranianDate
.getLayoutParams();
RelativeLayout.LayoutParams islamicDateLayoutParams = (RelativeLayout.LayoutParams) islamicDate
.getLayoutParams();
if (isChecked) {
iranianDateLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
islamicDateLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
islamicDateLayoutParams.setMarginStart(0);
islamicDateLayoutParams.removeRule(RelativeLayout.END_OF);
} else {
iranianDateLayoutParams.removeRule(RelativeLayout.CENTER_HORIZONTAL);
islamicDateLayoutParams.removeRule(RelativeLayout.CENTER_HORIZONTAL);
if (displayIslamicLabel.isChecked()) {
islamicDateLayoutParams.setMarginStart(8);
islamicDateLayoutParams.addRule(RelativeLayout.END_OF,
R.id.islamicDate_label);
}
}
iranianDate.setLayoutParams(iranianDateLayoutParams);
islamicDate.setLayoutParams(islamicDateLayoutParams);
}
centerHorizontal.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
editor.putBoolean("w_centerHorizontal", isChecked).apply();
updateLivePreviewDatesLayout(isChecked);
}
});
它第一次工作(删除 toEndOf 布局参数)但下一次,它不会被删除,因为我以编程方式添加了参数。
更新
我需要将 layout_toEndOf
布局参数添加到视图,因为视图的默认位置与另一个视图相关,它们应该放在一起,之后,视图可能位于中心它的布局,所以我应该删除 RelativeLayout.END_OF
而不是添加 RelativeLayout.CENTER_HORIZONTAL
参数。很高兴知道这两个参数不能一起工作,RelativeLayout.END_OF
比另一个参数更强大。
截图
勾选选项前:“4 Sha'ban 1436”的默认位置是"Islamic"标签的末尾。
检查选项后:“4 Sha'ban 1436”未位于中心,因为RelativeLayout.END_OF
参数未正确删除,这就是问题所在!
我终于找到了解决这个问题的方法。我应该使用 new RelativeLayout.LayoutParams()
.