【问题标题】:Programmatically add view one below other in relative layout以编程方式在相对布局中将视图添加到其他视图下方
【发布时间】:2017-07-04 01:51:50
【问题描述】:

我想要这样的程序:

view1 |  view2
view3 |  view4
----------------
view1 |  view2
view3 |  view4
----------------
view1 |  view2
view3 |  view4
---------------
...........
......
which keeps repeating
--------------

我不想使用 ListView。

【问题讨论】:

  • 您可以使用膨胀视图并通过循环添加它们..!!

标签: android


【解决方案1】:

重要提示:请记住为每个视图设置 ID。

RelativeLayout layout = new RelativeLayout(this);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
layout.setLayoutParams(layoutParams);

RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
RelativeLayout.LayoutParams params3 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
RelativeLayout.LayoutParams params4 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

TextView tv1 = new TextView(this);
tv1.setId(1);
tv1.setText("textView1");

TextView tv2 = new TextView(this);
params2.addRule(RelativeLayout.RIGHT_OF, tv1.getId());
tv2.setId(2);
tv2.setText("textView2");

TextView tv3 = new TextView(this);
params3.addRule(RelativeLayout.BELOW, tv1.getId());
tv3.setId(3);
tv3.setText("textView3");

TextView tv4 = new TextView(this);
params4.addRule(RelativeLayout.RIGHT_OF, tv3.getId());
params4.addRule(RelativeLayout.ALIGN_BOTTOM, tv3.getId());
tv4.setId(4);
tv4.setText("textView4");

layout.addView(tv1, params1);
layout.addView(tv2, params2);
layout.addView(tv3, params3);
layout.addView(tv4, params4);

【讨论】:

  • 记住要从 1 而不是 0 开始组件的 id。像 tv1.setId(0) 和 tv2.setId(1) 会让你两个组件在同一个地方。 setId(1) 和 setId(2) 会解决它。
  • 最好使用tv1.setId(View.generateViewId());来设置id。
  • View.generateViewId() 只能在 API 17 中使用。如果 API 小于 17 可以使用什么?
  • 改用 ViewCompat.generateViewId()
【解决方案2】:

您可以使用@Askilondz 答案中建议的多个布局参数,而不是使用addRuleremoveRule,如下所示:

RelativeLayout rl = new RelativeLayout(this.getContext());
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,                                                                                     
                            LayoutParams.WRAP_CONTENT);
TextView tv1 = new TextView(this);
tv1.setId(View.generateViewId());
tv1.setText("textView1");

TextView tv2 = new TextView(this);
tv2.setId(View.generateViewId());
tv2.setText("textView2");
lp.addRule(RelativeLayout.BELOW, tv1.getId());
rl.addView(tv2, lp);
lp.removeRule(RelativeLayout.BELOW);
.
.
.

如果您使用的是 SDK id's.xml 文件,如 values -> ids.xml,其结构如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="tv1" type="id" />
    <item name="tv2" type="id" />
</resources>

并在您的代码中将它们设置为:

tv1.setId(R.id.tv1);
tv2.setId(R.id.tv2);

更新 看起来为同一个 LayoutParams 添加多个规则无法正常工作,无论如何,我会保留我的答案,以防有人在其中对他有用的东西

【讨论】:

    【解决方案3】:
    ImageView imageView = new ImageView(this);
    
    
    // set the Drawable on the ImageView
    imageView.setImageDrawable(bmd);
    
    // center the Image
    imageView.setScaleType(ScaleType.CENTER);
    
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                    LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    

    【讨论】:

    • 嗨!对于参数调用方法 addRule(BELOW, id_of_last_child)。
    猜你喜欢
    • 2013-07-02
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多