เพิ่มและลบมุมมองใน Android แบบไดนามิกหรือไม่


126

ฉันจะเพิ่มและลบมุมมองเช่นTextViews จากแอพ Android เช่นบนหน้าจอผู้ติดต่อ Android ดั้งเดิมที่คุณกดไอคอนเล็ก ๆ ทางด้านขวาของฟิลด์และเพิ่มหรือลบฟิลด์ซึ่งประกอบด้วย a TextViewและeditTextView(จากอะไร ฉันสามารถเห็น)

ตัวอย่างใด ๆ เกี่ยวกับวิธีการบรรลุเป้าหมายนี้?

คำตอบ:


222

ViewParentโดยทั่วไปไม่สามารถลบมุมมองได้ แต่ViewGroupสามารถลบได้ คุณต้องหล่อหลอมผู้ปกครองของคุณให้เป็นViewGroup(ถ้าเป็นViewGroup) เพื่อให้บรรลุสิ่งที่คุณต้องการ

ตัวอย่างเช่น:

View namebar = View.findViewById(R.id.namebar);
((ViewGroup) namebar.getParent()).removeView(namebar);

โปรดทราบว่าทั้งหมดLayoutเป็นViewGroups


2
ViewParent ไม่สามารถลบมุมมองย่อยได้ แต่ ViewGroup สามารถทำได้
ThomasW

1
ลิงค์เสีย หลีกเลี่ยงการเชื่อมโยงคำตอบทั้งหมดกับลิงก์ภายนอกดังที่เห็นในคำถามเมตานี้: meta.stackexchange.com/questions/8231/…
Willian Soares

สวัสดีฉันไม่สามารถลบ SurfaceViewRenderer จากซุปเปอร์วิวได้คุณช่วยได้ไหม
famfamfam

39

ฉันต้องการคุณสมบัติเดียวกันกับที่อธิบายไว้ในคำถามนี้ นี่คือวิธีการแก้ปัญหาและแหล่งที่มารหัสของฉัน: https://github.com/laoyang/android-dynamic-views และคุณสามารถดูวิดีโอสาธิตการใช้งานได้ที่นี่: http://www.youtube.com/watch?v=4HeqyG6FDhQ

แบบ

โดยทั่วไปคุณจะมีไฟล์เลย์เอาต์ xml สองไฟล์:

  • มุมมองแถว LinearLayout แนวนอนพร้อม a TextEdit, a SpinnerและImageButtonสำหรับการลบ
  • มุมมองคอนเทนเนอร์ LinearLayout แนวตั้งเพียงปุ่มเพิ่มใหม่

ควบคุม

ในโค้ด Java คุณจะเพิ่มและลบมุมมองแถวลงในคอนเทนเนอร์แบบไดนามิกโดยใช้การขยาย, เพิ่มดู, ลบมุมมองและอื่น ๆ มีการควบคุมการมองเห็นบางอย่างเพื่อให้ UX ดีขึ้นในแอป Android ในสต็อก คุณต้องเพิ่ม TextWatcher สำหรับมุมมอง EditText ในแต่ละแถว: เมื่อข้อความว่างเปล่าคุณต้องซ่อนปุ่มเพิ่มใหม่และปุ่มลบ ในโค้ดของฉันฉันเขียนvoid inflateEditRow(String)ฟังก์ชันตัวช่วยสำหรับตรรกะทั้งหมด

เทคนิคอื่น ๆ

  • ตั้งค่าเป็นandroid:animateLayoutChanges="true"xml เพื่อเปิดใช้งานภาพเคลื่อนไหว
  • ใช้พื้นหลังโปร่งใสแบบกำหนดเองด้วยตัวเลือกแบบกดเพื่อทำให้ปุ่มต่างๆเหมือนในแอพ Android ในสต็อก

รหัสแหล่งที่มา

โค้ด Java ของกิจกรรมหลัก (สิ่งนี้อธิบายถึงตรรกะทั้งหมด แต่มีการตั้งค่าคุณสมบัติบางอย่างในไฟล์เลย์เอาต์ xml โปรดดูที่แหล่ง Github สำหรับวิธีแก้ปัญหาที่สมบูรณ์):

