以编程方式将视图添加到RelativeLayout android

时间:2014-01-26 21:38:19

标签: android xml android-layout relativelayout

如何在给定位置以编程方式将子视图添加到RelativeLayout?

例如,要反映以下图片:

enter image description here

my xml :( com.example.TransparentSlidingDrawer child是一个使用LinearLayout扩展的简单类)

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:orientation="horizontal" >
 <ScrollView 
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        >
<com.example.TransparentSlidingDrawer
    android:id="@+id/popup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
     >
     <RelativeLayout 
         android:id="@+id/relativelayout_imageview_textviews_slider"
         android:layout_width="wrap_content"
         android:layout_height="100dp"
         >    
     </RelativeLayout>


</com.example.TransparentSlidingDrawer>

</ScrollView> 
<ImageButton 
    android:id="@+id/open_close_slider"
    android:layout_width="25dp"
    android:layout_height="25dp"
    />


这是我的功能,这个功能不能正常工作:

private void addChild(){
    RelativeLayout relativelayout = (RelativeLayout)findViewById(R.id.relativelayout_imageview_textviews_slider);

    RelativeLayout.LayoutParams imageparams = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    imageparams.setMargins(0, 5, 0, 0);

    RelativeLayout.LayoutParams textparams = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    textparams.setMargins(0, 25, 5, 0);

    imageparams.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE);
    imageparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);

    for(int i = 0 ; i < 9 ; ++i){
        ImageButton btn = new ImageButton(getApplicationContext());
        btn.setId(i+1);
        btn.setBackgroundResource(R.drawable.ic_launcher);
        TextView txt = new TextView(getApplicationContext());
        txt.setText("text"+i);
        txt.setId(i+1);
        textparams.addRule(RelativeLayout.ALIGN_TOP, btn.getId());
        textparams.addRule(RelativeLayout.LEFT_OF, btn.getId());
        relativelayout.addView(btn, imageparams);
        relativelayout.addView(txt, textparams);
    }

}

3 个答案:

答案 0 :(得分:1)

您正在将文本视图与按钮顶部和左侧对齐:

    textparams.addRule(RelativeLayout.ALIGN_TOP, btn.getId());
    textparams.addRule(RelativeLayout.LEFT_OF, btn.getId());

你需要为ImageButtons做同样的事情 - 除了将第一个与父对齐,然后每个后续的对齐你需要将顶部与前一个ImageButton对齐(这里是伪代码):

    btn.addRule(RelativeLayout.ALIGN_BOTTOM, btnAbove.getId());

然后在循环结束处的“btnAbove”中保留对前一个按钮的引用,如:

btnAbove = btn;

答案 1 :(得分:0)

布局中的每个视图都需要自己的LayoutParams对象。重复使用同一个对象将无法按照您想要的方式工作。

此外,更喜欢使用UI小部件的活动上下文来正确应用您的应用主题。

答案 2 :(得分:0)

你也可以这样做

final TextView titleView = (TextView) itemLayout
            .findViewById(R.id.titleView);

而不是创建所有这些附加参数,这将处理布局中的位置