以图形方式膨胀ImageButton会改变宽度和宽度。 wrap params to wrap_content。为什么?

时间:2015-06-18 16:41:23

标签: android android-layout android-inflate layoutparams

在我的应用中,我使用android.support.v7.widget.Toolbar

工具栏的左半部分始终充当后退按钮。

对于不同的活动,右半部分是不同的。有时它只是文字,有时是按钮。因此,我以编程方式向右半部分提供视图。

工具栏

<android.support.v7.widget.Toolbar>
...
... <LinearLayout
        android:id="@+id/left_LL"/>
...
<LinearLayout
        android:id="@+id/right_LL"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:orientation="horizontal" />

</android.support.v7.widget.Toolbar>

我在right_LL中夸大了这个观点:

child_button.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/right_IB"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/save"
android:background="@null"
android:onClick="onRightHeaderButton"
android:scaleType="fitXY" />

我以这样编程方式添加它:

right_LL.addView(inflater.inflate(R.layout.child_button,
                    null, false));

问题,按钮占据了屏幕的一半。它的原始尺寸为512x512。

我认为也许LayoutParams会以某种方式重置,所以我也尝试了

final float scale = getResources().getDisplayMetrics().density;
int pixels = (int) (30 * scale + 0.5f);

right_IB = (ImageButton) right_LL.findViewById(R.id.right_IB);
right_IB.setLayoutParams(new ViewGroup.LayoutParams(
                    pixels,pixels));

它给出了这个例外:

Ĵava.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

当您调用inflater.inflate(R.layout.child_button, null, false)时,您正在为null传递父视图 - 这会导致忽略任何layout_属性(因为这些属性仅由父视图使用) - 有关详细信息,请参阅this Google+ post

相反,你应该使用

inflater.inflate(R.layout.child_button, right_LL, true));

这会导致您的child_button布局为其父布局right_LL正确充气,并自动添加(true所做的那样)。

答案 1 :(得分:0)

确保导入正确的LayoutParams

android.widget.LinearLayout.LayoutParams

LinearLayout

或者您LayoutParams的导入声明可能正在导入ViewGroup.LayoutParams

尝试明确使用

LinearLayout.LayoutParams(...):

spinner1.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));

答案 2 :(得分:0)

我没有足够的声誉来评论,所以我会写这个作为答案:

您是否看过Layout Infalter的Android文档?尝试将您的LinearLayout添加为充气视图的父/根,看看它是否有效。

另外,检查您的导入。 LogCat抛出一个强制转换异常,所以可能你没有使用android.view.ViewGroup.LayoutParams

答案 3 :(得分:0)

我偶然决定用LinearLayout&amp; amp;有效!!! 所以问题就解决了。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageButton
    android:id="@+id/right_IB"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:background="@null"
    android:onClick="onRightHeaderButton"
    android:scaleType="fitXY"
    android:src="@drawable/ic_launcher" />
</LinearLayout>

我不知道为什么,但确实如此。如果有人可以给我正确的解释,那我就会很棒。