【问题标题】:Remove and add layout dynamically by click button in Android通过Android中的单击按钮动态删除和添加布局
【发布时间】:2015-04-24 00:17:14
【问题描述】:

我正在做一个大项目,我无法解决动态添加组件的问题。我想通过单击添加按钮将布局添加到其他布局中。在此之后,我想通过单击“删除”按钮将其删除。
特别是对于stackoverflow,我构建了一个我想做的小例子。 添加它不是问题,但删除它是一个问题。当我单击“删除”按钮时,这不是我需要的删除(我想删除“删除”按钮的父级)。
在此之后我想问一些更重要的事情。我需要将所有这些数据保存到数据库中。所以我不知道如何从每个文本字段中获取数据并将其放入列表(或其他内容),因为所有这些文本字段有相同的ID。 所以我看到了两种解决方法: 1)动态更改 ID
2)其他))
非常感谢!!!

这是

sub_fields.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false"
android:id="@+id/detailsLayout"
android:focusableInTouchMode="true">




    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/txtName"
        android:hint="name" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/txtPhone"
        android:layout_gravity="center_horizontal"
        android:hint="phone" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ADD"
            android:id="@+id/btnAddd"
            android:onClick="onClickAddd" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="REMOVE"
            android:id="@+id/btnRemove"
            android:onClick="onClickAddd" />

    </LinearLayout>
</LinearLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false"
android:id="@+id/generalLayout">

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="56dp"
    android:gravity="center"
    android:background="#7d65258a">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="FILL FIELDS"
        android:id="@+id/textView" />
</LinearLayout>

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/subLayoutFields">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/txtName"
        android:hint="name" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/txtPhone"
        android:layout_gravity="center_horizontal"
        android:hint="phone" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ADD"
            android:id="@+id/btnAdd"
            android:onClick="onClickAdd" />

    </LinearLayout>
</LinearLayout>

MainActivity.java

package andrey.adddinamicallycontrolsapp;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends ActionBarActivity {

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
       if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    public void onClickAdd(View view) {
        LayoutInflater ltInflater = getLayoutInflater();
       final LinearLayout subLayoutFields = (LinearLayout) findViewById(R.id.subLayoutFields);
       final View view1 = ltInflater.inflate(R.layout.sub_fields, subLayoutFields, true);
        Button buttonRemove = (Button)view1.findViewById(R.id.btnRemove);

        buttonRemove.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                subLayoutFields.removeView((LinearLayout)(v.getParent().getParent()));
            }});

    }

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    addView(childView) 添加一些视图之前,您应该保存对它的引用。在这种情况下,removeView(childView) 将起作用。通过getParent() 在视图树中旅行来获取该视图不是一个好主意。

    顺便问一下,你的addView 电话在哪里?

    【讨论】:

    • ltInflater.inflate(R.layout.sub_fields, subLayoutFields, true); - 最后一个标志true 表示自动将此视图添加到父视图(在这种情况下为subLayoutFields
    • 好的,那么你要删除view1吗?
    • 我不知道如何保存对我添加的视图的引用,因为所有视图都有相同的 ID。我认为这就是我无法删除它的原因。
    • 您可以通过调用view1.setId(id)为您的膨胀视图设置ID。
    【解决方案2】:

    也许试试subLayoutFields.removeView(view1) - view1final

    如果您想以某种方式改变您的小部件(用于存储在数据库中、迭代或任何您想要的),您可以使用 View.generateViewId() (API17) 或使用来自 most voted answer here 的自定义方法为它们设置动态 ID

    【讨论】:

    • 我认为设置视图的Id是正确的做法。
    • 什么都没有?您是否尝试过在onClick 中记录或显示Toast?您可能需要使用subLayoutFields.requestLayout();subLayoutFields.invalidate();,但我认为removeView 在删除后也会调用其中一种方法
    【解决方案3】:

    谢谢大家!!! 答案是:

    public void onClickAddPanel(View view) {
    
                LayoutInflater ltInflater = getLayoutInflater();
                LinearLayout subLayoutFieldsForBtnAdd = (LinearLayout) findViewById(R.id.productDetails);
                View view1 = ltInflater.inflate(R.layout.product_details, subLayoutFieldsForBtnAdd, true);
    
    }
    
    
    public void onClickRemovePanel(View v) {
        View v1 = (View) v.getParent();
        LinearLayout subLayoutFieldsForBtnRemove = (LinearLayout) findViewById(R.id.productDetails);
        subLayoutFieldsForBtnRemove.removeView(v1);
    }
    

    【讨论】:

    • 这段代码也不适合我。应用程序在单击删除按钮时崩溃。它显示如下异常:- 在视图类 android.support.v7.widget.AppCompatButton 上定义的 android:onClick 属性的父或祖先上下文中找不到方法 onClickAddd(View),id 为“btnRemove”
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2018-05-15
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    相关资源
    最近更新 更多