引用膨胀布局中的视图

时间:2015-01-06 18:15:59

标签: android android-layout android-inflate

我的布局包含4个带有这些id的ImageView: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是对我添加上述布局的布局的引用。 一切正常。 我现在尝试添加到另一个视图并将此视图与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>

1 个答案:

答案 0 :(得分:1)

请查看相对布局文档:

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

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

  

RelativeLayout允许子视图指定它们相对于的位置   父视图或彼此(由ID指定)。所以你可以调整两个   右边界的元素,或者在另一个下面制作一个元素   屏幕,居中左侧,依此类推。默认情况下,所有子视图都是   在布局的左上角绘制,因此您必须定义位置   每个视图使用可用的各种布局属性   RelativeLayout.LayoutParams。

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

请注意,这不是树跨越描述,而是“与父级或彼此相关”,这意味着您可以使用参数来定位新视图:与父级(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规则应用于线性布局时看到问题。将此视图更改为相对布局,相应地进行修改,然后将结果视图添加到此包装器视图中,您应该看到所需内容。