如何知道一个Fragment是否已经调用了onCreateView()方法?

11
我们都知道,当使用带有Fragment和FragmentPagerAdapter的ViewPager时,我们会加载3个Fragment:可见的一个以及其两侧的Fragment。
因此,如果我有7个Fragment,并且正在迭代它们以查看哪3个是已经加载的(我指的是已经调用了onCreateView()),那么我该如何确定呢?
编辑:Fragment不必是ViewPager正在显示的那个,只需onCreateView()已被调用即可。
4个回答

24

如果已经调用了onCreateView方法,那么从逻辑上讲,这将是一个合理的测试:

myFragment.getView() != null;

假设您拥有对分页器中所有片段的引用,请迭代它们并检查它们是否具有视图。

http://developer.android.com/reference/android/app/Fragment.html#getView()

更新

上面的答案假设你的片段总是创建一个视图,而不是没有视图的片段。如果是这样,我建议像这样子类化片段:

public abstract class SubFragment extends Fragment
{
    protected boolean onCreateViewCalled = false;

    public boolean hasOnCreateViewBeenCalled()
    {
        return onCreateViewCalled;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup Container, Bundle state){
        onCreateViewCalled = true;
        return null;
    }
}

请注意,进一步的子类如果覆盖onCreateView方法也必须调用super或者自行设置标志位。


1
这不是确定性的,因为 onCreateView 可能会返回 null。 - interlude
@interlude - 真实故事。片段不一定要有视图。 - dell116

3
我给Fragment添加了一个界面。看起来像这样:

protected OnCreateViewCallback createViewCallback = null;

public void setCreateViewCallback(OnCreateViewCallback createViewCallback) {
    this.createViewCallback = createViewCallback;
}

public interface OnCreateViewCallback {

    void onCreateView();

}

在我的onCreateView()方法中:

    //initialize your view.
    if (createViewCallback != null) {
        createViewCallback.onCreateView();
        createViewCallback = null;
    }
    return mainView;

来自我的活动:

        if (ocrFragment.getView() == null) {
            ocrFragment.setCreateViewCallback(new MainScreenFragment.OnCreateViewCallback() {
                @Override
                public void onCreateView() {
                    ocrFragment.ocrImage(picture, false);
                }
            });
        } else {
            ocrFragment.ocrImage(picture, false);
        }

0
如果您想在onCreateView被调用后执行某些操作,请使用onViewCreated:

在onCreateView(LayoutInflater,ViewGroup,Bundle)返回之后立即调用,但在任何保存的状态被恢复到视图之前。这给了子类一个机会,在完全创建其视图层次结构后初始化自己。然而,在此时,片段的视图层次结构尚未附加到其父级。

public void onViewCreated(View view, Bundle savedInstanceState) {
       MyActivity myActivity = (MyActivity) getActivity();
       MyActivity.newAsyncTask(mPar);
}

-3

你也可以检查Fragment.isVisible(),因为当一个Fragment在ViewPager的屏幕外页面限制范围内时,它处于可见状态。

编辑:但这真的取决于你想通过你的问题实现什么。也许是在Fragments中所有UI准备好后进行某种更新?

编辑:

另外,你可以监听onViewCreated()并设置一个标志。或者通知你的Activity并进行进一步的工作(getActivity()此时将返回你的Activity)。但是,真正重要的是明确你想通过你的问题实现什么。


如果片段的视图被隐藏,则此方法将返回false。 - interlude
是的,你说得对,这种方法很烂。^^ 如果提问者能说明他为什么需要关于onCreateView()的信息,回答问题会更容易些。他当然可以倾听onViewCreated()并设置一个标志,但我不知道这是否符合他的需求。 - einschnaehkeee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接