我有一个包含LinearLayout的应用程序,其中应该包含几个RelativeLayouts。
在下面,您将看到RelativeLayout的代码,该代码应该被倍增。如何通过Java代码执行此操作?
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp">
<TextView
android:id="@+id/txtName1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="TextView" />
<EditText
android:id="@+id/edit1"
android:layout_width="55dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_toEndOf="@id/txtName1"
android:ems="10"
android:inputType="number" />
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_toEndOf="@id/edit1" />
</RelativeLayout>
</LinearLayout>
答案 0 :(得分:0)
这是我的解决方法:
public class MainActivity extends AppCompatActivity {
private static final int FIRST_ROW_ID = 100;
private static final int SECOND_ROW_ID = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layoutContainer = findViewById(R.id.linear_layout_container);
View firstRow = getLayoutInflater().inflate(R.layout.layout_part, layoutContainer, false);
View secondRow = getLayoutInflater().inflate(R.layout.layout_part, layoutContainer, false);
firstRow.setId(FIRST_ROW_ID);
secondRow.setId(SECOND_ROW_ID);
layoutContainer.addView(firstRow);
layoutContainer.addView(secondRow);
EditText editText = firstRow.findViewById(R.id.edit1);
editText.setText("Hello");
EditText editText2 = secondRow.findViewById(R.id.edit1);
editText2.setText("World");
}
}
activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linear_layout_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</FrameLayout>
layout_part.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:id="@+id/relative_layout"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/txtName1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="TextView" />
<EditText
android:id="@+id/edit1"
android:layout_width="55dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_toEndOf="@id/txtName1"
android:ems="10"
android:inputType="number" />
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_toEndOf="@id/edit1" />
</RelativeLayout>
我在这里所做的事情相对简单:root layout (activity_main.xml)
仅定义了LinearLayout
。这将是容纳所有行的容器。
要创建行而不必通过Java代码声明每个属性,我提取了RelativeLayout
并将其放在单独的文件(layout_part.xml
)中。
现在,在活动中,我只需要根据需要初始化layoutContainer
,然后inflate
layout of the row
。请注意,第三个参数(attachToRoot
)为假getLayoutInflater().inflate(R.layout.layout_part, layoutContainer, false)
。
其背后的原因如下:如果将其设置为true,则布局将立即添加到layoutContainer
中,因此id不会是唯一的(例如,您将有多个editText1 id)。因此,我告诉充气机:嘿,一旦准备好,我会自己添加这些Views
。
那么id如何唯一?只需为每个展开的布局分配一个不同的ID。
之后,只需将行添加到layoutContainer
,然后我就在每行的EditText
上设置一个文本,以证明这是可行的。
就是这样!如果您还有其他问题,请问:)