我正在尝试保存许多动态膨胀视图的状态(如在改变屏幕方向时保持其值)。我四处张望,但仍未找到解决问题的答案。

我在片段中充气的商品的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>


因此,我在此片段中有一个静态变量,该变量可以统计有多少个静态变量,以及大于零的静态变量。在循环中重新创建视图以获取尽可能多的视图:

@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;
}

最佳答案

如果我了解您要执行的操作,那么您根本不应该这样做。除了跟踪和重新创建有关屏幕方向变化的所有视图和数据外,

这将是最容易添加的
android:configChanges="orientation|screenSize"到活动中的清单。这样可以防止您的应用在方向更改时重新启动,然后您可以处理要在方法中进行的所有更改

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


或者,您可以保留该片段,并在重新启动时对其进行检索,如本链接中所述

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

07-28 12:40