Android保存多个动态膨胀视图的状态

时间:2018-03-08 08:21:18

标签: android

我试图保存许多动态膨胀的视图的状态(如在屏幕方向上保持其值的变化)。我看了四周,但还没找到问题的答案。

我在片段

中膨胀的项目的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:background="@drawable/border"
    android:layout_marginTop="5dp">

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

        <EditText
            android:id="@+id/ingredient_name1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="@string/ingredient_hint"
            android:inputType="text" />

        <Spinner
            android:id="@+id/ingredient_category1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:entries="@array/categories" />
    </LinearLayout>

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

        <EditText
            android:id="@+id/measure_amount1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="@string/num_hint"
            android:inputType="numberDecimal" />

        <Spinner
            android:id="@+id/measure_type1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:entries="@array/measurements" />
    </LinearLayout>

</LinearLayout>

所以我在这个片段中有一个静态变量,它可以计算有多少个,如果有多于0个。在一个循环中重新创建视图以获得尽可能多的视图:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.new_recipe,container,false);

    mainLayout = view.findViewById(R.id.ingredient_layout);
    newIngredientButton = view.findViewById(R.id.new_ingredient);
    ScrollView scrollView = view.findViewById(R.id.ingredient_sv);

    //Re-create the items if we have more than 0
    if (ingredientCount > 0) {
        for (int i = 0; i < ingredientCount; i++) {
            View newItem = LayoutInflater.from(getContext()).inflate(R.layout.ingredient_item,
                    mainLayout, false);
            newItem.setId(i);
            mainLayout.addView(newItem);
        }
    }

    //OnClick to inflate the item
    newIngredientButton.setOnClickListener(l -> {
        View newItem = LayoutInflater.from(getContext()).inflate(R.layout.ingredient_item,
                mainLayout, false);
        newItem.setId(ingredientCount);
        mainLayout.addView(newItem);
        scrollView.post(() -> scrollView.fullScroll(View.FOCUS_DOWN));
        ingredientCount++;
    });

    return view;
}

1 个答案:

答案 0 :(得分:1)

如果我明白你要做什么,你就不应该这样做。而不是跟踪和重新创建有关屏幕方向变化的所有视图和数据,

最容易添加 android:configChanges="orientation|screenSize"根据活动显示您的清单。这可以防止您的应用在方向更改时重新启动,然后您可以处理您希望在方法中进行的任何更改

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        ...
    }

或者您可以保留片段并在重新启动时检索它,如此链接中所述

https://developer.android.com/guide/topics/resources/runtime-changes.html