如何以编程方式向视图添加视图

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

假设我有一个LinearLayout,我想在我的Java代码的程序中添加一个View。这是用什么方法做的?我并不是在问XML是如何实现的,我知道XML是如何实现的,而是问,我怎样才能做到这一点呢?

提问于
用户回答回答于

我发现最好的方法是使用充气静态视图方法。

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

其中,ViewXML类似于R.layout.myView

请注意,需要一个ViewGroup来添加一个视图

因此,举个例子,假设有一个片段,它的视图已经膨胀了,并且知道根视图是一个布局,想要在其中添加一个视图:

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
用户回答回答于

呼叫addView这是正确的答案,但你需要做的比这多一点,才能让它发挥作用。

如果通过构造函数创建视图(例如,Button myButton = new Button();),你需要打电话setLayoutParams在新构造的视图上,在将新建的子视图添加到父视图之前,传入父视图的LayoutParams内部类的实例。

例如,可能在onCreate()函数假设linearLayout有id。R.id.main:

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

确保设置LayoutParams很重要。每个视图至少需要一个布局。_宽度和布局_高度参数。同时,获得正确的内部类也很重要。我很难让视图添加到TableRow中以正确显示,直到我发现没有将TableRow.LayoutParams的实例传递给子视图的setLayoutParams。

扫码关注云+社区