- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用带有 FragmentPagerStateAdapter
的 ViewPager
。每个页面都有一个列表,手动管理 => 我通过从 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/
我有一个像这样的 fragment 栈 F1 -> F2 -> F3 -> F4 -> F5 现在我需要删除 F2、F3、F4 fragment 。 我需要如果我从 F5 fragment 按下后退按
我需要帮助来理解以下场景的工作原理以及如何实现结果。 我有一个名为 ShoppingCart 的类。它有一个名为 addItemsToShoppingCartFromPreviousOrder 的方法
我有一个包含 ViewPager 的 fragment 。这个 ViewPager 显然是由其他 Fragments 填充的。 我的问题是,ViewPager 中的 Fragment 是否有任何方法(
所以我正在实现一个 FragmentActivity 并尝试添加一个 fragment ,但是我遇到了多个问题。我以前做过这个,实际上我使用的代码与上一个项目(它工作的地方)相同,但由于某种原因它在这
Closed. This question needs details or clarity。它当前不接受答案。
我想将 Android X fragment (androidx.fragment.app.Fragment) 转换为 Android native fragment (android.app.Fra
假设我有一个包含 10 列文本类型 (20) 的 SQLite 表。 ListFragment 将从数据库中提取 4 列并使用 SimpleCursorAdapter 显示在列表中。 选择后,List
我有一个对话框 fragment ,我为延迟初始化创建了一个类。当我显示对话框时,它显示正常。但是,当我关闭对话框时,它崩溃的原因是: fragment 与 fragment 管理器无关。 我也尝试过
我想在 View 分页器更改为 fragment 时刷新该 fragment 。 package com.mcivisoft.rcbeam; import android.os.Bundle; imp
我有一个名为的 Activity MainActivity 我在容器 R.id.mainContainer 中添加了 fragment “BenefitFragment”。 在 BenefitFrag
所以我有这个 ClientListView,效果很好,可以显示客户,我可以单击一个客户并在右侧获取他们的详细信息(在我的第二个 fragment 中)。由此处的布局定义: 这很好用,但后来我
我试过这段代码,但点击第一个 fragment 中的按钮并没有改变第二个 fragment 中的字符串值。 这是第一个 fragment 的 kotlin 文件。它有两个按钮,点击它们可以更改字符串值
我有以下情况:我打开 fragment A 和目标,通过按钮的单击事件转到 fragment B。当我在 fragment B 中并点击后退按钮(为了返回 fragment A) 我想将一些参数传递给
我制作了一个 NavigationDrawer fragment ,其中包含 Home、Settings、Feedback 等项目。 home 项在点击 home 时应该打开,home 是在应用程序启
我正在一个接一个地替换 2 个 fragment ,两个 fragment 都有不同的选项菜单。当我替换第二个 fragment 时,它也显示第一个 fragment 的菜单。 setHasOptio
我有问题: android.app.Fragment$InstantiationException: Unable to instantiate fragment ${packageName}.${a
我正在研究 fragment 转换。当我用第二个 fragment 替换第一个 fragment 时,它出现在第一个 fragment 的下方。我希望它移动到第一个 fragment 之上。我该怎么做
我在抽屉导航里总共有 12 个 fragment 。每个 fragment 都有 volley 方法。每个 fragment 都显示自己的 Volley 响应,除了 position = 1 和 po
我在我的 Activity 中使用了两个 fragment 。最初我将向 Activity 添加一个 fragment 。然后在第一个 fragment 中使用监听器我想用第二个 fragment 替
我正在实现一个“fragments-101”程序,当相应的按钮被点击时我会替换一个 fragment 。然而,下面的事情发生了: 为什么会这样?为什么初始 fragment 没有被完全替换?MainA
我是一名优秀的程序员,十分优秀!