public class MainActivity extends Activity {
// Parent view for all rows and the add button.
private LinearLayout mContainerView;
// The "Add new" button
private Button mAddButton;
// There always should be only one empty row, other empty rows will
// be removed.
private View mExclusiveEmptyView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.row_container);
    mContainerView = (LinearLayout) findViewById(R.id.parentView);
    mAddButton = (Button) findViewById(R.id.btnAddNewItem);

    // Add some examples
    inflateEditRow("Xiaochao");
    inflateEditRow("Yang");
}

// onClick handler for the "Add new" button;
public void onAddNewClicked(View v) {
    // Inflate a new row and hide the button self.
    inflateEditRow(null);
    v.setVisibility(View.GONE);
}

// onClick handler for the "X" button of each row
public void onDeleteClicked(View v) {
    // remove the row by calling the getParent on button
    mContainerView.removeView((View) v.getParent());
}

// Helper for inflating a row
private void inflateEditRow(String name) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View rowView = inflater.inflate(R.layout.row, null);
    final ImageButton deleteButton = (ImageButton) rowView
            .findViewById(R.id.buttonDelete);
    final EditText editText = (EditText) rowView
            .findViewById(R.id.editText);
    if (name != null && !name.isEmpty()) {
        editText.setText(name);
    } else {
        mExclusiveEmptyView = rowView;
        deleteButton.setVisibility(View.INVISIBLE);
    }

    // A TextWatcher to control the visibility of the "Add new" button and
    // handle the exclusive empty view.
    editText.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {

            // Some visibility logic control here:
            if (s.toString().isEmpty()) {
                mAddButton.setVisibility(View.GONE);
                deleteButton.setVisibility(View.INVISIBLE);
                if (mExclusiveEmptyView != null
                        && mExclusiveEmptyView != rowView) {
                    mContainerView.removeView(mExclusiveEmptyView);
                }
                mExclusiveEmptyView = rowView;
            } else {
                if (mExclusiveEmptyView == rowView) {
                    mExclusiveEmptyView = null;
                }
                mAddButton.setVisibility(View.VISIBLE);
                deleteButton.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
        }
    });

    // Inflate at the end of all rows but before the "Add new" button
    mContainerView.addView(rowView, mContainerView.getChildCount() - 1);
}

1
@SwapnilSonar คุณสามารถวนซ้ำผ่าน mContainerView ด้วย. getChildAt (i) และ. getChildCount () ลูกแต่ละคนจะเป็นแถวแก้ไข
XY

กำลังทำงานในสิ่งที่คล้ายกับดังนั้นสิ่งนี้ได้ผลดี
Srikanth Roopa

ตามความสูงของหน้าจอฉันสามารถเพิ่มได้ 7 รายการหลังจากนั้นจะมองไม่เห็นปุ่ม "เพิ่มใหม่" ซึ่งซ่อนอยู่ด้านล่าง softKeyboard เพื่อคลิก "เพิ่มใหม่" ฉันต้องซ่อนแป้นพิมพ์และคลิกปุ่ม "เพิ่มใหม่" เพื่อเพิ่มรายการเพิ่มเติม หลังจาก 12 รายการปุ่ม "เพิ่มใหม่" ถูกฝังอยู่ด้านล่างหน้าจอ! XHTML ที่ถูกต้อง
Usman

เราจะทำให้ EditText อัตโนมัติใหม่ได้อย่างไรเพราะเราต้องคลิกที่พื้นที่ว่างเพื่อให้โฟกัส ในขณะที่เรากำลังเพิ่ม EditText ใหม่ซึ่งหมายความว่าเราต้องการเพิ่มข้อความดังนั้นควรเน้นโดยอัตโนมัติและ Soft Keyboard ควรจะปรากฏขึ้น
Usman

9

นี่เป็นวิธีทั่วไปของฉัน:

