gpt4 book ai didi

android - Fragments 和 FragmentPagerStateAdapter - 重新创建具有相同 ID 的 View 失败

转载 作者:行者123 更新时间:2023-11-30 03:13:45 26 4
gpt4 key购买 nike

我正在使用带有 FragmentPagerStateAdapterViewPager。每个页面都有一个列表,手动管理 => 我通过从 xml 扩展布局来为这些行创建 View 。结果,不同行中的 View 具有相同的 ID。因为行是从 XML 膨胀的...

现在的行为如下:

第 1 页如下所示:

// Page 1:
// Row 1: EditText = "Test1"
// Row 2: EditText = "Test2"

我滑动到第 2 页,然后滑动到第 3 页,然后我滑动回到第 1 页,第 1 页如下所示:

// Page 1:
// Row 1: EditText = "Test2"
// Row 2: EditText = "Test2"

问题:所有 EditText 都显示列表中最后一个 EditText 的值...(注意,EditText 具有相同的 ID)。

如果我手动将 EditText 的 ID 设置为行索引,一切正常。

这正常吗?是否有针对该问题的简单(好的)解决方案?

最佳答案

Tt 似乎是 Android 3.X 中的一个错误

解决方案是手动设置 ID,这样它们就不会在 fragment 之间匹配,或者在 fragment 变得不可见时重置 ID。我喜欢第二个,因为它可以很容易地禁用或启用,并且不需要特殊的 ID 处理。

/**
* Used for resetting and restoring View id's. This is used as a workaround for
* Android 3.x when ViewPager Fragment instances with the same layout have
* problems referencing next focus id's.
*/
public final class ViewIdResetter {

private final Map<View, Integer> viewMap;

public ViewIdResetter(final View rootView) {
this.viewMap = new HashMap<View, Integer>();
this.fillmap(rootView);
}

private void fillmap(final View view) {
if (view instanceof ViewGroup) {
final ViewGroup vg = (ViewGroup) view;
for (int i = 0; i < vg.getChildCount(); i++) {
this.fillmap(vg.getChildAt(i));
}
}
this.viewMap.put(view, view.getId());
}

public void clearIds() {
for (final View key : this.viewMap.keySet()) {
key.setId(-1);
}
}

public void restoreIds() {
for (final View key : this.viewMap.keySet()) {
key.setId(this.viewMap.get(key));
}
}

}

fragment

private ViewIdResetter resetter;

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.resetter = new ViewIdResetter(view);
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (this.resetter != null) {
this.resetter.restoreIds();
}
} else {
if (this.resetter != null) {
this.resetter.clearIds();
}
}
}

setUserVisibleHint 在 Fragment 可见时由 ViewPager 触发。ViewIdResetter 确保一次只有一个 fragment 具有相同的 ID 集。

关于android - Fragments 和 FragmentPagerStateAdapter - 重新创建具有相同 ID 的 View 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20498173/

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