天天看點

Android通過代碼動态生成textView、EditText、ImageButton,實作人性化建立旅遊行程需求

 一、項目需求

在建立旅遊行程的過程中因為旅遊天數是不确定的,是以我們需要提供可選方案給客戶。這裡我們可以根據需要點選加号按鈕生成對應的天數,根據需要删除對應的天數。示範圖如下:

Android通過代碼動态生成textView、EditText、ImageButton,實作人性化建立旅遊行程需求

二、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菜鳥一個,寫的不好就請大家輕點噴啦,有其他問題的話直接留言就好了,确實急的話可以找一下微信LSZ199707。最後附上這個項目的demo吧。(點個贊也是可以的