引用膨胀布局中的视图

reference to a view in an inflated layout

我有一个包含 4 个 ImageView 的布局,这些 id 为:opp11、opp12、opp13、opp14。 我使用以下方法膨胀此布局:

public class FourOptions extends LinearLayout {

public FourOptions(Context context, AttributeSet attrs) {
    super(context, attrs);

    LayoutInflater layoutInflater = (LayoutInflater)context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    layoutInflater.inflate(R.layout.par_fouroptions_layout, this);

}

我是这样做的:

fo = new FourOptions(this, null);
l.addView(fo);

l 是对我添加上述布局的布局的引用。 这一切都很好。 我现在尝试向 l 添加另一个视图并将此视图与 opp11 对齐。我是这样做的:

    Root result = new Root(this, results[0], results[1], results[2], 45, -1, false); 
    //Root is a class that extends RelativeLayout
    RelativeLayout.LayoutParams paramsRoot = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);

    paramsRoot.addRule(RelativeLayout.ALIGN_LEFT, fo.findViewById(R.id.opp11).getId());
    paramsRoot.addRule(RelativeLayout.ALIGN_RIGHT, fo.findViewById(R.id.opp11).getId());
    paramsRoot.addRule(RelativeLayout.ALIGN_TOP, fo.findViewById(R.id.opp11).getId());
    paramsRoot.addRule(RelativeLayout.ALIGN_BOTTOM, fo.findViewById(R.id.opp11).getId());
    result.setLayoutParams(paramsRoot);
    l.addView(result);

结果被添加到屏幕的左上角,就好像没有为其分配布局参数一样。 当我尝试将结果与主布局 l 中的视图对齐时,它起作用了。这让我相信问题出在 fo.findViewById(R.id.opp11).getId()

但我不确定。 我尝试了其他几种方法。都失败了。 我将不胜感激。

这是par_fouroptions_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

     <ImageView
         android:id="@+id/opp11"
         android:contentDescription="@null"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/rectanglebuttons"
         android:gravity="center" />

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

<ImageView
     android:id ="@+id/opp12"
     android:contentDescription="@null"
     android:layout_width ="wrap_content"
     android:layout_height ="wrap_content" 
     android:gravity="center"
     android:src="@drawable/rectanglebuttons"
     />

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

 </LinearLayout>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

    <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

<ImageView
     android:id ="@+id/opp13"
     android:contentDescription="@null"
     android:layout_width ="wrap_content"
     android:layout_height ="wrap_content"
     android:gravity="center"
     android:src="@drawable/rectanglebuttons"
      />

 <View
    android:id="@+id/spaceview"
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

<ImageView
     android:id ="@+id/opp14"
     android:contentDescription="@null"
     android:layout_width ="wrap_content"
     android:layout_height ="wrap_content"
     android:gravity="center"
     android:src="@drawable/rectanglebuttons"
      />

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>
</LinearLayout>

请查看相关布局文档:

http://developer.android.com/guide/topics/ui/layout/relative.html

您所描述的行为正是我阅读这些文档时所期望的行为。我会在这一行输入:

RelativeLayout lets child views specify their position relative to the parent view or to each other (specified by ID). So you can align two elements by right border, or make one below another, centered in the screen, centered left, and so on. By default, all child views are drawn at the top-left of the layout, so you must define the position of each view using the various layout properties available from RelativeLayout.LayoutParams.

不要将结果添加到 root,而是将其添加到 fo,您可能会看到所需的行为。

请注意,这不是树生成描述,而是 "in relation to parent or each other",这意味着您可以使用参数来定位新视图:相对于父视图(在您的情况下为 root ) 或其子项 (of)。

编辑:您已经为 fo 布局添加了 xml,我想我看到了问题:

您将 op11 和 op12 包装在线性布局中。除了上面关于相对布局的父子关系或子子关系的陈述之外,这里还有一个问题。

也就是说,您想要做的是向 xml 中存在的包装器布局添加一个视图。您在该视图上没有 id,但是有问题的代码块是:

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

     <ImageView
         android:id="@+id/opp11"
         android:contentDescription="@null"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/rectanglebuttons"
         android:gravity="center" />

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

<ImageView
     android:id ="@+id/opp12"
     android:contentDescription="@null"
     android:layout_width ="wrap_content"
     android:layout_height ="wrap_content" 
     android:gravity="center"
     android:src="@drawable/rectanglebuttons"
     />

 <View
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_weight="1" >
</View>

 </LinearLayout>

由于此 linearLayout 是 fo 的子项,因此上述问题适用,但会出现第二个问题。即使您将视图直接添加到此线性布局,我认为您在尝试将 RelativeLayout 规则应用于线性布局时仍然会遇到问题。将此视图更改为相对布局,进行相应修改,然后将您的结果视图添加到此包装器视图中,您应该会看到您想要的内容。