Android 查看寻呼机和片段生命周期
我有一个一次加载三页的ViewPager。如果我从第1页滑动到第2页,然后滑动到第3页,第一页(片段)将转到Android 查看寻呼机和片段生命周期,android,android-fragments,android-viewpager,android-lifecycle,Android,Android Fragments,Android Viewpager,Android Lifecycle,我有一个一次加载三页的ViewPager。如果我从第1页滑动到第2页,然后滑动到第3页,第一页(片段)将转到onPause()。然后,如果我滑动到第二页,第一页将进入onResume(),即使用户仍然看不到第1页。所以,我的问题是:如何区分代码中的第一页和第二页?例如,当片段可见时,如果我必须运行一段代码,那么该如何操作?用户方法pager.setOffscreenPageLimit(numbr)设置希望在堆栈中保留多少片段 FragmentPagerAdapter将显示的片段之外的其他片段保持
onPause()
。然后,如果我滑动到第二页,第一页将进入onResume()
,即使用户仍然看不到第1页。所以,我的问题是:如何区分代码中的第一页和第二页?例如,当片段可见时,如果我必须运行一段代码,那么该如何操作?用户方法pager.setOffscreenPageLimit(numbr)设置希望在堆栈中保留多少片段 FragmentPagerAdapter将显示的片段之外的其他片段保持在恢复状态。解决方案是实现一个自定义OnPageChangeListener,并在显示片段时创建一个新方法
1) 创建LifecycleManager接口该接口将有两个方法,每个ViewPager的片段将实现它。这些方法如下:
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
}
2) 让每个片段为每个类声明实现接口Add iplements语句:
public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
3) 在每个片段中实现接口方法为了检查它是否真的按预期工作,我将只记录方法调用并显示Toast:
@Override
public void onPauseFragment() {
Log.i(TAG, "onPauseFragment()");
Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
4) 调用ViewPager页面更改上的接口方法您可以在ViewPager上设置OnPageChangeListener,并在每次ViewPager显示其他页面时获得回调:
pager.setOnPageChangeListener(pageChangeListener);
5) 实现OnPageChangeListener以调用自定义生命周期方法
侦听器知道新位置,可以在PagerAdapter的帮助下调用新片段上的接口方法。我可以在这里为新片段调用onResumeFragment(),为当前片段调用onPauseFragment()
我还需要存储当前片段的位置(最初,当前位置等于0),因为我不知道用户是从左向右滚动还是从右向左滚动。看看我在代码中的意思:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
我没有写代码。完整教程:如果您的片段扩展了android.support.v4.app.Fragment 你可以用这个,它对我有用
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isVisibleToUser) {
//do sth..
}
}
重写
setUserVisibleHint()
。一旦片段对用户可见,此方法将调用。覆盖setUserVisibleHint()当片段对用户可见时,此方法将调用解决您的问题:
public class FragmentVisibleHelper implements LifecycleObserver {
private static final String TAG = "VipVisibleHelper";
public interface IVisibleListener {
void onVisible();
void onInVisible();
}
boolean mIsVisibleToUser;
boolean mStarted = false;
volatile boolean mIsCalledVisible = false;
volatile boolean mIsCalledInvisible = false;
IVisibleListener mListener;
public void setListener(IVisibleListener mListener) {
this.mListener = mListener;
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume() {
Log.d(TAG, String.format("%-60s %s", this.toString(), "onResume() called:"));
if (mIsVisibleToUser) {
dispatchVisible();
}
}
private void dispatchVisible() {
Log.d(TAG, String.format("%-60s %s", this.toString(), "dispatchVisible() called mIsCalledVisible = [" + mIsCalledVisible + "] mIsCalledInvisible = [" + mIsCalledInvisible + "] "));
if (!mIsCalledVisible) {
mIsCalledVisible = true;
mIsCalledInvisible = false;
if (Profile.LOG) {
Log.d(TAG, String.format("%-60s %s", this.toString(), "dispatchVisible() called onVisible"));
}
if (mListener != null) {
mListener.onVisible();
}
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause() {
Log.d(TAG, String.format("%-60s %s", this.toString(), "onPause() called:"));
if (mIsVisibleToUser) {
dispatchInvisible();
}
}
private void dispatchInvisible() {
Log.d(TAG, String.format("%-60s %s", this.toString(), "dispatchInvisible() called mIsCalledVisible = [" + mIsCalledVisible + "] mIsCalledInvisible = [" + mIsCalledInvisible + "] "));
if (!mIsCalledInvisible) {
mIsCalledInvisible = true;
mIsCalledVisible = false;
if (Profile.LOG) {
Log.d(TAG, String.format("%-60s %s", this.toString(), "dispatchInvisible() called onInVisible"));
}
if (mListener != null) {
mListener.onInVisible();
}
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onStart() {
Log.d(TAG, String.format("%-60s %s", this.toString(), "onStart() called"));
mStarted = true;
if (mIsVisibleToUser) {
dispatchVisible();
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onStop() {
Log.d(TAG, String.format("%-60s %s", this.toString(), "onStop() called"));
if (mIsVisibleToUser) {
dispatchInvisible();
}
mStarted = false;
}
public void setUserVisibleHint(boolean isVisibleToUser) {
Log.d(TAG, String.format("%-60s %s", this.toString(), "setUserVisibleHint() called with: isVisibleToUser = [" + isVisibleToUser + "]:"));
mIsVisibleToUser = isVisibleToUser;
if (mStarted) { // fragment have created
if (mIsVisibleToUser) {
dispatchVisible();
} else {
dispatchInvisible();
}
}
}
public boolean isVisibleToUser() {
return mIsVisibleToUser;
}
}
在片段之间滑动时,不会调用片段的生命周期方法。您可以使用
ViewPager.SimpleOnPageChangeListener
来解决此问题。示例代码如下(以Kotlin为单位)
检查我的答案这里完美的答案…谢谢它的工作。默认值是1。这意味着上一个片段和下一个片段保持在空闲状态。视图寻呼机每次至少加载3个页面。我的问题是,当其中一个页面可见时,如何获取回调。onResumeFragment中的getActivity()可能返回Null(至少在我的情况下)。解决方案可能是通过接口传递上下文(或活动)。例如,在我的案例“getItem();”中,public void onResumeFragment(Activity-Activity)返回的片段没有视图。我用“实例化元素”解决了这个问题,int)不工作。大多数适配器getItem(pos)返回片段的新实例,但我们需要将缓存添加到片段管理器片段中。因此,您将对新创建的未附加到活动实例的对象调用
.onPauseFragment()
。不要复制粘贴未测试的代码。为什么acceptedgetActivity返回null是因为@Villigicer告诉大多数适配器的getItem(pos)返回新实例…如果缓存的不是onPageSelected(currentPosition)返回的片段将不是可见的相同片段。它将是一个全新的片段,onCreateView尚未在其上被调用,并且在您返回到该位置之前不会被调用。如果要使用不再可见的片段,请缓存它,但确保在不再需要它时将其置零。首次创建片段时,在此方法中,getActivity()
或getContext()
将返回null。我个人更喜欢onPageSelected()
方法more.setUserVisibleHint现在不推荐使用。当第一次创建片段时也会调用它。但是如果你在一个viewpager中有多个片段,那么这个方法会有用,你只需要测试(getUserVisibleHint)是否(getUserVisibleHint),因为这个函数返回它是否可见。确保在超级方法后调用它。如何使用。。。。这门课叫什么名字?
// other code
mViewPager.addOnPageChangeListener(object: ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) {
val oldPosition = mViewPager.currentItem
val oldFragment = mViewPager.adapter?.instantiateItem(mViewPager, oldPosition)
oldFragment.onPauseStuff() // Hint: do as here call onPause
val newFragment = mViewPager.adapter?.instantiateItem(mViewPager, position)
newFragment.onResumeStuff() // Hint: do as here call onResume
}
// other code