2017-08-02 55 views
0

时,我有一个XML布局看起来像这样:使用“toRightOf”编程充气布局

<?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> 

LinearLayoutTextView s的注定不会被改变。 RelativeLayout也由TextView组成,它们彼此对齐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 S在中心,一个在另一个的上面,像这样: layout processed inside Java(参数textsnew String[] {"1", "1", "1", "1"}

而这正是我试图得到: xml defined layout

任何人都可以指出我在做什么错?

回答

1

即使您为texts中的每个字符串生成新的TextView,也不会为其生成一个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; 
} 
+0

非常感谢,你现在救了我:) –