Android 动态添加时在ViewPager中获取当前项
我有一个Android 动态添加时在ViewPager中获取当前项,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有一个片段,其中包含文本视图s和一个自定义计时器视图。有一个带有回调方法的接口,用于Fragment来实现接口的方法,以侦听自定义计时器视图更改,然后更新文本视图s 将侦听器接口附加到自定义计时器视图: @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mTimerViewPager = (TimerViewPager) ((Activity) get
片段
,其中包含文本视图
s和一个自定义计时器视图
。有一个带有回调方法的接口,用于Fragment
来实现接口的方法,以侦听自定义计时器视图
更改,然后更新文本视图
s
将侦听器接口附加到自定义计时器视图:
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
mTimerViewPager =
(TimerViewPager) ((Activity) getContext()).findViewById(R.id.view_page_timer);
TimerPagerAdapter timerPagerAdapter = mTimerViewPager.getAdapter();
mListener = (TimerListener) timerPagerAdapter.getFragment(mTimerViewPager.getCurrentItem());
}
在开始时,ViewPager包含一个片段
,回调将正确更新TextView
s。但是,当我再添加一个片段
并返回到第一个片段时,回调将更新第二个片段中的TextView
s。在添加第三个后,第二个不会更新第三个…所以我不会错过“-1”操作
用于在TimerPageAdapter
中添加新片段的函数(FragmentStatePagerAdapter的扩展名
mCount
是页数李>
fragments
是SparseArray
我不知道如何获得合适的当前项目。我也不确定ViewPager
是否是动态添加/删除的好主意(但我还没有找到任何其他替代方法。可能是选项卡?)
我已经提供了我认为必要的代码。如果您需要更多,请在评论中告诉我。在这种情况下,ViewPager应该可以。ViewPager上有一个获取当前项目的方法
int viewPager.getCurrentItem()
这应该行得通 感谢@NguyễnHoáiNam comment I能够在片段和自定义计时器视图之间实现适当的协作。我使用侦听器的动态设置,而不是onAttachedToWindow
:
public void setTimerListener(TimerListener timerListener)
{
mListener = timerListener;
}
谢谢你的回复。是的,我正在使用它(查看上面第一个代码块的最后一行mtimerviewpage.getCurrentItem()
)。在我动态添加新片段之前效果很好。如何更新片段?使用带有回调方法的接口公共类TimerFragment扩展片段实现TimerListener
。方法只使用一个表示自定义视图的参数public void onTimerChange(Timer Timer)
。所以我从自定义计时器视图中获取值,并在片段内部更新TextView,为什么不从包含它的片段内部更新TextView呢?您在哪里使用自定义计时器view@Nguyễ尼南,我不知道你的意思。我试图从片段内部更新TextView
s,自定义计时器视图也在片段内部。但是自定义计时器视图仅覆盖onTouchEvent
方法,并且片段需要侦听更改-因此片段需要是一个侦听器。由于您在其所连接的片段内使用视图,请尝试动态设置侦听器。我不认为在ToWindows中安装侦听器是一种好的做法。此外,尝试实现自定义视图的状态保存以存储您的值。片段将调用其视图以恢复其状态。@NguyễnHoáiNam,谢谢你。我尝试将侦听器的设置移到片段中的函数,而不是将其附加到视图中。这是否有助于从计时器视图更新正确的值?我认为您仍然需要实现视图的状态保存,因此当您的片段重新激活时,如果可以恢复其以前的状态,您的视图状态(最新的计时器值)也将被恢复。@Nguyễ是的,是的。我使用before实现了保存状态,使用BaseSavedState
public void setTimerListener(TimerListener timerListener)
{
mListener = timerListener;
}