View namebar = view.findViewById(R.id.namebar);
ViewGroup parent = (ViewGroup) namebar.getParent();
if (parent != null) {
    parent.removeView(namebar);
}

6

สวัสดีคุณสามารถลองวิธีนี้ได้โดยการเพิ่มเค้าโครงสัมพัทธ์และเพิ่ม textview เข้าไป

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            (LayoutParams.WRAP_CONTENT), (LayoutParams.WRAP_CONTENT));

RelativeLayout relative = new RelativeLayout(getApplicationContext());
relative.setLayoutParams(lp);

TextView tv = new TextView(getApplicationContext());
tv.setLayoutParams(lp);

EditText edittv = new EditText(getApplicationContext());
edittv.setLayoutParams(lp);

relative.addView(tv);
relative.addView(edittv);

จะเพิ่มมุมมองใหม่ให้กับเค้าโครงโดยอัตโนมัติโดยไม่ต้องโหลดหน้าจอซ้ำหรือไม่ เหมือนกับวิธีที่คุณเพิ่มฟิลด์ข้อความใหม่ในรายชื่อติดต่อ?
Jonathan

1
Android ต้องวาดหน้าจอใหม่เมื่อคุณเพิ่มมุมมองใหม่ (ฉันคิดว่า) แต่ไม่ควรส่งผลกระทบต่อคุณในกรณีส่วนใหญ่
Falmarri

9
ตัวอย่างใด ๆ เกี่ยวกับวิธีการลบมุมมองเฉพาะจาก linearLayout?
Jonathan

โหวตลงเนื่องจากไม่ได้รวมตัวอย่างวิธีลบมุมมอง
AJP

1
สำหรับการลบมุมมองออกจาก LinearLayout นี่คือสิ่งที่ฉันทำ MyLinearLayoutThatHoldsOtherViews.removeAllViews (); removeAllViews () คือกุญแจสำคัญ หวังว่าจะช่วยและเข้าท่า ^. ^
Micah Montoya

4

คลาสViewGroupมี API สำหรับการจัดการมุมมองเด็กในรันไทม์ทำให้สามารถเพิ่ม / ลบมุมมองได้เช่นกัน

ลิงค์อื่น ๆ ในหัวข้อ:

Android เพิ่มมุมมองใหม่โดยไม่มีเค้าโครง XML

การสอนเค้าโครงรันไทม์ของ Android

http://developer.android.com/reference/android/view/View.html

http://developer.android.com/reference/android/widget/LinearLayout.html


ViewGroup หรือวิธีการของมันมี API (ซึ่งแทนที่จะเป็นชุดของไลบรารี) แต่มีเพียงวิธีการบางอย่างในการจัดการกับพฤติกรรม (เช่นการเพิ่มและลบมุมมอง) ที่คุณพูด และวิธีการเหล่านั้นไม่ได้เป็นเพียงสิ่งเดียวในการจัดการมุมมองขณะรันไทม์ แต่เป็นวิธีการจัดการที่ไม่เหมือนใคร เมื่อคุณเขียนเค้าโครง XML มันจะถูกแยกวิเคราะห์ใน Java และมุมมองจะถูกสร้างขึ้นตามมันในช่วงรันไทม์!
Davide Cannizzo

4

เพียงใช้myView.setVisibility(View.GONE);ลบออกให้หมด แต่ถ้าคุณต้องการจองพื้นที่ว่างภายในการใช้งานหลักmyView.setVisibility(View.INVISIBLE);


4
ไม่ใช่แค่การซ่อน
ruX

1
ใช่ แต่ View.GONE เหมือนกับการลบอย่างสมบูรณ์เนื่องจากพื้นที่ที่สงวนไว้ไม่แสดงอีกต่อไป
Soheil Setayeshi

1
โพสต์ที่ยอดเยี่ยมจัดการปัญหาของฉัน ฉันเชื่อว่านี่เป็นคำตอบที่ถูกต้องหากมุมมองของคุณถูกสร้างขึ้นใน xml แล้วและคุณเพียงแค่ต้องการแสดงหรือซ่อนและปล่อยให้มุมมองอื่น ๆ ใช้พื้นที่ที่มุมมองที่ซ่อนอยู่เหล่านั้นควรจะเป็น
CHarris

