膨胀布局并在代码中编辑它

时间:2013-07-02 17:19:28

标签: android popupwindow layout-inflater

我有一个包含以下内容的android XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relLay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/ivQuit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/imgquit"
        android:background="@null"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"/>

    <ImageButton 
        android:id="@+id/btnYes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/btnyes"
        android:background="@null"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"/>

    <ImageButton 
        android:id="@+id/btnNo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/btnno"
        android:background="@null"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"/>

</RelativeLayout>

现在我想给它充气,然后通过代码编辑ImageButtons。我按照以下方式执行此操作:

膨胀XML:

LayoutInflater inflater = (LayoutInflater)  MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.quitgame, null);

尝试编辑ImageButton:

ImageView imgView = (ImageView)findViewById(R.id.ivQuit);
ImageButton imgBtnYes = (ImageButton)findViewById(R.id.btnYes);
ImageButton imgBtnNo = (ImageButton)findViewById(R.id.btnNo);

RelativeLayout.LayoutParams relParams = (RelativeLayout.LayoutParams)imgBtnYes.getLayoutParams();
relParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
imgBtnYes.setLayoutParams(relParams);

然而,只要存在具有LayoutParams的三个代码行,就不会出现我使用膨胀视图创建的PopupWindow。似乎错误隐藏在这一行

 RelativeLayout.LayoutParams relParams = (RelativeLayout.LayoutParams)imgBtnYes.getLayoutParams();

但我不明白为什么。

有人可以告诉我为什么PopupWindows因为这个代码行没有出现? 是因为PopupWindow本身还是因为LayoutInflater?

2 个答案:

答案 0 :(得分:1)

你有这个

 LayoutInflater inflater = (LayoutInflater)  MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 View layout = inflater.inflate(R.layout.quitgame, null);           

使用View对象初始化视图。

 ImageView imgView = (ImageView)layout.findViewById(R.id.ivQuit);
 ImageButton imgBtnYes = (ImageButton)layout.findViewById(R.id.btnYes);
 ImageButton imgBtnNo = (ImageButton)layout.findViewById(R.id.btnNo); 

您可以findViewById将当前视图层次设置为活动。在您的情况下,您正在夸大您的布局。因此,使用inlfated视图对象初始化视图。

答案 1 :(得分:0)

您正在使用root设置为null来布局布局,因此您的布局变量(由inflate方法返回)保存了膨胀布局的根(在本例中为RelativeLayout)。我没有看到您将膨胀的布局附加到您的活动内容的代码(可能您发布的代码不完整?)。 鉴于此,您的findViewById调用应返回null。 而且,据我所知和理解,除非视图附加到已经在活动中某处的视图,否则LayoutParams将不会正确,因为没有设置任何维度(即使它们是在视图上调用的显然不是空的。