在Android中通过单击按钮动态删除和添加布局
我正在处理一个大项目,无法解决动态添加组件的问题。我想通过单击“添加”按钮将布局添加到其他布局中。在此之后,我想通过单击按钮删除它。在Android中通过单击按钮动态删除和添加布局,android,android-layout,Android,Android Layout,我正在处理一个大项目,无法解决动态添加组件的问题。我想通过单击“添加”按钮将布局添加到其他布局中。在此之后,我想通过单击按钮删除它。 特别是对于stackoverflow,我构建了一个我想做的小示例。 添加它不是问题,但删除它是问题。当我单击“删除”按钮时,此删除不是我需要的(我要删除“删除”按钮的父项)。 在此之后,我想问一些更重要的问题。我需要将所有这些数据保存到数据库中。因此,我不知道如何从每个文本字段中获取数据并将其放入列表(或其他内容),因为所有这些文本字段都具有相同的ID。 因此,我
特别是对于stackoverflow,我构建了一个我想做的小示例。 添加它不是问题,但删除它是问题。当我单击“删除”按钮时,此删除不是我需要的(我要删除“删除”按钮的父项)。
在此之后,我想问一些更重要的问题。我需要将所有这些数据保存到数据库中。因此,我不知道如何从每个文本字段中获取数据并将其放入列表(或其他内容),因为所有这些文本字段都具有相同的ID。 因此,我看到了两种解决方法: 1) 动态更改那里的ID
2) 还有别的事吗 非常感谢 这是 sub_fields.xml
在通过
addView(childView)
添加某些视图之前,应该保存对该视图的引用。在这种情况下,removeView(childView)
将起作用。通过getParent()
在视图树中移动来获取该视图不是一个好主意
顺便问一下,您的
addView
呼叫在哪里?也许可以尝试子布局场。removeView(view1)
-view1
是final
如果您想以某种方式改变您的小部件(用于存储在db中、迭代或任何您想要的),您可以使用View.generateViewId()
(API17)或使用来自的自定义方法为它们设置动态ID,谢谢大家!!!
答案是:
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);
}
ltInflater.充气(R.layout.sub_字段,subLayoutFields,true)代码>-最后一个标志true
表示自动将此视图添加到父视图(subLayoutFields
在本例中)Ok,那么,是否要删除view1
?我不知道如何保存对我添加的视图的引用,因为所有视图都具有相同的ID。我想这就是我无法删除它的原因。您可以通过调用view1.setId(ID)
来设置膨胀视图的ID。我认为设置视图的ID是正确的方法。什么都没有?您是否尝试过在onClick
中记录或显示Toast
?您可能需要使用subLayoutFields.requestLayout()代码>或子布局外场。无效()
但是我认为removeView
在移除这些代码后也调用其中一个方法对我来说也不起作用。应用程序在单击“删除”按钮时崩溃。它显示的异常如下:-在android的父或祖先上下文中找不到方法onClickAddd(视图):在视图类android.support.v7.widget.AppCompatButton上定义的onClick属性,id为“btnRemove”
<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>
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()));
}});
}
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);
}