0

如果向当前活动/布局添加超过 3 个自己的“组件”,我的应用程序将冻结,LogCat 将堆(碎片情况)增加到 14mb。添加第四个“组件”并且Android要求关闭我的应用程序需要很长时间。

我编写了一个 Activity,它有一些组件(EditTexts)和一个自己的“组件”。我想做一些类似于联系人应用程序(添加号码)但有成分的事情。因此,我创建了一个类 IngredientsLayout,它扩展了 LinearLayout 和一个 Layout xml 文件,其中包含一个 TextView 和一个“添加”按钮,我已将其放置在 Activity-Layout 上。每次我按下添加按钮时,一个带有 3 个 EditTexts 和一个 ImageButton 的成分布局将被添加到当前的成分布局中,它应该“保存”所有添加的成分。

我做错了什么?

成分布局类:

public class IngredientsLayout extends LinearLayout {

ImageButton imageButtonAddIngredient;
ArrayList<IngredientLayout> arrayList;

public IngredientsLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.ingredients_list, this);

    arrayList = new ArrayList<IngredientLayout>();
    imageButtonAddIngredient = (ImageButton) findViewById(R.id.imageButtonAddIngredient);
    imageButtonAddIngredient.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayoutIngredientsList);
            IngredientLayout ingredientLayout = new IngredientLayout(getContext(), null);
            ingredientLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));  
            arrayList.add(ingredientLayout);
            layout.addView(ingredientLayout);
        }

    });
}
}

成分_布局.xml:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayoutIngredientsList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
            android:layout_margin="5dp"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="left|center_vertical"
            android:layout_weight="1"
            android:text="@string/ingredients_list_name" />
        <ImageButton
            android:id="@+id/imageButtonAddIngredient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:src="@drawable/ic_menu_add_ingredient" />
    </LinearLayout>
</LinearLayout>
</merge>

成分布局类:

public class IngredientLayout extends LinearLayout {
public IngredientLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.ingredients_list_row, this);
}
}

成分列表行.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/linearLayoutIngredientRow"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <EditText
      android:id="@+id/editTextAmount"
      android:layout_width="45dp"
      android:layout_height="fill_parent"
      android:layout_weight="0.11"
      android:ems="10"
      android:hint="@string/ingredients_list_listrow_amount"
      android:inputType="numberDecimal" >

      <requestFocus />
  </EditText>

  <EditText
      android:id="@+id/editTextUnit"
      android:layout_width="60dp"
      android:layout_height="fill_parent"
      android:layout_weight="0.06"
      android:ems="10"
      android:hint="@string/ingredients_list_listrow_unit" /><EditText
      android:id="@+id/editTextName"
      android:layout_width="127dp"
      android:layout_height="match_parent"
      android:layout_gravity="left"
      android:layout_weight="0.005"
      android:ems="10"
      android:hint="@string/ingredients_list_listrow_name" />

<ImageButton
      android:id="@+id/imageButton1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@android:color/transparent"
      android:src="@drawable/ic_menu_cancel" />

</LinearLayout>
</merge>
4

1 回答 1

0

LinearLayouts 不适用于这种动态访问。你需要做的是一个 ListView 和一个适配器。

每次您将新项目添加到适配器中时,您都会调用 NottifyDataChanged 以使用新项目更新列表视图。

于 2012-10-28T13:01:22.570 回答