动态删除视图
Removing Views dynamically
这个我找了很多,都解决不了。我有两个文本视图和一个按钮(添加其他 LinearLayout)的 LinearLayout,如下所示:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<EditText android:id="@+id/ingredientsField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/ingredients"
android:inputType="text"
xmlns:android="http://schemas.android.com/apk/res/android" />
<EditText
android:id="@+id/quantityField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/quantity"
android:inputType="number"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/add_ingredient_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add"
android:layout_margin="@dimen/boxes_margin"
app:icon="@drawable/ic_add_ingr_btn"
/>
</LinearLayout>
添加的布局是这样的:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="50dp">
<EditText android:id="@+id/ingredientsField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/ingredients"
android:inputType="text"
xmlns:android="http://schemas.android.com/apk/res/android" />
<EditText android:id="@+id/quantityField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/quantity"
android:inputType="number"
xmlns:android="http://schemas.android.com/apk/res/android" />
<ImageButton
android:id="@+id/remove_ingredient_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:src="@drawable/ic_remove_ing_qnt"/>
</LinearLayout>
在 Activity 中,我创建了一个添加新布局的方法(并且有效),并在其中创建了一个使用 删除按钮[=20 删除相应布局的方法=]. Delete Button 只工作一次,并且只有在它在第一个添加的布局中时才有效。这是代码:
add_ingredient.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.ingredient_quantity_layout, null);
// Add the new row before the add field button.
parentIngredientLayout.addView(rowView);
ImageButton removeChildIngredient = findViewById(R.id.remove_ingredient_btn);
removeChildIngredient.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
parentIngredientLayout.removeView((View) v.getParent());
}
});
}
});
这一行:
parentIngredientLayout.removeView((View)
v.getParent());
您正在尝试删除 removeChildIngredient ImageButton 的父级,这可能是 parentIngredientLayout,我认为这不是您想要的,
你可以试试这个:
parentIngredientLayout.
removeView(rowView);
但是在您的实现中,当您添加多个成分时可能会遇到问题,因为您正在为每个新成分设置一个新的 onClickListener,而 ImageButton 只会删除您添加的最后一个(最后一个 onClickListener 集),
相反,您可以使用 List/RecyclerView 或搜索其他实现,例如。将 ImageButton 放在 Inflated Layout 中,这样您添加的每个 Layout 中都会有一个 Remove Button,
然后你应该用 rowView.findViewById
替换你的 ImageButton 的 findViewById
并且这一行应该保持不变
parentIngredientLayout.removeView((View) v.getParent());
您必须在最后插入的布局的 ImageButton
上设置 OnClickListener
事件。
为此,只需更改此行
ImageButton removeChildIngredient = findViewById(R.id.remove_ingredient_btn);
至
ImageButton removeChildIngredient = rowView.findViewById(R.id.remove_ingredient_btn);
rowView.findViewById
在最后插入的布局上搜索 ImageButton,而不是在包含其他布局的整个布局上搜索。
这个我找了很多,都解决不了。我有两个文本视图和一个按钮(添加其他 LinearLayout)的 LinearLayout,如下所示:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<EditText android:id="@+id/ingredientsField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/ingredients"
android:inputType="text"
xmlns:android="http://schemas.android.com/apk/res/android" />
<EditText
android:id="@+id/quantityField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/quantity"
android:inputType="number"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/add_ingredient_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add"
android:layout_margin="@dimen/boxes_margin"
app:icon="@drawable/ic_add_ingr_btn"
/>
</LinearLayout>
添加的布局是这样的:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="50dp">
<EditText android:id="@+id/ingredientsField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/ingredients"
android:inputType="text"
xmlns:android="http://schemas.android.com/apk/res/android" />
<EditText android:id="@+id/quantityField"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:hint="@string/quantity"
android:inputType="number"
xmlns:android="http://schemas.android.com/apk/res/android" />
<ImageButton
android:id="@+id/remove_ingredient_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/boxes_margin"
android:src="@drawable/ic_remove_ing_qnt"/>
</LinearLayout>
在 Activity 中,我创建了一个添加新布局的方法(并且有效),并在其中创建了一个使用 删除按钮[=20 删除相应布局的方法=]. Delete Button 只工作一次,并且只有在它在第一个添加的布局中时才有效。这是代码:
add_ingredient.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.ingredient_quantity_layout, null);
// Add the new row before the add field button.
parentIngredientLayout.addView(rowView);
ImageButton removeChildIngredient = findViewById(R.id.remove_ingredient_btn);
removeChildIngredient.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
parentIngredientLayout.removeView((View) v.getParent());
}
});
}
});
这一行:
parentIngredientLayout.removeView((View)
v.getParent());
您正在尝试删除 removeChildIngredient ImageButton 的父级,这可能是 parentIngredientLayout,我认为这不是您想要的,
你可以试试这个:
parentIngredientLayout.
removeView(rowView);
但是在您的实现中,当您添加多个成分时可能会遇到问题,因为您正在为每个新成分设置一个新的 onClickListener,而 ImageButton 只会删除您添加的最后一个(最后一个 onClickListener 集),
相反,您可以使用 List/RecyclerView 或搜索其他实现,例如。将 ImageButton 放在 Inflated Layout 中,这样您添加的每个 Layout 中都会有一个 Remove Button,
然后你应该用 rowView.findViewById
替换你的 ImageButton 的 findViewById并且这一行应该保持不变
parentIngredientLayout.removeView((View) v.getParent());
您必须在最后插入的布局的 ImageButton
上设置 OnClickListener
事件。
为此,只需更改此行
ImageButton removeChildIngredient = findViewById(R.id.remove_ingredient_btn);
至
ImageButton removeChildIngredient = rowView.findViewById(R.id.remove_ingredient_btn);
rowView.findViewById
在最后插入的布局上搜索 ImageButton,而不是在包含其他布局的整个布局上搜索。