问题标签 [fragmentstatepageradapter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
15096 浏览

android - 对于 FragmentStatePagerAdapter 创建的 Fragment,Fragment getView() 始终返回 null

我已经阅读了很多关于片段的内容。发现其他人在检索片段视图时遇到问题,因为始终返回 null 但没有答案解决了我的问题。我想做的是创建一个图片库。我有一个包含图像视图的片段。为了显示片段,我使用了 android.support.v4.view.ViewPager。并喂ViewPager我使用一个android.support.v4.app.FragmentStatePagerAdapter.

问题是,当一切都构建并显示图像时,我想将当前显示的图像保存到磁盘。所以我需要获取当前的片段图像视图,但我不能,因为 fragment.getView() 总是为空,与片段关联的活动也为空,我不知道为什么会这样。这里有一些代码,看看是否有人可以在这里提供帮助:

这是我的片段:

这是我的适配器:

这是主要活动,请注意带有 get 的评论:

对不起,很长的消息来源,我已经清理了我能做的一切,但我想展示所有的游戏部件。有人能猜到发生了什么吗?

提前致谢。

0 投票
1 回答
7594 浏览

android - 使用 FragmentStatePagerAdapter 时刷新片段视图

似乎之前讨论过刷新问题,但没有一个解决方案对我有用。

我正在尝试做的事情: 我正在使用 FragmentStatePagerAdapter。适配器的每个位置都包含一个片段,该片段具有线性布局,具有象棋一样的外观,每个单元格都由 CheckedTextView 表示。

还有一个侦听器,它应该侦听点击并删除单元格上的先前选择并进行新选择。

什么工作: 每个片段都正确加载了所有数据/默认状态(在片段加载到列表中时计算)

当我单击一个单元格时,保存的单元格列表中的所有状态都被正确获取,并且我可以在调试时更改查看代码中的状态更改。同时,我为表示单元格的 CheckedTextView 分配了一个新状态。设置如下:

问题: 即使正确存储和分配了值,也无法刷新视图,但视图中单元格的值也不会更新。

我尝试过但不起作用的提示: 1. 调用 adapter.notifyDataSetChanged: 只有在我们覆盖了 FragmentStatePagerAdapter 时才能调用:

2. 为 DestroyItem 添加 Overriden 方法,并将片段添加到 getItem 上的 Map:

这不合适,因为我正在使用 FragmentStatePagerAdapter,因此使用此 pagerAdapter 的全部目的将不复存在。

3.调用invalidate: 这个场景不合适,需要实时刷新。

4. instanceiteItem() 中的 setTag() 方法: 我认为这在这种情况下不合适。

引用的线程: 在恢复活动时刷新 FragmentStatePagerAdapter 上的图像

ViewPager PagerAdapter 不更新视图

动态更新 ViewPager?

notifyDataSetChanged 无法更新 ListView

我试图尽可能清楚地说明我的问题,如果有人需要更多说明,请询问。

紧急回复将不胜感激,

干杯

****更新*****

我使用的是 ViewPagerIndicator,而不是默认的 ViewPager。

0 投票
2 回答
14176 浏览

android - 无法从 ViewPager 中删除片段,为什么?

我一定遗漏了一些东西,但我无法从我的ViewPager. 我将页面标题存储在ArrayList

部分ViewPagerActivity.java(这是一个FragmentActivity,主要活动):

我有一个片段 ( 111),我想555通过单击111. (因为它以 , 开头0555是第 4 个片段)。

部分fragment111.java(即 a Fragment):

我有POSITION_NONE一些人通过覆盖该getItemPosition()方法而错过的东西。

我的适配器类:

我正在使用FragmentStatePagerAdapter并且notifyDataSetChanged()效果很好(我更新了 a 的状态CheckBox并且我看到它有效)。如何从ViewPager?

提前致谢!

0 投票
1 回答
33599 浏览

android - 屏幕方向更改后从 ViewPager 的适配器中销毁项目

ViewPager因此,在屏幕方向更改后,我在销毁(删除)一页时遇到了问题。我将尝试在以下几行中描述问题。

我正在使用 的FragmentStatePagerAdapter适配器ViewPager和一个描述无限视图寻呼机应该如何工作的小界面。它背后的想法是您可以向右滚动直到到达ViewPager. 如果您可以从 API 调用加载更多结果,则会显示一个进度页面,直到结果出现。

到目前为止一切都很好,现在问题来了。如果在这个加载过程中,我旋转屏幕(这不会影响 API 调用,它基本上是一个AsyncTask),当调用返回时,应用程序崩溃给我这个异常:

在对库的代码进行了一些挖掘之后,似乎mIndex片段的数据字段比0这种情况下要少,这会引发该异常。

这是寻呼机适配器的代码:

下面的onPageSelected()回调,如果需要,它基本上会启动 api 调用:

现在,还值得一提的是,API 调用在传递结果后做了什么。这是回调:

好的,现在因为该setData()方法调用notifiyDataSetChanged(),这将为getItemPosition()当前在currentFragments数组中的片段调用 。当然,对于它返回的进度元素,POSITION_NONE因为我想删除这个页面,所以这基本上是destroyItem()PagedSingleDataAdapter. 如果我不旋转屏幕,一切正常,但正如我所说,如果我在显示进度元素并且 API 调用尚未完成时旋转它,destroyItem()则将在活动重新启动后调用回调。

ViewPager也许我还应该说我OutterFragmentViewPager. 我pagerAdapteronActivityCreated()回调中实例化OutterFragment并使用,setRetainInstance(true)这样当屏幕旋转时pagerAdapter保持不变(什么都不应该改变,对吧?),代码在这里:

现在总结一下,问题是:

如果我尝试从ViewPager实例化后的进度元素中删除它并且活动被销毁并重新创建(屏幕方向更改)我得到上述异常(pagerAdapter保持不变,因此其中的所有内容也保持不变,引用等......因为未销毁的OutterFragment主机pagerAdapter仅与活动分离,然后重新连接)。可能它发生在片段管理器上,但我真的不知道是什么。

我已经尝试过的:

  1. 尝试使用另一种技术删除我的进度片段,即在onTaskSuccess()我试图从片段管理器中删除片段的回调中,没有奏效。

  2. 我还尝试隐藏进度元素,而不是从片段管理器中完全删除它。这工作了 50%,因为视图不再存在,但我有一个空页面,所以这不是我真正想要的。

  3. 我还尝试progressFragment在屏幕方向更改后(重新)将其附加到片段管理器,这也不起作用。

  4. 在重新创建活动后,我还尝试将进度片段删除然后再次添加到片段管理器,但没有奏效。

  5. 试图destroyItem()从回调中手动onTaskSuccess()调用(这真的非常难看)但没有奏效。

对不起,这么长的帖子,但我试图尽可能地解释这个问题,以便你们能够理解它。

任何解决方案,建议都非常感谢。

谢谢!

更新:解决方案 确定,所以这需要一段时间。问题是在进度片段上调用了 destroyItem() 回调两次,一次是在屏幕方向改变时,一次是在 api 调用完成后。这就是为什么例外。我找到的解决方案如下:继续跟踪 api 调用是否完成,并在这种情况下销毁进度片段,代码如下。

然后这个 apiCallFinished 在适配器的构造函数中设置为 false,在onTaskSuccess()回调中设置为 true。它真的有效!

0 投票
1 回答
1085 浏览

android - Android EditText 焦点在 ScreenSlidePageAdapter 内的 Fragment 内

[使用支持库]

尝试使用my中EditText的 a 的内部时,其中多个s 一次可见。FragmentScreenSlidePagerAdapterFragment

列表中的第二个Fragment包含一个EditText. 在 Android 4.1 和 4.2 上运行良好。在Android 2.3.6(其他版本不知道)上,点击EditText会弹出屏幕键盘,但不会聚焦EditTextScreenSlidePagerAdapter如果我以一种被认为是“当前”的方式在其中拖动Fragment,那么EditText它将正常运行。

固定布局是不可接受的,因为所有内容都必须动态生成,并且Fragment可见的 s 数量可能会根据不同的标准而有所不同。

关于如何使其正常运行且无需硬编码的任何想法?

0 投票
1 回答
2024 浏览

android - 如何在 FragmentStatePagerAdapter 的片段中动态设置 textview 的文本

我希望在创建(或加载页面)时在 viewPager 中的 FragmentStateAdapter 片段中设置我的 TextView 的 setText。我用 setOnPageChangeListener 进行测试,但它不起作用,所以你知道如何做到这一点。贝娄我的适配器以及我如何尝试使用 setOnPageChangeListener,(如果我可以在创建片段时初始化我的字段,那将非常好)。

测试:

ViewPagerAdapterBis.java

ViewPageAdapterObject.java

0 投票
1 回答
875 浏览

java - 如何在 FragmentStatePagerAdapter 中循环(从最后一个片段到第一个片段)

我编写了这个扩展 FragmentStatePagerAdapter 的类,以便在视图之间滑动。现在我需要使滑动列表循环,以便在最后一个片段之后滑动会显示第一个片段。我还没有找到正确的方法,有什么帮助吗?

这是适配器的代码:

}

