在给布局充气时以编程方式使用“toRightOf”

时间:2017-08-02 09:36:40

标签: android android-layout android-relativelayout android-inflate

我的XML布局如下所示:

var S3 = new AWS.S3();

S3.listBuckets(function(err, data) {
  if (err) { console.log("Error:", err); }
  else {
    for (var index in data.Buckets) {
       var bucket = data.Buckets[index];
       console.log("Bucket: ", bucket.Name, ' : ', bucket.CreationDate);
    }
  }
});

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="40dp" android:layout_height="40dp" android:layout_weight="0.1" android:text="1"/> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/child" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <!-- Define these into code <TextView android:id="@+id/first" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="1"/> <TextView android:id="@+id/second" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/first" android:layout_marginLeft="5dp" android:textSize="20sp" android:text="1"/>--> </RelativeLayout> <TextView android:layout_width="40dp" android:layout_height="40dp" android:layout_weight="0.1" android:text="1"/> </LinearLayout> 内的TextView并不打算更改。 LinearLayout也由RelativeLayoutTextView组成,彼此相距5dp。与父布局的布局不同,它们需要在我的Java活动中定义。这就是我的尝试:

private View getGeneratedView(String[] texts) {
    LayoutInflater inflater =
            (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View parentLayout = inflater.inflate(R.layout.parent, null);
    RelativeLayout childLayout = (RelativeLayout) parentLayout.findViewById(R.id.child);

    Integer lastViewId = null;
    for (String text: texts) {
        TextView displayedText = new TextView(this);
        displayedText.setText(text);
        displayedText.setTextSize(20);

        RelativeLayout.LayoutParams params =
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);
        if (lastViewId != null) {
            params.addRule(RelativeLayout.RIGHT_OF, lastViewId);
            params.leftMargin = 5;
        }
        displayedText.setLayoutParams(params);

        lastViewId = displayedText.getId();
        childLayout.addView(displayedText);
    }

    return parentLayout;
}

但上面代码的作用是将所有TextView放在中间位置,将其放在另一个顶部,如下所示:
layout processed inside Java
(参数textsnew String[] {"1", "1", "1", "1"}

这就是我想要得到的:
xml defined layout

有谁可以指出我做错了什么?

1 个答案:

答案 0 :(得分:2)

即使您为TextView中的每个字符串生成新的texts,也不会为其生成ID。因此,displayedText.getId()将始终为-1(View.NO_ID),lastViewId将永远不会为-1。

要更正代码,您需要为每个生成的TextView生成一个新ID。使用API​​ 17+,您可以使用View.generateViewId()执行此操作。

private View getGeneratedView(String[] texts) {
    LayoutInflater inflater =
            (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View parentLayout = inflater.inflate(R.layout.parent, null);
    RelativeLayout childLayout = (RelativeLayout) parentLayout.findViewById(R.id.child);

    Integer lastViewId = null;
    for (String text : texts) {
        TextView displayedText = new TextView(this);
        // Need API 17+ for generateViewId
        displayedText.setId(View.generateViewId());
        displayedText.setText(text);
        displayedText.setTextSize(20);

        RelativeLayout.LayoutParams params =
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);
        if (lastViewId != null) {
            params.addRule(RelativeLayout.RIGHT_OF, lastViewId);
            params.leftMargin = 5;
        }
        displayedText.setLayoutParams(params);

        lastViewId = displayedText.getId();
        childLayout.addView(displayedText);
    }

    return parentLayout;
}