如何动态添加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);
但是,如果要多次添加它们,那么您可能希望像使用RelativeLayout
( m2
)一样创建它们的新实例。 然后,您可以使用原始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数据。 然后将其复制到水平滚动视图中! 这是我的解决方案的屏幕截图: