我正在开发一款Android应用,我有两种不同的观点。两个视图实际上都是画布图(以编程方式绘制),顶部有一堆文本视图和按钮。需要根据视图选择更改这些按钮和文本视图的位置。我用我的绘图以及按钮和文本视图创建了一个相对布局。我使用其中一个文本视图作为其他文本视图的锚点,并以编程方式更改其位置。
以下是xml的一部分:
<TextView
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/tvAnchor"
android:layout_above="@id/btnCtrl"
android:layout_marginBottom="130dp"
android:textSize="15sp"
android:textColor="@color/lightGrey"
android:gravity="center"
android:text="@string/Select1"
android:background="@drawable/controls_border_not_active"
android:clickable="true"/>
<TextView
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/tvAlign"
android:layout_alignBottom="@id/tvAnchor"
android:layout_toStartOf="@id/tvAnchor"
android:layout_marginEnd="2dp"
android:textSize="15sp"
android:textColor="@color/lightGrey"
android:gravity="center"
android:text="@string/Select2"
android:background="@drawable/controls_border_not_active"
android:clickable="true"/>
在我的主要内容中,我有以下代码来相应地更改文本视图的位置:
private void PositionControls(){
RelativeLayout.LayoutParams lopAnchor = (RelativeLayout.LayoutParams) tvAnchor.getLayoutParams();
if (isView1Selected){
lopAnchor.resolveLayoutDirection(relativeLayout.getLayoutDirection());
lopAnchor.removeRule(RelativeLayout.ALIGN_START);
lopAnchor.setMargins(0,0,0,370);
lopAnchor.addRule(RelativeLayout.CENTER_HORIZONTAL);
}else{
lopAnchor.setMargins(0,0,0,300);
lopAnchor.removeRule(RelativeLayout.CENTER_HORIZONTAL);
lopAnchor.addRule(RelativeLayout.ALIGN_START,swDoIt.getId());
}
tvAnchor.setLayoutParams(lopAnchor);
}
基本上,在View1中,tvAnchor应该水平居中,而在另一个视图中,它应该偏离中心 - 位于“中心到右边的屏幕边缘”的中间。为了在选择第二个视图时执行此操作,我删除了CENTER_HORIZONTAL规则,并添加了一个规则“ALIGN_START”,其中一个开关已经位于所需的X坐标中。它工作得很好。再次选择View 1并从View 2切换到View 1时会出现问题。在这种情况下,我删除ALIGN_START规则并添加CENTER_HORIZONTAL规则。问题是tvAnchor保持与交换机对齐,就像没有删除ALIGN_START规则一样。我试图获得布局的方向,使用requestLayout和其他可以想到的东西,但似乎没有任何东西可以删除该规则。
答案 0 :(得分:0)
您是否检查过没有启用某些神秘值?
我有情况在布局中移动了clockwidget的地方
我确实添加了ALIGN_PARENT_END并删除了CENTER_IN_PARENT,但是当我设置布局时,我无法将时钟小部件置于中心位置。
RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) mTextClockWidget.getLayoutParams();
p.addRule(RelativeLayout.ALIGN_PARENT_END, 1);
p.removeRule(RelativeLayout.CENTER_IN_PARENT);
mTextClockWidget.setLayoutParams(p);
然后注意到,从某个地方我的布局参数启用了ALIGN_PARENT_RIGHT,当尝试删除ALIGN_PARENT_END并启用CENTER_IN_PARENT时,它不起作用。所以我不得不为ALIGN_PARENT_RIGHT添加删除功能以使其正常工作。
RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) mTextClockWidget.getLayoutParams();
p.removeRule(RelativeLayout.ALIGN_PARENT_END);
p.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
p.addRule(RelativeLayout.CENTER_IN_PARENT, 1);
mTextClockWidget.setLayoutParams(p);