视图不会在 RelativeLayout 中正确对齐(Java 代码中设置的视图宽度)
Posted
技术标签:
【中文标题】视图不会在 RelativeLayout 中正确对齐(Java 代码中设置的视图宽度)【英文标题】:views won't align right in RelativeLayout (width from view set in java code) 【发布时间】:2016-03-30 08:00:31 【问题描述】:我的 android 应用有问题。我将三个视图的宽度设置为与视图上方的三个按钮相同的大小。视图是指示器,正在显示按下哪个按钮。也许不是最聪明的解决方案,但我只是实习生......
我的 XML 中的代码是:
<RelativeLayout
android:id="@+id/statusIndicatorTop"
android:layout_
android:layout_
android:background="@color/colorPrimaryDark"
android:layout_below="@+id/toolBar"
android:orientation="horizontal"
android:gravity="right">
<View
android:id="@+id/statusPreise"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignLeft="@id/statusShops" />
<View
android:id="@+id/statusShops"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignLeft="@id/statusKategorie"/>
<View
android:id="@+id/statusKategorie"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignParentRight="true" />
</RelativeLayout>
我在 OnCreate 中的 JAVA 代码是:
@Override
public void onStart()
super.onStart();
fragmentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
@Override
public void onGlobalLayout()
fragmentView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
Button btnKat = (Button) fragmentView.findViewById(R.id.button_Kategorie);
int btnKatWidth = btnKat.getWidth();
RelativeLayout.LayoutParams paramsKat = (RelativeLayout.LayoutParams) statusKategorie.getLayoutParams();
paramsKat.width = btnKatWidth;
statusKategorie.setLayoutParams(paramsKat);
Button btnShops = (Button) fragmentView.findViewById(R.id.button_Shops);
int btnShopsWidth = btnShops.getWidth();
RelativeLayout.LayoutParams paramsShops = (RelativeLayout.LayoutParams) statusShops.getLayoutParams();
paramsShops.width = btnShopsWidth;
statusShops.setLayoutParams(paramsShops);
Button btnPreise = (Button) fragmentView.findViewById(R.id.button_Search);
int btnPreiseWidth = btnPreise.getWidth();
RelativeLayout.LayoutParams paramsPreise = (RelativeLayout.LayoutParams) statusSuche.getLayoutParams();
paramsPreise.width = btnPreiseWidth;
statusSuche.setLayoutParams(paramsPreise);
);
在 LOG 中我收到以下错误消息:
Error:(185, 39) No resource found that matches the given name (at 'layout_alignLeft' with value '@id/statusShops').
Error:(193, 39) No resource found that matches the given name (at 'layout_alignLeft' with value '@id/statusKategorie').
当我不使用 alignLeft 时,在第一个和第二个视图中,我的应用程序正在启动,第三个指示器正在执行我想要的操作。我可以想象为什么该应用程序无法运行,但由于缺乏经验,我无法修复它。 我希望它有足够的代码来解决我的问题。
提前谢谢你。
【问题讨论】:
【参考方案1】:顺序很重要,您不能引用尚未绘制的视图(即,如果 statusKategory 尚未绘制,则不能执行layout_aling=@id/statusKategorie
)。尝试重新排序 xml 中的声明,例如:
<RelativeLayout
android:id="@+id/statusIndicatorTop"
android:layout_
android:layout_
android:background="@color/colorPrimaryDark"
android:layout_below="@+id/toolBar"
android:orientation="horizontal"
android:gravity="right">
<View
android:id="@+id/statusKategorie"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignParentRight="true" />
<View
android:id="@+id/statusShops"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignLeft="@id/statusKategorie"/>
<View
android:id="@+id/statusPreise"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignLeft="@id/statusShops" />
</RelativeLayout>
【讨论】:
非常感谢,看来可以了。我必须稍微改变我的 java,但我想这就像一个魅力。【参考方案2】:试试这个 XML:
<RelativeLayout
android:id="@+id/statusIndicatorTop"
android:layout_
android:layout_
android:background="@color/colorPrimaryDark"
android:layout_below="@+id/toolBar"
android:orientation="horizontal"
android:gravity="right">
<View
android:id="@+id/statusPreise"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignLeft="@id/statusShops" />
<View
android:id="@+id/statusKategorie"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignParentRight="true" />
<View
android:id="@+id/statusShops"
android:layout_
android:layout_
android:background="@color/colorAccent"
android:visibility="invisible"
android:layout_alignLeft="@id/statusKategorie"/>
</RelativeLayout>
【讨论】:
以上是关于视图不会在 RelativeLayout 中正确对齐(Java 代码中设置的视图宽度)的主要内容,如果未能解决你的问题,请参考以下文章
将视图附加到Android中的自定义RelativeLayout
Android onClickListener 不会为子视图触发
如何以编程方式将自定义 Java 视图类加载到 RelativeLayout