膨胀布局并使用其子项

时间:2014-12-04 22:21:10

标签: android layout-inflater

我有一个布局,我希望通过以编程方式逐个添加项目来模仿列表视图。所以我为这些项目的布局创建了一个.xml,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/ll_lista"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_marginLeft="1dp"
      android:layout_marginTop="5dp"
      android:layout_toLeftOf="@+id/rellay_btn"
      android:orientation="vertical" >

      <TextView
          android:id="@+id/tv_username"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginBottom="1dp"
          android:text="Some name"
          android:textColor="#3F3F3F"
          android:textSize="17sp"
          android:textStyle="bold" />


      <TextView
          android:id="@+id/tv_tip"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/iv_follow"
          android:text="Some text"
          android:textColor="#3F3F3F"
          android:textSize="13sp" />
</LinearLayout>

在活动中我想生成这个布局的n,用文本填充textviews,我也想在它们上设置一个onClickListener。 n是数组的大小。请帮忙

注意:活动加载后,布局数量不会改变,也不能删除布局。

这就是我现在所拥有的,但布局显示在活动的顶部,而不是在Textview下面:

LayoutInflater inflater = LayoutInflater.from(BucketProfileActivity.this);
for (int i = 0; i < 3; i++) {
    View view = inflater.inflate(R.layout.bucketprofile_tips, null);
    view.setId(i);
    TextView tv_username = (TextView) view.findViewById(R.id.tv_username);
    tv_username.setText(String.valueOf(i));
    RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);
    rl.addRule(RelativeLayout.BELOW, R.id.tv_nemkell);
    addContentView(view, rl);
}

3 个答案:

答案 0 :(得分:0)

不确定为什么要这样做,但您可以使用LayoutInflater来充气此视图的x并将其添加到指定的ViewGroup。例如:

LayoutInflater inflater = LayoutInflater.from(context);
for (int i = 0; i < numberOfViews; i++) {
    View v = inflater.inflate(R.layout.view_to_add, parentView, false);
    setup(v);
    parentView.addView(v);
}

其中setup()是您定义的功能,可以执行设置工作,例如设置TextView的文本等。

例如,在您的设置功能中可能看起来像这样:

private void setup(View v) {
    TextView tv = (TextView) v.findViewById(R.id.name);
    // set the text of the text view
    tv.setText("Hello!");

    // set the click listener for the view...
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // do stuff here...
        }
    });
}

答案 1 :(得分:0)

如果您发布的xml文件为bucketprofile_tips.xml,那么您需要在此处更改

TextView tv_username = (TextView) view.findViewById(R.id.tv_title);

TextView tv_username = (TextView) view.findViewById(R.id.tv_username);

因为bucketprofile_tips.xml找不到tv_title TextView。所以你得到Null Pointer Exception

答案 2 :(得分:0)

LinearLayout parentLayout=findViewById(R.id.parentLayout);
LayoutInflater inflater = LayoutInflater.from(BucketProfileActivity.this);
View view = inflater.inflate(R.layout.bucketprofile_tips, null);
parentLayout.addView(view);
LinearLayout textList=(LinearLayout) parentLayout.getChildAt(0);
for(int i=0; i<textList.getChildCount(); i++){
    TextView tv_username=(TextView) textList.getChildAt(i);
    textView.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            tv_username.setText(String.valueOf(i));
        }
    }
}