gpt4 book ai didi

android - 恢复具有相同 ID 的两个 View 的 fragment

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:29:33 26 4
gpt4 key购买 nike

我要实现一个复杂的布局。它有 19 个部分,可以根据用户先前输入的大量参数显示或不显示。为了简化代码并且不显示未使用的部分,布局是动态创建的。

一切都在 fragment 中。该 fragment 有一个用作容器的 LinearLayout,在创建 fragment 时,我会生成所有必要的部分。

每个部分都由其自己的本地适配器管理,该适配器负责膨胀该部分的布局并将其添加到容器中。

一切正常。问题是 2 个部分具有完全相同的结构,因此它们共享相同的 xml 布局。因此,这两个部分的内部 View 具有相同的 ID。这不是问题,因为该部分在其适配器中本地管理。当我转到下一个 fragment 然后返回到这个 fragment 时,问题就出现了。系统尝试恢复 View 的先前状态,并且因为这两个部分具有相同的 ID,当恢复第二个部分时,其值也设置为第一个。

是否有任何解决方案来管理它或告诉 fragment 不要恢复其状态(因为无论如何都是手动重新加载的)。

这是当前结构的一个简单示例:

fragment xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

节 xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/section_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

fragment 代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_layout, container, false);

if (<condition>)
createSection1(getContext(),view);

if (<condition>)
createSection2(getContext(),view);

return view;
}


private void createSection1(Context context, ViewGroup root){
Section1Adapter adapter = new Section1Adapter(context, root);
// ...
}

private void createSection2(Context context, ViewGroup root){
Section2Adapter adapter = new Section2Adapter(context, root);
// ...
}

适配代码(两者思路相同)

public Section2Adapter(LayoutInflater inflater, ViewGroup root) {

View view = LayoutInflater.from(context).inflate(R.layout.section_layout, root, false);

initView(view);

root.addView(view);
}

最佳答案

正如您所说的那样,您的问题基本上是处于这种状态: enter image description here

你需要做的,就是告诉Android自己在SparseArray中的哪个键保存哪个EditText的状态。基本上,您需要做到这一点:

enter image description here

实现此目的的机制在 this amazing article 中有很好的解释。 , 帕夏·杜德卡 (Pasha Dudka) 着。 (也感谢他的精美图片)

只需在文章中搜索“View IDs should be unique”,您就会得到答案。

针对您的特定情况的解决方案的要点如下:

  • 你可以继承 LinearLayout s.t.您的 CustomLinearLayout 将知道 child 所属的部分,当它处于状态时。这样,您可以将一个部分中的所有子状态保存到专用于该部分的 SparseArray,并将专用的 SparseArray 添加到 global SparseArray(就像在图片中一样)
  • 您可以继承 EditText,s.t.您的 CustomEditText 知道它属于哪个部分,并将其状态保存在 SparseArray 中的自定义键中 - 例如section_text_Section1 用于第一部分,section_text_Section2 用于第二部分

就个人而言,我更喜欢第一个版本,因为即使您稍后向您的版 block 添加更多 View ,它也能正常工作。第二个不适用于更多 View ,因为在第二个 View 中,进行智能状态保存的不是父 View ,而是 View 本身。

希望这对您有所帮助。

关于android - 恢复具有相同 ID 的两个 View 的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45818015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com