文章目录
前言
主要是使用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