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

时间:2010-03-07 09:31:45

标签: android

假设我有一个LinearLayout,我希望在我的程序中从Java代码中添加一个View。用于什么方法?我不是问我是如何用XML做的,我知道,但是,我怎么能按照这个示例代码的方式做些什么呢?

(One View).add(Another View)

就像在Swing中可以做的那样。

7 个答案:

答案 0 :(得分:224)

调用addView是正确的答案,但您需要做更多的事情才能让它发挥作用。

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

例如,如果您的LinearLayout标识为onCreate(),则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非常重要。每个视图至少需要一个layout_width和一个layout_height参数。获得正确的内部课程也很重要。我努力将Views添加到TableRow中以便正确显示,直到我发现我没有将TableRow.LayoutParams的实例传递给子视图的setLayoutParams。

答案 1 :(得分:44)

对于任何有兴趣的人:

我找到的最好的方法是使用View的膨胀静态方法。

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

其中yourViewXML类似于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);

答案 2 :(得分:20)

LinearLayoutViewGroup的子类,其中有一个名为addView的方法。 addView方法应该是你想要的。

答案 3 :(得分:19)

这已经晚了但这可能对某人有帮助:) :) 要以编程方式添加视图,请尝试

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

这将以程序方式创建整个视图。您可以添加任意数量的视图。希望这可能有所帮助。 :)

答案 4 :(得分:0)

从“活动”添加视图的另一种方法

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);

答案 5 :(得分:0)

以编程方式设置约束的想法可能很烦人。下面的解决方案适用于任何布局,无论是约束,线性等。最佳方法是在期望以编程方式创建视图的位置设置占位符,即具有适当约束(或适当放置在其他布局,例如线性)中的FrameLayout拥有。

您需要做的就是使用addChild()方法以编程方式将视图充气,并将其作为FrameLayout的子视图。然后,在运行时,视图将被放大并放置在正确的位置。根据Android的建议,您应该仅将一个childView添加到FrameLayout [link]

这是您的代码的样子,假设您希望在特定位置以编程方式创建TextView:

第1步:

在包含要放大视图的布局中,将FrameLayout放置在正确的位置,并为其指定一个ID,例如“容器”。

第2步 创建一个具有根元素的布局作为您要在运行时膨胀的视图,将布局文件称为“ textview.xml”:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

</TextView>

顺便说一句,将您的frameLayout的layout-params设置为wrap_content,否则框架布局将与父对象一样大,即活动,即电话屏幕。

android:layout_width="wrap_content"
android:layout_height="wrap_content"

如果未设置,因为默认情况下该框架的子视图转到框架布局的左上角,因此您的视图将仅飞到屏幕的左上角。

第3步

在您的oncreate方法中,执行以下操作:

FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);

(请注意,将findViewById的最后一个参数设置为null并通过在容器视图(frameLayout)上调用addView()来添加视图与通过传递{{1 }},位于true的第3个参数中。有关更多信息,请参见this。)

答案 6 :(得分:0)

你们还应该确保在覆盖 it("should not clear out error codes", () => { const action = { payload: { cardType: 'other' } }; const state = clearErrors(initialState, action); expect(state).toEqual(initialState); }); 时必须调用onLayout的所有属性,否则视图不会膨胀!