一、項目需求
在建立旅遊行程的過程中因為旅遊天數是不确定的,是以我們需要提供可選方案給客戶。這裡我們可以根據需要點選加号按鈕生成對應的天數,根據需要删除對應的天數。示範圖如下:
二、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吧。(點個贊也是可以的