0

我有一个包含以下内容的 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?

4

2 回答 2

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将当前视图层次结构设置为活动。在您的情况下,您正在夸大您的布局。所以使用膨胀的视图对象来初始化你的视图。

于 2013-07-02T19:13:31.917 回答
0

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

于 2013-07-02T17:37:42.113 回答