视图不会在 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

如何避免在android中的relativelayout中重叠视图

自定义 RelativeLayout 中子视图的索引

从自定义视图访问 RelativeLayout 时出现 NullPointerException