2017-05-25 57 views
1

我正在开发一个Android应用程序,我有两个不同的视图。这两个视图实际上都是帆布绘图(以编程方式绘制),顶部有一堆文本视图和按钮。这些按钮和文本视图的位置需要根据视图选择进行更改。我用我的绘图和按钮和文本视图创建了一个相对布局。我使用其中一个文本视图作为其他人的锚点并以编程方式更改其位置。如何删除(RelativeLayout.ALIGN_START)规则

这里是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); 

} 

基本上,在视图1中, tvAnchor应该水平居中,而在另一个视图中,它应该位于偏离中心的位置 - 在“中心到右边的屏幕边缘”的中间。为了在选择第二个视图时执行此操作,我删除CENTER_HORIZONTAL规则,并添加一个规则'ALIGN_START',该规则已经位于所需的X坐标中。它工作得很好。当再次选择View 1并从View 2切换到View 1时,会出现问题。在这种情况下,我删除ALIGN_START规则并添加CENTER_HORIZONTAL。问题在于tvAnchor保持与开关对齐,就好像ALIGN_START规则未被删除一样。我试图找到布局的方向,使用requestLayout和其他可以想到的东西,但似乎没有删除该规则。

回答

0

你是否检查过有没有启用一些神秘值?

我在哪里布局

我确实添加了ALIGN_PARENT_END和删除CENTER_IN_PARENT移动clockwidget到位的情况下,但是当我设置的布局后,我没能时钟部件居中。

RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) mTextClockWidget.getLayoutParams(); 
    p.addRule(RelativeLayout.ALIGN_PARENT_END, 1); 
    p.removeRule(RelativeLayout.CENTER_IN_PARENT); 
    mTextClockWidget.setLayoutParams(p); 

然后注意到,从什么地方我的布局PARAMS得到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);