Android 如何以编程方式将视图添加到视图中

Android 如何以编程方式将视图添加到视图中,android,Android,假设我有一个LinearLayout,我想在Java代码的程序中为它添加一个视图。这是用什么方法?我不是问它是如何在XML中完成的(我知道这一点),而是问我如何按照这个示例代码的思路来做一些事情 (One View).add(Another View) 就像在Swing中一样。是的子类,它有一个名为的方法。方法应该是您所追求的。调用addView是正确的答案,但您需要做更多的工作才能让它正常工作 如果通过构造函数创建视图(例如,Button myButton=new Button();),则在

假设我有一个
LinearLayout
,我想在Java代码的程序中为它添加一个视图。这是用什么方法?我不是问它是如何在XML中完成的(我知道这一点),而是问我如何按照这个示例代码的思路来做一些事情

(One View).add(Another View)

就像在Swing中一样。

是的子类,它有一个名为的方法。方法应该是您所追求的。

调用
addView
是正确的答案,但您需要做更多的工作才能让它正常工作

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

例如,假设LinearLayout具有id
R.id.main
,则在
onCreate()函数中可能有以下代码:

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。

这太晚了,但这可能会帮助某些人:):) 要以编程方式添加视图,请尝试以下操作

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);

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

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

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);
其中yourViewXML类似于R.layout.myView

请注意,您需要一个视图组才能添加视图(这是您可以想到的任何布局)

例如,假设您有一个片段,它的视图已经膨胀,并且您知道根视图是一个布局,您希望向其中添加一个视图:

    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);
编辑:

上面示例的Kotlin代码(view是片段的getView())


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

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

以编程方式设置约束的想法可能令人厌烦。下面的解决方案适用于任何布局,无论是约束、线性等。最好的方法是在您希望以编程方式创建的视图具有适当约束(或在其他布局(如线性)中正确放置)的位置设置占位符,即具有适当约束的框架布局

您所需要做的就是通过使用
addChild()
方法以编程方式将视图膨胀,并将其作为FrameLayout的子视图。然后,在运行期间,视图将膨胀并放置在正确的位置。根据Android的建议,您应该只向FrameLayout添加一个子视图

假设您希望在特定位置以编程方式创建TextView,则代码如下:

第1步:

在包含要充气的视图的布局中,将FrameLayout放置在正确的位置,并给它一个id,例如“container”

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

若并没有设置,因为默认情况下,框架的子视图位于框架布局的左上角,所以您的视图只会飞到屏幕的左上角

步骤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()
来添加视图,这与通过在
findViewById()
的第三个参数中传递
true
来附加膨胀视图是一样的。有关更多信息,请参阅。)

你们还应该确保,当覆盖
onLayout
时,必须使用所有属性调用
super.onLayout
,否则视图将不会膨胀

如何以编程方式创建视图,但要使用专门为此新视图编写的XML布局文件?@SK9您将使用LayoutInflater,它可以从上下文(通常是当前活动)中获取。类似于:LayoutInflater myInflater=getLayoutInflater;查看myView=myInflater.inflate(R.layout.myLayout,父项,false);实际上,getLayoutInflater()来自窗口类(而不是上下文),它是活动中的一个方便方法。作为一种编码实践,在findViewById上,强制转换为ViewGroup或始终是对象的最通用形式,因此如果它从线性布局更改为相对布局,您没有重构。以下是一些细节:您还可以编写一个静态方法,比如
addView(View v){//your code after get View}
,它将采用使用
findViewById(int-resourceID)
找到的视图,或者像
膨胀视图一样膨胀。。。仅对片段示例进行扩展。在打乱了布局并尝试执行
myLinearLayout.add(view)
之后,这是唯一有效的方法。谢谢你!
<?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>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);