0 投票
2 回答
4359 浏览

android - FragmentStatePagerAdapter OutOfMemoryError

我在我正在开发的应用程序中遇到了 OutOfMemoryErrors,我很难弄清楚如何修复它以及究竟是什么问题。我正在使用 FragmentStatePagerAdapter,因为这似乎是最好的/推荐的替代方案。我也在使用Universal Image Loader v.1.8.4。发生的情况是,当您对视图进行分页时,堆会增长并最终耗尽内存。这是一个小示例输出:

首先,是的,我在 stackoverflow 和其他网站上进行了大量研究,试图找出问题所在。我尝试了各种回收位图、使用 unbindDrawables 并尝试在 PagerAdapter 的 destroyItem() 中删除视图/回收位图的解决方案......仅举几例。这些都不适合我(如果需要,我可以提供有关我所做工作的更多详细信息)。

因此,简而言之,我可以使用此示例的修改版本(来自 Google Developers 站点)重现我的问题。我对其进行了一些修改,以便与Universal Image Loader v.1.8.4一起使用,并且还使布局更加复杂,以在某种程度上模仿我正在开发的应用程序中的内容。我更改布局的原因是因为如果您使布局非常简单并且只包含图像和一些文本字段,那么一切似乎都可以正常工作。当布局变得更加复杂并且开始向适配器添加更多页面时,您开始遇到 OOM 错误。但是,我不确定这是布局或 UIL 的问题......请继续阅读......

