如何动态添加XML副本

我正在制作一个Android应用程序,我想在线性布局中复制一些XML代码,然后将其重新插入到线性布局中,以便线性布局中有两个相对布局。 我想通过以下代码动态地执行此操作:

        

然后简单地把它变成这样:

                

看看会有两个RelativeLayout部分…我想基本上复制一个然后再添加它(我真的不知道在我的程序中有多少次我可能要这样做,这就是为什么我我不是直接将它插入XML,我想从Java代码中完成它。 这是我到目前为止所做的,但每当我运行它时,布局都是错误的。 我的代码可能有什么问题?

  LinearLayout m3 = (LinearLayout)findViewById(R.id.tileContainerME); RelativeLayout m = (RelativeLayout)findViewById(R.id.tilesAreHERE); RelativeLayout m2 = new RelativeLayout(this); m2.setLayoutParams(m.getLayoutParams()); m2.setGravity(m.getGravity()); m2.setLayoutDirection(m.getLayoutDirection()); TextView et1 = (TextView) findViewById(R.id.bottom1); TextView et2 = (TextView) findViewById(R.id.left1); TextView et3 = (TextView) findViewById(R.id.right1); TextView et4 = (TextView) findViewById(R.id.top1); 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.setLayoutDirection(et1.getLayoutDirection()); tv2.setLayoutDirection(et2.getLayoutDirection()); tv3.setLayoutDirection(et3.getLayoutDirection()); tv4.setLayoutDirection(et4.getLayoutDirection()); tv1.setGravity(et1.getGravity()); tv2.setGravity(et2.getGravity()); tv3.setGravity(et3.getGravity()); tv4.setGravity(et4.getGravity()); tv1.setText(et1.getText()); tv2.setText(et2.getText()); tv3.setText(et3.getText()); tv4.setText(et4.getText()); m2.addView(tv4,et4.getLayoutParams()); m2.addView(tv3,et3.getLayoutParams()); m2.addView(tv2,et2.getLayoutParams()); m2.addView(tv1,et1.getLayoutParams()); m3.addView(m2); 

我没有看到我的代码有什么问题,任何建议……

这是完整的XML数据文件:

              

在其中再次膨胀相同的布局可能有助于您实现这一目标。

试试这段代码:

 @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); } 

你会得到这样的东西:

在此处输入图像描述

您可能收到一条错误消息,指出您尝试添加的View已有父级。 您需要在TextView的父级或removeAllViews() removeView()上调用removeView()以将它们全部删除,然后再将它们添加到新的RelativeLayout 。 就像是

 m.removeAllViews(); m2.addView(et1); m2.addView(et2); m2.addView(et3); m2.addView(et4); 

但是,如果要多次添加它们,那么您可能希望像使用RelativeLayoutm2 )一样创建它们的新实例。 然后,您可以使用原始TextView具有的参数。 如果这不是您当前的错误,那么请发布您的logcat,但这会导致exception。

编辑

 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); 

这将复制先前的布局,然后将其添加回当前布局!

我确定这次工作了! 我用过这段代码:

  LinearLayout item = (LinearLayout)findViewById(R.id.tileContainerME); View child = getLayoutInflater().inflate(R.layout.activity_main, null); item.addView(child); 

它将复制’activity_main’类,该类仅包含tile的XML数据。 然后将其复制到水平滚动视图中! 这是我的解决方案的屏幕截图:

http://i.stack.imgur.com/WxoJG.png