Child Fragment的setUserVisibleHint和onResume未被调用

Pak*_*ung 8 android visibility android-fragments android-viewpager

我试图在用户将页面切换到我的子片段时调用一个函数.但是,当我尝试使用setUserVisibleHint和onResume时,两个函数都是从我的父片段调用的.

在此输入图像描述

首先,我在中设置了一个视图寻呼机 Activity

然后在A1,A3和B1中,我有setUserVisibleHint和onResume函数.

setUserVisibleHint和onResume函数

@Override
public void setUserVisibleHint(boolean visible) {
    super.setUserVisibleHint(visible);
    Log.d("A1", "setUserVisibleHint"); // A3 for Fragment A3 and B1 for Fragment B1 
    if (visible && isResumed())
        onResume();
}
@Override
public void onResume() {
    super.onResume();
    Log.d("A1", "onResume"); // A3 for Fragment A3 and B1 for Fragment B1 
    if (!getUserVisibleHint())
        return;
}
Run Code Online (Sandbox Code Playgroud)

问题:

当我从页面A单击页面B并且视图是片段B1时,我得到(这没关系)

D/A1: setUserVisibleHint
D/B1: setUserVisibleHint
D/B1: onResume
Run Code Online (Sandbox Code Playgroud)

当我从页面B单击页面A并且视图是片段A1时,我得到(这没关系)

D/B1: setUserVisibleHint
D/A1: setUserVisibleHint
D/A1: onResume
Run Code Online (Sandbox Code Playgroud)

当我从页面B单击页面A并且视图是片段A3时,我得到(问题)

D/B1: setUserVisibleHint
D/A1: setUserVisibleHint
D/A1: onResume
Run Code Online (Sandbox Code Playgroud)

我假设打印输出应该如下所示,但我不确定为什么父片段调用的函数.

D/B1: setUserVisibleHint
D/A3: setUserVisibleHint
D/A3: onResume
Run Code Online (Sandbox Code Playgroud)

参考

从片段A1 - > A2,

A2 a2 = new A2();
getFragmentManager().beginTransaction().add(R.id.A1_frameChildFragment, a2)
    .addToBackStack(null)
    .commit();
Run Code Online (Sandbox Code Playgroud)

从片段A2 - > A3,

A3 a3 = new A3();
getFragmentManager().beginTransaction().add(R.id.A2_frameChildFragment, a3)
    .addToBackStack(null)
    .commit();
Run Code Online (Sandbox Code Playgroud)

Pha*_*inh 6

onResume 在中的Tab键之间切换时,不会调用ViewPager
setUserVisibleHint 会叫的时候你之间切换每个标签的父片段ViewPager,并不会叫儿童片段。
这是默认行为,因此我认为我们无法更改。

但是,有一种解决方法。它正在将可见的提示从父片段发送到子片段

// visible hint in parent fragment
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (!isAdded()) {
        return;
    }
    Fragment fragment = getChildFragmentManager().findFragmentById(R.id.A1_frameChildFragment); // find current child fragment
    if (fragment != null) {
        fragment.setUserVisibleHint(isVisibleToUser); // send visible from parent to this child fragment
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 3

setOnPageChangeListener 方法现已弃用,请改用 addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});
Run Code Online (Sandbox Code Playgroud)