美文网首页面试题
Android通过代码动态生成textView、EditText

Android通过代码动态生成textView、EditText

作者: LongSh1z | 来源:发表于2019-10-27 15:22 被阅读0次

    一、项目需求

    在新建旅游行程的过程中因为旅游天数是不确定的,所以我们需要提供可选方案给客户。这里我们可以根据需要点击加号按钮生成对应的天数,根据需要删除对应的天数。演示图如下:

    20190326003044349.gif

    二、xml文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none">
     
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/activity_guide_route"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">
     
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="100dip"
                android:text="新建旅游行程"
                android:textSize="20dip" />
     
            <LinearLayout
                android:id="@+id/linearLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
     
                <LinearLayout
     
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="30dip"
                    android:gravity="center">
     
                    <TextView
                        android:id="@+id/tv_day1"
                        android:layout_width="40dip"
                        android:layout_height="wrap_content"
                        android:text="Day 1" />
     
                    <EditText
                        android:id="@+id/et_day1"
                        android:layout_width="150dip"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="15dip"
                        android:background="@drawable/edit_register_bg" />
     
                    <ImageButton
                        android:id="@+id/btn_create"
                        android:layout_width="21dip"
                        android:layout_height="21dip"
                        android:layout_marginLeft="10dip"
                        android:background="@drawable/ibcreatestyle" />
     
                    <ImageButton
                        android:layout_width="21dip"
                        android:layout_height="21dip"
                        android:layout_marginLeft="10dip"
                        android:background="@color/white" />
     
                </LinearLayout>
     
            </LinearLayout>
     
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="25dip"
                android:gravity="center">
     
                <Button
                    android:id="@+id/btn_saveroute"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="保存" />
     
            </LinearLayout>
     
        </LinearLayout>
    </ScrollView>
    

    三、核心思想:

    利用linkedList数据结构,每次都把生成的加号按钮、删除按钮和textView控件放进linkedList中,用一个变量index来对应每一个放进去的控件,方便找到点击了哪个按钮然后再写相应逻辑即可。较难之处在于点击了中间的加号按钮之后textView的文本也要相应变化。这里我们可以先判断一下点击的按钮下面是否已经有了按钮,有的话我们可以将index设为linkedList的size即可。这样在点击加号按钮时就不用注意textView的文本了。而点击删除按钮的话我们可以根据linkedList的size来重新赋值即可改变textView的文本了。具体代码如下:

    package top.longsh1z.yiyou.ui;
     
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
     
    import java.lang.reflect.Field;
    import java.util.LinkedList;
     
    import top.longsh1z.yiyou.R;
     
    public class GuideRouteActivity extends AppCompatActivity {
     
        private LinearLayout linearLayout;
        private TextView tv_day1;
        private EditText et_day1;
        private ImageButton btn_create;
        private Button btn_save;
        // “+”按钮控件List
        private LinkedList<ImageButton> listIBTNAdd;
        //textView控件List
        private LinkedList<TextView> listTextView;
        // “+”按钮ID索引
        private int btnIDIndex = 1000;
        //edittext控件List
        private LinkedList<EditText> listEditText;
        // “-”按钮控件List
        private LinkedList<ImageButton> listIBTNDel;
        private int iETContentWidth;   // EditText控件宽度
        private int iETContentHeight;  // EditText控件高度
        private int iTVContentWidth;   //textView控件高度
        private int iTVContentHeight;   //textView控件高度
        private int iIBContentWidth;   //imageButton控件边长
        private float fDimRatio = 1.0f; // 尺寸比例(实际尺寸/xml文件里尺寸)
        private Message msg;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_guide_route);
     
            findAllViews();
     
            listIBTNAdd = new LinkedList<ImageButton>();
            listIBTNDel = new LinkedList<ImageButton>();
            listTextView = new LinkedList<TextView>();
            listEditText = new LinkedList<EditText>();
     
            btn_create.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
     
                    iETContentWidth = et_day1.getWidth();   // EditText控件宽度
                    iETContentHeight = et_day1.getHeight();  // EditText控件高度
                    iTVContentWidth = tv_day1.getWidth();   //textView控件高度
                    iTVContentHeight = tv_day1.getHeight();   //textView控件高度
                    iIBContentWidth = btn_create.getWidth();
                    fDimRatio = iETContentWidth / 150;
     
                    addContent(v);
                }
            });
            listIBTNAdd.add(btn_create);
            listIBTNDel.add(null);
            listEditText.add(et_day1);
     
            final Handler handler = new Handler(new Handler.Callback() {
                @Override
                public boolean handleMessage(Message msg) {
                    if (msg.what == 1) {
                        String content = "";
                        for (int i = 0; i < listEditText.size(); i++) {
                            if (listEditText.get(i).getText().toString() == null ||
                                    listEditText.get(i).getText().toString().equals("")) {
                                Toast.makeText(GuideRouteActivity.this, "请填好相关行程!", Toast.LENGTH_SHORT).show();
                                break;
                            } else {
                                content += listEditText.get(i).getText().toString() + "_";
                            }
                        }
                        if (content != null || !content.equals("")) {
                            String[] contens = content.split("_");
                            if (contens.length == listEditText.size())
                                Toast.makeText(GuideRouteActivity.this, content, Toast.LENGTH_LONG).show();
                        }
                    }
                    return true;
                }
            });
     
            btn_save.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Thread thread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            handler.sendEmptyMessage(1);
                        }
                    });
                    thread.start();
                }
            });
        }
     
        @SuppressWarnings("ResourceType")
        private void addContent(View v) {
            if (v == null)
                return;
     
            int index = -1;
            for (int i = 0; i < listIBTNAdd.size(); i++) {
                if (listIBTNAdd.get(i) == v) {
                    index = i;
                    break;
                }
            }
     
            if (index >= 0) {
                //判断点击按钮的下方是否已经存在按钮,是则将按钮从最底部插入
                try {
                    if (listIBTNAdd.get(index + 1) != null) {
                        index = listIBTNAdd.size();
                    }
                } catch (Exception e) {
                    index += 1;
                }
     
     
                //开始添加控件
     
                //创建外围linearlayout控件
                LinearLayout layout = new LinearLayout(this);
                LinearLayout.LayoutParams ILayoutlayoutParams = new LinearLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT
                );
                ILayoutlayoutParams.setMargins(0, (int) (fDimRatio * 15), 0, 0);
                layout.setGravity(Gravity.CENTER);
                layout.setLayoutParams(ILayoutlayoutParams);
     
                //创建内部textView控件
                TextView tvContent = new TextView(this);
                LinearLayout.LayoutParams tvParam = new LinearLayout.LayoutParams(
                        iTVContentWidth, iTVContentHeight
                );
                tvContent.setText("Day " + (index + 1));
                layout.addView(tvContent);
                listTextView.add(tvContent);
     
                //创建内部edittext控件
                EditText etContent = new EditText(this);
                LinearLayout.LayoutParams etParam = new LinearLayout.LayoutParams(
                        iETContentWidth, iETContentHeight
                );
                try {
                    Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
                    field.setAccessible(true);
                    field.set(etContent,R.drawable.et_cursor_style);
                }catch (Exception e){
     
                }
                etParam.setMargins((int) (fDimRatio * 20), 0, 0, 0);
                etContent.setBackgroundResource(R.drawable.edit_register_bg);
                etContent.setLayoutParams(etParam);
                layout.addView(etContent);
                listEditText.add(etContent);
     
                //创建“+”按钮
                ImageButton btnAdd = new ImageButton(this);
                LinearLayout.LayoutParams btnAddParam = new LinearLayout.LayoutParams(
                        iIBContentWidth,
                        iIBContentWidth
                );
                btnAddParam.setMargins((int) (fDimRatio * 10), 0, 0, 0);
                btnAdd.setLayoutParams(btnAddParam);
                btnAdd.setBackgroundResource(R.drawable.ibcreatestyle);
                btnAdd.setId(btnIDIndex);
                btnAdd.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        addContent(v);
                    }
                });
                layout.addView(btnAdd);
                listIBTNAdd.add(index, btnAdd);
     
                //创建“-”按钮
                ImageButton btnDelete = new ImageButton(this);
                LinearLayout.LayoutParams btnDeleteParam = new LinearLayout.LayoutParams(
                        iIBContentWidth,
                        iIBContentWidth
                );
                btnDeleteParam.setMargins((int) (fDimRatio * 10), 0, 0, 0);
                btnDelete.setLayoutParams(btnDeleteParam);
                btnDelete.setBackgroundResource(R.drawable.ibdeletestyle);
                btnDelete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        deleteContent(v);
                    }
                });
                layout.addView(btnDelete);
                listIBTNDel.add(index, btnDelete);
     
                //将layout同它内部的所有控件都放在最外围的linearLayout容器里
                linearLayout.addView(layout);
     
                btnIDIndex++;
            }
        }
     
        private void deleteContent(View v) {
            if (v == null)
                return;
     
            //判断第几个“-”按钮触发了事件
            int index = -1;
            for (int i = 0; i < listIBTNDel.size(); i++) {
                if (listIBTNDel.get(i) == v) {
                    index = i;
                    break;
                }
            }
     
            if (index >= 0) {
                listIBTNAdd.remove(index);
                listIBTNDel.remove(index);
                listTextView.remove(index - 1);
                listEditText.remove(index);
     
                linearLayout.removeViewAt(index);
            }
     
            for (int i = 0; i < listTextView.size(); i++) {
                int num = 2 + i;
                listTextView.get(i).setText("Day " + num);
            }
        }
     
        private void findAllViews() {
            linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
            tv_day1 = (TextView) findViewById(R.id.tv_day1);
            et_day1 = (EditText) findViewById(R.id.et_day1);
            btn_create = (ImageButton) findViewById(R.id.btn_create);
            btn_save = (Button) findViewById(R.id.btn_saveroute);
        }
    }
    

    相关文章

      网友评论

        本文标题:Android通过代码动态生成textView、EditText

        本文链接:https://www.haomeiwen.com/subject/neusvctx.html