在片段第一次可见后立即执行代码

Mik*_*e76 11 lifecycle android fragment

我有一个片段,显示了使用MPAndroidChart创建的折线图.加载片段大约需要200毫秒.

我想通过在片段变得可见之后加载图表数据数据来提高感知的应用程序性能.

因此,我需要在片段变得可见之后立即执行代码,但只有第一次它变得可见.

我不能使用onResume(),因为它在片段可见之前被调用.

注意:我不能使用异步任务,需要在UI线程上完成.无论如何它都没有意义,因为这是一次初始化,只需要大约200毫秒.

Var*_*wal 7

public class MyFragment extends Fragment{
  Boolean _areLecturesLoaded =false;
  @Override
  onCreateView(){
    //Inflate the required views. Code gets executed once View is made but not shown
    return v;
}
@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //Code executes EVERY TIME user views the fragment

        if (isVisibleToUser && !_areLecturesLoaded ) {
            _areLecturesLoaded = true;
            // Code executes ONLY THE FIRST TIME fragment is viewed.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

isVisisbleToUser是内置的,当用户查看当前片段时它是真的.在用户第一次看到片段之前,它将保持为假.如果您希望每次用户查看片段时都执行一些代码,请将代码放在此区域中但在if语句之外.

_areLecturesLoaded初始化为false,并且第一次将片段设置为true,将其设置为true,确保将来不会调用If语句,并且仅在ONCE中执行代码

所有初始化视图窗口小部件按钮等必须在onCreate()中完成,以确保没有空指针和其他此类讨厌异常的可能性.


Bor*_*rja 0

将其放入 onViewCreated() 方法中。

  • 似乎是错误的事情。它甚至在 onResume() 之前被调用。->......“在 onCreateView(LayoutInflater, ViewGroup, Bundle) 返回后、但在任何保存的状态恢复到视图之前立即调用。但是,片段的视图层次结构此时并未附加到其父级”。 (2认同)