动态添加化合物到碎片

时间:2016-05-21 14:13:55

标签: java android android-viewpager fragment

找到解决方案,请参阅下面的答案

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(); }

来设置这些化合物中的所有相关UI元素
_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是否正确?

1 个答案:

答案 0 :(得分:0)

经过一些深夜的调试和代码审查后,我查看了我的XML文件中的“Tile&#39; -View”。对于表现奇怪的TextView,我发现了这个:

android:textIsSelectable="true"

删除它 - 现在一切都像魅力一样。

无法解释这一点。只能想象可能是视图是可选择的事实,安卓会弄乱一些东西,并将所有Tiles中的TextView视为一个,从而在所有视图中显示相同的文本。