我有一项活动需要通过代码动态添加LinearLayout(因为它取决于用户输入)。 所以,这就是我所做的:
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout lyt = (LinearLayout) inflater.inflate(R.layout.row_edit, mLytRows);
TextView tvName = (TextView) lyt.findViewById(R.id.name_textview);
tvName.setText(user.getName());
其中R.layout.row_edit
是一个LinearLayout,其中有一些视图,包括TextView,而mLytRows
是一个引用的LinearLayout(在UI的XML中定义),我要在其中添加row_edit
布局。
根据用户输入,我多次重复此代码,问题是: 当我尝试引用TextView时,我会得到我添加的第一个LinearLayout的TextView。
为什么呢?我该怎么解决呢?
答案 0 :(得分:1)
仔细查看the documentation。
如果在inflate()
中指定第二个参数,则该方法返回父项,而不是膨胀的视图。
因此,lyt
始终是您的父级,findViewById
始终返回其使用R.id.name_textview
ID找到的第一个元素。
您可能想要
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout lyt = (LinearLayout) inflater.inflate(R.layout.row_edit, null);
TextView tvName = (TextView) lyt.findViewById(R.id.name_textview);
tvName.setText(user.getName());
mLytRows.addView(lyt);
在ViewGroup中,您可以看到有多种addView
方法可以将视图放置在您想要的位置。
答案 1 :(得分:0)
在你的res / layout / my_image_layout.xml
中<LinearLayout
android:id="@+id/buttons"
...>
<ImageView ...
</ImageView>
</LinearLayout>
要通过app / src / java / MyClass.java代码中的@ + id值获取该Layout,请执行以下操作:
String myLinearLayoutName = "buttons";
LinearLayout myLinearLayoutID2 = (LinearLayout) activity.findViewById(activity.getResources()
.getIdentifier(myLinearLayoutName, "id", activity.getPackageName()));
/*Bottom code changes that LinearLayout's background to a different image. "bomb" (R.mipmap.bomb) is the name of an image I have in my drawable folder. */
myLinearLayoutID2.setBackgroundResource(R.mipmap.bomb);