代码之家  ›  专栏  ›  技术社区  ›  Stam Kaly

在展开布局时以编程方式使用“toRightOf”

  •  0
  • Stam Kaly  · 技术社区  · 7 年前

    我的XML布局如下所示:

    <?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 不应该被改变。 RelativeLayout 还包括 文本框 对齐的s 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;
    }
    

    文本框
    layout processed inside Java
    (参数 texts new String[] {"1", "1", "1", "1"} )


    xml defined layout

    有人能指出我做错了什么吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Cheticamp    7 年前

    即使您正在生成一个新的 TextView 对于中的每个字符串 texts ,则不会为其生成id。因此 displayedText.getId() View.NO_ID )和 lastViewId 永远不会超过-1。

    要更正代码,需要为每个生成的代码生成一个新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;
    }