อย่าลืมว่าView.INVISIBLEซ่อนเฉพาะมุมมองเท่านั้น OnClickListener(ถ้าชุด) จะยังคงตอบสนองต่อผู้ใช้ถ้าพวกเขาสัมผัสบริเวณที่มุมมองที่เป็นปัจจุบัน ( แต่มองไม่เห็น) ดังนั้นคุณควรลบออกด้วยOnClickListenersในกรณีเช่นนี้
Kathir

4

สำหรับการเพิ่มปุ่ม

LinearLayout dynamicview = (LinearLayout)findViewById(R.id.buttonlayout);
LinearLayout.LayoutParams  lprams = new LinearLayout.LayoutParams(  LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);

Button btn = new Button(this);
btn.setId(count);
final int id_ = btn.getId();
btn.setText("Capture Image" + id_);
btn.setTextColor(Color.WHITE);
btn.setBackgroundColor(Color.rgb(70, 80, 90));
dynamicview.addView(btn, lprams);
btn = ((Button) findViewById(id_));
btn.setOnClickListener(this);

สำหรับการถอดปุ่ม

ViewGroup layout = (ViewGroup) findViewById(R.id.buttonlayout);
View command = layout.findViewById(count);
layout.removeView(command);

การนับไม่ใช่อะไรนอกจาก id ของปุ่มที่สร้างขึ้นแบบไดนามิก
Amaresh Jana

3

สวัสดีขั้นแรกเขียนชั้นกิจกรรม ชั้นเรียนต่อไปนี้มีชื่อหมวดหมู่และปุ่มเพิ่มขนาดเล็ก เมื่อคุณกดปุ่มเพิ่ม (+) จะเป็นการเพิ่มแถวใหม่ซึ่งมี EditText และ ImageButton ซึ่งจะทำการลบแถว

package com.blmsr.manager;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.blmsr.manager.R;
import com.blmsr.manager.dao.CategoryService;
import com.blmsr.manager.models.CategoryModel;
import com.blmsr.manager.service.DatabaseService;

public class CategoryEditorActivity extends Activity {
    private final String CLASSNAME = "CategoryEditorActivity";
    LinearLayout itsLinearLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_category_editor);

        itsLinearLayout = (LinearLayout)findViewById(R.id.linearLayout2);
    }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_category_editor, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
        case R.id.action_delete:
            deleteCategory();
            return true;
        case R.id.action_save:
            saveCategory();
            return true;
        case R.id.action_settings:
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

/**
 * Adds a new row which contains the EditText and a delete button.
 * @param theView
 */
public void addField(View theView)
{
    itsLinearLayout.addView(tableLayout(), itsLinearLayout.getChildCount()-1);
}

// Using a TableLayout as it provides you with a neat ordering structure

private TableLayout tableLayout() {
    TableLayout tableLayout = new TableLayout(this);
    tableLayout.addView(createRowView());
    return tableLayout;
}

private TableRow createRowView() {
    TableRow tableRow = new TableRow(this);
    tableRow.setPadding(0, 10, 0, 0);

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

    tableRow.addView(editText);
    ImageButton btnGreen = new ImageButton(this);
    btnGreen.setImageResource(R.drawable.ic_delete);
    btnGreen.setBackgroundColor(Color.TRANSPARENT);
    btnGreen.setOnClickListener(anImageButtonListener);
    tableRow.addView(btnGreen);

    return tableRow;
}

/**
 * Delete the row when clicked on the remove button.
 */
private View.OnClickListener anImageButtonListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        TableRow anTableRow = (TableRow)v.getParent();
        TableLayout anTable = (TableLayout) anTableRow.getParent();
        itsLinearLayout.removeView(anTable);

    }
};

/**
 * Save the values to db.
 */
