Android如何在运行时动态添加View

  • Post author:
  • Post category:其他




前言

主要是使用ViewGroup类中的addView方法,就可以很方便的直接将view添加到ViewGroup中

我们平时用的LinearLayout或者GridLayout等,都是ViewGroup的子类,所以也都有这个方法。

准备一个button和一个linearlayout,只要点击一次button,就往linearlayout中添加一个view

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"
        android:onClick="onClick"/>

    <LinearLayout
        android:id="@+id/linearlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    </LinearLayout>

</LinearLayout>



1. 动态添加TextView等简单View

编写MainActivity中的onClick方法

public class MainActivity extends AppCompatActivity {

    LinearLayout linearLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        linearLayout = findViewById(R.id.linearlayout);
    }

    public void onClick(View view) {
        addView();
    }

    private void addView(){
    	// 用这种方式添加的View,一些参数就只能用代码设置了,毕竟没有xml文件
        TextView textView = new TextView(this);
        textView.setTextSize(20);
        textView.setText("我是新添加的text");
        linearLayout.addView(textView);
    }
}    



2. 动态添加layout

有时候,我们可能不仅仅只需要添加一个简单的View,需要添加的是一个多个View组成的layout

在这里插入图片描述

比如我这个图,在项目中就需要动态添加多个这样的布局,那么这种时候要怎么做呢

首先我先将这些布局单独封装成一个xml文件,取名叫layout.xml。

然后这样加载:

private void addView1() {
    View view = LayoutInflater.from(this).inflate(R.layout.layout, null);
    linearLayout.addView(view);
}



3. 在layout中携带各种数据

当然这样加载还不够,像我上图的界面,其中带有了一个按钮和一个EditText,我肯定是需要它们能处理一些业务逻辑,这种时候该怎么办呢?

也很简单,我们用一个Layout类单独去处理这些内容,再动态加载这个Layout类即可。

public class Layout extends LinearLayout {

    EditText editText;

    public Layout(Context context) {
        super(context);
        init(context);
    }

    public Layout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context) {
        View view = LayoutInflater.from(context).inflate(R.layout.layout, this);
        editText = view.findViewById(R.id.edit_text);
    }
    
    public CharSequence getText(){
        return editText.getText();
    }
}
private void addView2(){
    Layout layout = new Layout(this);
    linearLayout.addView(layout);
}



4. 动态删除view

先说一下如何删除自己,毕竟我在3中添加的那个图,点击减号按钮后,是要删除自己的。

其实也很简单,设置一个监听事件,然后调用ViewGroup.remove()方法,参数传入自己即可。

public class Layout extends LinearLayout {

	......省略刚才出现过的代码......
	
	ImageView imageView;

	OnClickListener onClickListener;

	private void init(Context context) {
	      View view = LayoutInflater.from(context).inflate(R.layout.layout, this);
	      imageView = view.findViewById(R.id.image_view);
	
	      imageView.setOnClickListener(new View.OnClickListener() {
	          @Override
	          public void onClick(View v) {
	              if (onClickListener != null)
	                  onClickListener.minus();
	          }
	      });
	
	  }

	public void setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }


	public interface OnClickListener{
        void minus();
    }
}
private void addView2(){
    Layout layout = new Layout(this);
    linearLayout.addView(layout);
    layout.setOnClickListener(new Layout.OnClickListener() {
        @Override
        public void minus() {
        	// 直接将自己作为参数传入,就可以删除自己了
            linearLayout.removeView(layout);
        }


    });
}



5. 遍历ViewGroup的子View

如果要根据不同的情况具体决定要删除哪个View呢?这里就需要遍历ViewGroup的子View了。然后再根据具体的情况决定要删除的子View

private void removeView(){
    int childCount = linearLayout.getChildCount();
    
    for (int i=0; i<childCount; i++){
        if (i == 3)
            linearLayout.removeView(linearLayout.getChildAt(i));
    }
}



参考材料

Android遍历出容器中的子view_wuqingsen1的博客-CSDN博客


https://blog.csdn.net/wuqingsen1/article/details/84837681


Android动态添加View之addView的用法 – 新感觉 – 博客园


https://www.cnblogs.com/xgjblog/p/14048402.html



版权声明:本文为qq_41872247原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。