Android - 如何检测父布局类型

时间:2016-07-16 20:49:56

标签: java android android-layout

我使用以下代码:

        String[] UIItems = new String[5];
        UIItems[0] = "game_area_holder";
        UIItems[1] = "topListBtn";
        UIItems[2] = "bigBtn";
        UIItems[3] = "reposBtn";
        UIItems[4] = "sectorStateColorLine";
        for (int number = 0; number < UIItems.length; number++) {
            itemID = getResources().getIdentifier(UIItems[number],"id",getPackageName());

            ImageView aktUIItem = (ImageView) findViewById(itemID);

            FrameLayout.LayoutParams aktUIItemParams = (FrameLayout.LayoutParams)aktUIItem.getLayoutParams();
 .
 . doing things here with aktUIItemParams
 .
 }

这样可以正常工作,但如果我将其中一个图像放入另一个布局(线性,相对等),那么我会收到一条错误消息:

java.lang.ClassCastException:android.widget.RelativeLayout $ LayoutParams无法强制转换为android.widget.FrameLayout $ LayoutParams

当然,这是因为父级不是FrameLayout ......但是如何以编程方式检查图像的父级布局类型?或者我如何将getLayoutParams()转换为&#34;标准&#34;的LayoutParams?

2 个答案:

答案 0 :(得分:2)

如果ViewGroup.LayoutParams不适用于你,那么你需要进行instanceof检查,看看布局参数是否属于你可以使用的类型:

ViewGroup.LayoutParams layoutParams = aktUIItem.getLayoutParams();

if (layoutParams instanceof FrameLayout.LayoutParams) {
  FrameLayout.LayoutParams frameLayoutParams = (FrameLayout.LayoutParams)layoutParams;
  ...// do that old school logic
}
// ignore layoutParams or do another instance of check.

我建议您查看google文档PPartisan链接(here)中列出的子类(直接和间接),以确定哪些子类提供了您需要调用的方法。然后调用仍然拥有所需方法的最超级类。这样就可以最大限度地减少所需的实例检查次数。

答案 1 :(得分:0)

我在不了解父级的情况下也遇到了更改布局边距的问题,解决方法如下

ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) containerLayout.getLayoutParams();
        lp.setMargins(0, 0,0, Helper.getDPI(8,context));
        containerLayout.setLayoutParams(lp);