private void saveCategory()
{
    CategoryService aCategoryService = DatabaseService.getInstance(this).getCategoryService();
    aCategoryService.save(getModel());
    Log.d(CLASSNAME, "successfully saved model");

    Intent anIntent = new Intent(this, CategoriesListActivity.class);
    startActivity(anIntent);

}

/**
 * performs the delete.
 */
private void deleteCategory()
{

}

/**
 * Returns the model object. It gets the values from the EditText views and sets to the model.
 * @return
 */
private CategoryModel getModel()
{
    CategoryModel aCategoryModel = new CategoryModel();
    try
    {
        EditText anCategoryNameEditText = (EditText) findViewById(R.id.categoryNameEditText);
        aCategoryModel.setCategoryName(anCategoryNameEditText.getText().toString());
        for(int i= 0; i< itsLinearLayout.getChildCount(); i++)
        {
            View aTableLayOutView = itsLinearLayout.getChildAt(i);
            if(aTableLayOutView instanceof  TableLayout)
            {
                for(int j= 0; j< ((TableLayout) aTableLayOutView).getChildCount() ; j++ );
                {
                    TableRow anTableRow = (TableRow) ((TableLayout) aTableLayOutView).getChildAt(i);
                    EditText anEditText =  (EditText) anTableRow.getChildAt(0);
                    if(StringUtils.isNullOrEmpty(anEditText.getText().toString()))
                    {
                        // show a validation message.
                        //return aCategoryModel;
                    }

                    setValuesToModel(aCategoryModel, i + 1, anEditText.getText().toString());
                }
            }
        }
    }
    catch (Exception anException)
    {
        Log.d(CLASSNAME, "Exception occured"+anException);
    }

    return aCategoryModel;
}

/**
 * Sets the value to model.
 * @param theModel
 * @param theFieldIndexNumber
 * @param theFieldValue
 */
private void setValuesToModel(CategoryModel theModel, int theFieldIndexNumber, String theFieldValue)
{
    switch (theFieldIndexNumber)
    {
        case 1 :
            theModel.setField1(theFieldValue);
            break;
        case 2 :
            theModel.setField2(theFieldValue);
            break;
        case 3 :
            theModel.setField3(theFieldValue);
            break;
        case 4 :
            theModel.setField4(theFieldValue);
            break;
        case 5 :
            theModel.setField5(theFieldValue);
            break;
        case 6 :
            theModel.setField6(theFieldValue);
            break;
        case 7 :
            theModel.setField7(theFieldValue);
            break;
        case 8 :
            theModel.setField8(theFieldValue);
            break;
        case 9 :
            theModel.setField9(theFieldValue);
            break;
        case 10 :
            theModel.setField10(theFieldValue);
            break;
        case 11 :
            theModel.setField11(theFieldValue);
            break;
        case 12 :
            theModel.setField12(theFieldValue);
            break;
        case 13 :
            theModel.setField13(theFieldValue);
            break;
        case 14 :
            theModel.setField14(theFieldValue);
            break;
        case 15 :
            theModel.setField15(theFieldValue);
            break;
    }
}
}

2. เขียน Layout xml ตามที่ระบุด้านล่าง

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#006699"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.blmsr.manager.CategoryEditorActivity">

<LinearLayout
    android:id="@+id/addCategiryNameItem"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/categoryNameTextView"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:text="@string/lbl_category_name"
        android:textStyle="bold"
        />

    <TextView
        android:id="@+id/categoryIconName"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="@string/lbl_category_icon_name"
        android:textStyle="bold"
        />

</LinearLayout>

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

    <EditText
        android:id="@+id/categoryNameEditText"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:hint="@string/lbl_category_name"
        android:inputType="textAutoComplete" />


    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

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

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


            </LinearLayout>

            <ImageButton
                android:id="@+id/addField"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/addCategoryLayout"
                android:src="@drawable/ic_input_add"
                android:onClick="addField"
                />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

  1. เมื่อคุณดูเสร็จแล้วจะเป็นดังที่แสดงด้านล่าง ใส่คำอธิบายภาพที่นี่

