【问题标题】:How to properly set settings for RelativeLayout programatically?如何以编程方式正确设置 RelativeLayout?
【发布时间】:2014-06-07 06:59:58
【问题描述】:

我正在以编程方式创建一个RelativeLayout,我想将三个对象放入其中:一个ListView 和两个Buttons。我需要设置一些设置才能在窗口中正确定位它们。现在我正在这样做:

RekativeLayout rl = new RelativeLayout(context);
rl.setBackgroundColor(Color.WHITE);
rl.setPadding(10, 10, 10, 10);

ListView listView = new ListView(context);
ListViewAdapter adapter = new ListViewAdapter(jParser.getArrayList(), context);
listView.setLayoutParams(new LayoutParams(wWidth, wHeight));
listView.setAdapter(adapter);

RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(wWidth, wHeight);
listParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
listParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
listView.setId(98515);
listView.setLayoutParams(listParams);

Button moreButton = new Button(context);
moreButton.setLayoutParams(lp);
moreButton.setBackgroundColor(Color.GRAY);
moreButton.setText("More");

RelativeLayout.LayoutParams mButtonParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mButtonParams.addRule(RelativeLayout.ALIGN_LEFT, listView.getId());
mButtonParams.addRule(RelativeLayout.BELOW, listView.getId());
mButtonParams.setMargins(0, 10, 0, 0);
moreButton.setLayoutParams(mButtonParams);

closeButton.setLayoutParams(lp);
closeButton.setBackgroundColor(Color.GRAY);
closeButton.setText("Close");

Button closeButton = new Button(context);
RelativeLayout.LayoutParams cButtonParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
cButtonParams.addRule(RelativeLayout.ALIGN_RIGHT, listView.getId());
cButtonParams.addRule(RelativeLayout.BELOW, listView.getId());
cButtonParams.setMargins(0, 10, 0, 0);
closeButton.setLayoutParams(cButtonParams);

rl.addView(listView);
rl.addView(moreButton);
rl.addView(closeButton);

但我猜这种方法需要很多系统资源并且是不可接受的。我应该如何正确设置设置?

【问题讨论】:

  • but I guess this method requires much system resources and isn't acceptable. How should I set the settings properly? 你能辩解吗?
  • 这就是布局资源存在的原因。
  • @nKn 我的论点是为每个视图创建新的RelativeLayout 对象可能会消耗系统的大量内存。但是根据您的回答,我现在认为我错了!那么这是以编程方式管理布局的正确方法吗?
  • 我的回答是,实际上这主要取决于您的布局。您有 2 种方法来定义 View,作为布局资源和动态(这就是您正在做的事情)。如果你的意思是这样做,这是正确的方法。 “更多行”并不意味着更复杂/效率低下,我认为这将更多地取决于您在RelativeLayout(重ImageViews 等)中放置的内容。毕竟,您设置的属性与定义布局文件一样,只是方式不同。
  • 感谢您提供非常全面的答案!

标签: java android layout view params


【解决方案1】:

鉴于您提出的问题,您正在做的事情很好。为了这个问题,我仍然会回答这两个问题。
我想你的意思是RelativeLayout.LayoutParams。这让您可以设置任何属性并自定义视图的行为方式。

例如,创建和设置基本高度/宽度:

RelativeLayout myRelativeLayout = new RelativeLayout(this);
        myRelativeLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

================================================ =============
现在,就您的其他疑问而言,您真正的问题是这是否是最佳的以及是否还有其他方法。 (虽然您确实应该创建另一个问题,但我仍然会回答)。 正如评论中提到的,这是xml资源的主要原因。在这里,您可以创建布局或视图,然后用数据填充它们。

这里有一个快速指南:http://developer.android.com/guide/topics/ui/declaring-layout.html

快速细分:
-res/layout/ 是布局 xml 所在的目录。 (LayoutInflater)
- 在那些你 decalre 其他视图(TextView、ImageView 等)的内部。
- 您必须引用和扩充资源才能在代码中调用它们。
- 膨胀后,您可以调用 findViewById(resourceId) 并将 View 转换为正确的 Widget(视图)类型。

膨胀和引用视图项需要Context。以下是了解其工作原理的快速指南:
http://www.doubleencore.com/2013/06/context/

其他参考: 您可能想深入了解resources

希望这对您有所帮助,祝您编码愉快!

【讨论】:

  • 我从服务中引用这些,所以我不能使用 findViewById 和 XML 文件。这就是我以编程方式使用 RelativaLayout.LayoutParams 并在运行时创建布局的原因。不过还是谢谢你的澄清。
  • 然后澄清你真正想要做什么。您所说的服务不能也不应该处理任何 UI 组件。如果有任何事情,它应该通知一个 Activity,以便它应该更新或处理 UI 更改。或者,您可能想要完全启动一个新 Activity。
猜你喜欢
  • 2011-04-28
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多