Java 如何动态添加XML的副本
我正在制作一个Android应用程序,我想在线性布局中复制一些XML代码,并将其重新插入到线性布局中,以便在线性布局中有两个相对布局。我希望通过以下代码动态地完成此操作:Java 如何动态添加XML的副本,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我正在制作一个Android应用程序,我想在线性布局中复制一些XML代码,并将其重新插入到线性布局中,以便在线性布局中有两个相对布局。我希望通过以下代码动态地完成此操作: <LinearLayout android:id="@+id/tileContainerME" android:layout_width="match_parent" android:layout_height="match_parent" android
<LinearLayout
android:id="@+id/tileContainerME"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/tilesAreHERE"
android:layout_width="207dp"
android:layout_height="151dp" >
<TextView
android:id="@+id/bottom1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/top1"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal"
android:text="1"
/>
<TextView
android:id="@+id/left1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:text="2"
/>
<TextView
android:id="@+id/right1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/left1"
android:layout_alignBottom="@+id/left1"
android:layout_alignParentRight="true"
android:gravity="center_vertical"
android:text="3"
/>
<TextView
android:id="@+id/top1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal"
android:text="4"
/>
</RelativeLayout>
</LinearLayout>
我看不出我的代码有什么问题,有什么建议
这是完整的XML数据文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<HorizontalScrollView
android:id="@+id/scrollHORIZON"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/linearLayout1" >
<LinearLayout
android:id="@+id/tileContainerME"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/tilesAreHERE"
android:layout_width="207dp"
android:layout_height="151dp" >
<TextView
android:id="@+id/bottom1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/top1"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal"
android:text="1"
/>
<TextView
android:id="@+id/left1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:text="2"
/>
<TextView
android:id="@+id/right1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/left1"
android:layout_alignBottom="@+id/left1"
android:layout_alignParentRight="true"
android:gravity="center_vertical"
android:text="3"
/>
<TextView
android:id="@+id/top1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal"
android:text="4"
/>
</RelativeLayout>
</LinearLayout>
</HorizontalScrollView>
</RelativeLayout>
您可能会收到一条错误消息,您试图添加的
视图已经有父视图。您需要在TextView
s或removeallview()
的父级上调用removeView()
,以便在将它们添加到新的RelativeLayout
之前将它们全部删除。差不多
m.removeAllViews();
m2.addView(et1);
m2.addView(et2);
m2.addView(et3);
m2.addView(et4);
但是,如果要多次添加它们,则可能需要像使用RelativeLayout
(m2
)一样创建它们的新实例。然后,您可以使用原始TextView
s所具有的params
。如果这不是您当前的错误,请发布日志,但这将导致异常
编辑
TextView et1 = (TextView) findViewById(R.id.top1);
TextView et2 = (TextView) findViewById(R.id.right1);
TextView et3 = (TextView) findViewById(R.id.left1);
TextView et4 = (TextView) findViewById(R.id.bottom1);
//Create the new TextViews
TextView tv1 = new TextView(m.getContext()); //if inside Activity you can use this instead of m.getContext()
// set params which you can get from the above TextViews
m2.addView(tv1);
...
我知道了
LinearLayout m3 = (LinearLayout)findViewById(R.id.tileContainerME);
RelativeLayout m = (RelativeLayout)findViewById(R.id.tilesAreHERE);
RelativeLayout m2 = new RelativeLayout(m.getContext());
m2.setLayoutParams(m.getLayoutParams());
TextView et1 = (TextView) findViewById(R.id.top1);
TextView et2 = (TextView) findViewById(R.id.right1);
TextView et3 = (TextView) findViewById(R.id.left1);
TextView et4 = (TextView) findViewById(R.id.bottom1);
TextView tv1 = new TextView(et1.getContext());
TextView tv2 = new TextView(et2.getContext());
TextView tv3 = new TextView(et3.getContext());
TextView tv4 = new TextView(et4.getContext());
tv1.setText(et1.getText());
tv2.setText(et2.getText());
tv3.setText(et3.getText());
tv4.setText(et4.getText());
tv1.setLayoutParams(et1.getLayoutParams());
tv2.setLayoutParams(et2.getLayoutParams());
tv3.setLayoutParams(et3.getLayoutParams());
tv4.setLayoutParams(et4.getLayoutParams());
m2.addView(tv1);
m2.addView(tv2);
m2.addView(tv3);
m2.addView(tv4);
m3.addView(m2);
这将复制以前的布局,然后将其添加回当前布局 再次将相同的布局放入其中可能有助于实现这一点
请尝试以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
LinearLayout main_layout = (LinearLayout)findViewById(R.id.tileContainerME);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout child = (LinearLayout) inflater.inflate(R.layout.main_layout, null);
main_layout.addView(child, 1);
}
LinearLayout item = (LinearLayout)findViewById(R.id.tileContainerME);
View child = getLayoutInflater().inflate(R.layout.activity_main, null);
item.addView(child);
你会得到这样的结果:
这次我肯定能用上!我使用了以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
LinearLayout main_layout = (LinearLayout)findViewById(R.id.tileContainerME);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout child = (LinearLayout) inflater.inflate(R.layout.main_layout, null);
main_layout.addView(child, 1);
}
LinearLayout item = (LinearLayout)findViewById(R.id.tileContainerME);
View child = getLayoutInflater().inflate(R.layout.activity_main, null);
item.addView(child);
它将复制“activity_main”类,该类仅保存磁贴的XML数据。然后将其复制到水平滚动视图中!以下是我的解决方案的屏幕截图:
它可以工作,但您的代码会删除那里的视图。我想保留它们,并插入新的一组。。。。所以有两套…对,这就是为什么我不建议这样做。相反,创建新的textview
,就像使用RelativeLayout
查看我的编辑一样。只需创建新的TextView
s并添加它们。我很高兴你能让它工作,但这正是我在回答中告诉你的。LogCat错误:01-02 11:29:41.976:D/errorBad(1965):android.content.res.Resources$NotFoundException:资源ID#0x7f08000a类型#0x12无效它不工作…..为什么在实际布局之后命名主布局对象?这毫无意义……@littlehalper它对我有用,这就是我分享屏幕截图的原因。您一定在xml文件中出错了。再检查一遍。否则,请清理项目,然后再次尝试运行它。别担心,我已经让它工作了!谢谢你的帮助!我会把你的答案记为正确的!