0
//MainActivity :





 package com.edittext.demo;
    import android.app.Activity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.Toast;

    public class MainActivity extends Activity {

        private EditText edtText;
        private LinearLayout LinearMain;
        private Button btnAdd, btnClear;
        private int no;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            edtText = (EditText)findViewById(R.id.edtMain);
            btnAdd = (Button)findViewById(R.id.btnAdd);
            btnClear = (Button)findViewById(R.id.btnClear);
            LinearMain = (LinearLayout)findViewById(R.id.LinearMain);

            btnAdd.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!TextUtils.isEmpty(edtText.getText().toString().trim())) {
                        no = Integer.parseInt(edtText.getText().toString());
                        CreateEdittext();
                    }else {
                        Toast.makeText(MainActivity.this, "Please entere value", Toast.LENGTH_SHORT).show();
                    }
                }
            });

            btnClear.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    LinearMain.removeAllViews();
                    edtText.setText("");
                }
            });

            /*edtText.addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,int after) {
                }
                @Override
                public void afterTextChanged(Editable s) {
                }
            });*/

        }

        protected void CreateEdittext() {
            final EditText[] text = new EditText[no];
            final Button[] add = new Button[no];
            final LinearLayout[] LinearChild = new LinearLayout[no];
            LinearMain.removeAllViews();

            for (int i = 0; i < no; i++){

                View view = getLayoutInflater().inflate(R.layout.edit_text, LinearMain,false);
                text[i] = (EditText)view.findViewById(R.id.edtText);
                text[i].setId(i);
                text[i].setTag(""+i);

                add[i] = (Button)view.findViewById(R.id.btnAdd);
                add[i].setId(i);
                add[i].setTag(""+i);

                LinearChild[i] = (LinearLayout)view.findViewById(R.id.child_linear);
                LinearChild[i].setId(i);
                LinearChild[i].setTag(""+i);

                LinearMain.addView(view);

                add[i].setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //Toast.makeText(MainActivity.this, "add text "+v.getTag(), Toast.LENGTH_SHORT).show();
                        int a = Integer.parseInt(text[v.getId()].getText().toString());
                        LinearChild[v.getId()].removeAllViews();
                        for (int k = 0; k < a; k++){

                            EditText text = (EditText) new EditText(MainActivity.this);
                            text.setId(k);
                            text.setTag(""+k);

                            LinearChild[v.getId()].addView(text);
                        }
                    }
                });
            }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

    }

// ตอนนี้เพิ่ม xml main

<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" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/edtMain"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_weight="1"
        android:ems="10"
        android:hint="Enter value" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="Add" />

    <Button
        android:id="@+id/btnClear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:text="Clear" />
</LinearLayout>

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp" >

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

// ตอนนี้เพิ่มไฟล์ xml ดู ..

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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="10dp"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/edtText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:ems="10" />

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="Add" />
</LinearLayout>

<LinearLayout
    android:id="@+id/child_linear"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="5dp"
    android:orientation="vertical" >
</LinearLayout>


0

Kotlin Extension Solution

เพิ่มremoveSelfเพื่อโทรโดยตรงในการดู หากติดกับผู้ปกครองจะถูกลบออก สิ่งนี้ทำให้รหัสของคุณมีการเปิดเผยมากขึ้นและสามารถอ่านได้

myView.removeSelf()

fun View?.removeSelf() {
    this ?: return
    val parent = parent as? ViewGroup ?: return
    parent.removeView(this)
}

ต่อไปนี้เป็น 3 ตัวเลือกสำหรับวิธีเพิ่มมุมมองแบบเป็นโปรแกรมให้กับไฟล์ViewGroup.

// Built-in
myViewGroup.addView(myView)

// Reverse addition
myView.addTo(myViewGroup)

fun View?.addTo(parent: ViewGroup?) {
    this ?: return
    parent ?: return
    parent.addView(this)
}

// Null-safe extension
fun ViewGroup?.addView(view: View?) {
    this ?: return
    view ?: return
    addView(view)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.