找到解决方案,请参阅下面的答案
tl; dr - 来自View
的{{1}}的{{1}}很好,但应用中显示的结果却不是。 WTF?
我是Android新手。我正在开发一个单活动Android应用,其中一些标签由TabLayout管理。内容是ViewPager中显示的片段。我的activity_main.xml如下所示:
Fragment
我正在使用FragmentPagerAdapter来保持碎片一直处于活动状态(与FragmentStatePagerAdapter相反),但是当用户无法从当前位置到达碎片时会破坏视图。这意味着,如果用户位于左外侧选项卡上,则从左侧经过第二个选项卡的所有选项卡都以片段形式存在,但没有视图。这似乎是违反直觉的,因为用户只需单击他想要的选项卡并随时访问任何片段,但我知道FragmentPagerAdapter只能看到ViewPager(通过滑动导航),而不是TabLayout。
在创建片段视图时,会调用onCreateView()
。取消View时,将调用<!-- SIMPLIFIED VERSION -->
<LinearLayout>
<android.support.design.widget.TabLayout/>
<android.support.v4.view.ViewPager/>
</LinearLayout>
。我的片段很简单:
onCreateView()
现在,我在后台有一堆ob对象代表一些数据。当片段获得视图(onDestroyView()
)时,我想将每个数据项的自定义视图添加到片段中。这应该看起来像一个垂直列表。我已经在<!-- SIMPLIFIED VERSION -->
<LinearLayout>
<ScrollView>
<LinearLayout>
<!-- I want to dynamically add Views here -->
</LinearLayout>
<ScrollView>
<LinearLayout>
中实例化了要添加的视图。这对我来说似乎合乎逻辑,因为onCreateView()
仅在我的整个应用中被调用一次。
onCreate()
由于片段的视图被破坏,而不是片段本身,每次用户从这个片段滑动太远时都会这样做。我没有完全得到这一部分(请参阅下面的问题列表),但似乎稍后再次调用onCreate()
时,我已添加的化合物仍然存在。因此,我删除了片段中的所有视图“@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// The fragment UI
_me = (LinearLayout) inflater.inflate(R.layout.fragment_log, container, false);
// LinearLayout inside the ScrollView
LinearLayout l = (LinearLayout) _me.findViewById(R.id.scrollableLinearLayout);
// Already instantiated CompoundViews
for(LogEntryCompound compound: _logEntryCompounds) {
l.addView(compound);
// My method to populate all TextViews, etc. from compound._data
compound.refreshUI();
}
return _me;
}
:
onCreateView()
我显示的化合物有点像Tiles,有一些TextViews,ProgressBars,并且是可点击的。它们直接表示数据对象。它们显示的所有内容都直接来自这些数据(每个化合物都引用了他的onDetroyView()
)。我通过调用@Override
public void onDestroyView() {
super.onDestroyView();
LinearLayout l = (LinearLayout) _me.findViewById(R.id.scrollableLinearLayout);
l.removeAllViews();
}
:
_data
现在我有一个非常奇怪的问题:所有_data对象都应该按原样运行,所有数据都是正确的,甚至化合物的UI元素都有正确的refreshUI()
集。我在public void refreshUI() {
_txtName.setText(_data.getName());
_txtDescr.setText(_data.getDescription());
_txtTopRight.setText(_data.getTimeString());
...
}
中返回的视图非常好。但是应用程序中显示的View不是。四个TextView中的三个很好,但是一个显示所有'Tiles'im的相同值。显示的值仅为LAST Tile的正确值。
此外,我还有一些更普遍的问题(我认为更有经验的读者已经在他们的脚趾上告诉我)关于应该怎样做的事情:
1。我可以让FragmentPagerAdapter以一种永远不会破坏片段视图的方式运行吗?它只有三个标签,而不是大量的数据。每次重新创建视图肯定是低效的?
2. FragmentPagerAdapter / ViewPager的工作原理是什么?为什么,即使View显然被破坏了,它仍然包含我在销毁之前添加的孩子?
3. 我应该在代码中的其他地方添加我的化合物吗? .text
是否会自动恢复以前的状态?或者onCreateView
用于实例化,onCreateView()
用于添加到UI是否正确?
答案 0 :(得分:0)
经过一些深夜的调试和代码审查后,我查看了我的XML文件中的“Tile&#39; -View”。对于表现奇怪的TextView,我发现了这个:
android:textIsSelectable="true"
删除它 - 现在一切都像魅力一样。
无法解释这一点。只能想象可能是视图是可选择的事实,安卓会弄乱一些东西,并将所有Tiles中的TextView视为一个,从而在所有视图中显示相同的文本。