我已经在 Eclipse 中运行了 MAT,这是唯一的泄漏嫌疑人报告下的内容(只有 1 个问题):

如果您随后查看 Dominator Tree 并展开 ScreenSlidePagerAdapter,它会显示以下 59 个条目中的 25 个:

我不是这个工具的专家,而且我对 Android 和一般开发还很陌生,但看起来适配器的保存状态没有被正确清除,这就是导致 OOM 问题的原因(它正在保存整个视图,而不仅仅是位图)。但是,我无法弄清楚如何清除/释放/销毁/无论保存的状态数据,还是我在其他地方做错了什么。我确实遇到了一篇说尝试使用的帖子.setSaveEnabled(false),但这没有任何区别,我仍然遇到 OOM 错误。我什至尝试为适配器覆盖 saveState() 并返回 null,但这也没有什么不同。

这是相关的代码/配置信息,有望回答大多数问题:

对于 UIL,我只是使用默认配置,因为更改似乎没有什么不同:

屏幕幻灯片活动:

ScreenSlidePageFragment,由上述活动调用:

ScreenSlideActivity 使用的布局 activity_screen_slide.xml 和 ViewPager 的 id:

ScreenSlidePageFragment 使用的 fragment_screen_slide_page.xml:

此外,这是我遇到的 OOM 错误:

为了摆脱 OOM 错误,我可以查看/更改什么?

0 投票
2 回答
24058 浏览

android - 从由 FragmentStatePagerAdapter 填充的 ViewPager 中删除所有片段

我有一个 ViewPager,我正在使用 FragmentStatePagerAdapter 填充片段(表示来自 arrayListOfObjects 的对象)。一切正常:

片段适配器扩展了 FragmentStatePagerAdapter。

从主要活动中,我启动了一个对话主题活动;用户可以添加一个新的收藏位置,创建一个新对象,该对象改变主要活动传递的对象的数组列表。这是启动对话活动的代码;一切正常:

浮动活动将对象添加到 arrayListOfObjects。

在主要活动的 onActivityResult 上,我将收到的 arraListOfObjects 与我发送的进行比较;如果不同,我想完全删除 viewPager 的内容并使用新的 arrayListOfObjects 重新创建它。这是 onActivityResults:

这是 fragmentStateAdapter 代码:

}

问题: 但是在我触发 startActivityFor 结果之前,新的 ArrayListOfObjects 与旧的一起添加。

如何强制 viewPager 忘记旧内容?基本上使用我的 fragmentStateAdapter 用这个 newArrayListofObjects 重置 viewPager 适配器?

0 投票
1 回答
290 浏览

android - Android ViewPager 适配器修改其他页面

我有一个使用 FragmentStatePagerAdapter 的 Viewpager。每个页面都是一个片段。我的页面包含默认可见的线性布局 (llTags)。

如果用户单击页面(片段的主要布局),则线性布局必须不可见(有效),但其他线性布局(其他页面中的 llTags)也需要更改。

如果我单击,则线性布局的可见性会在上一个和下一个之外的所有页面上更改。这是因为不再为下一个/上一个项目调用来自适配器的 getItem。我如何通知这些页面。

ps:我有一个 newInstance 方法和一个公共 void setTagslayoutVisible(boolean) 用于更改适配器的可见性。