我试图保存许多动态膨胀的视图的状态(如在屏幕方向上保持其值的变化)。我看了四周,但还没找到问题的答案。
我在片段
中膨胀的项目的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;
}
答案 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