片段对用户可见时调用方法

时间:2014-07-31 19:57:10

标签: java android android-fragments

我需要在片段可见时(对用户)执行一个方法。

实施例: 我有2个按钮(按钮1和按钮2), 2个片段(片段1和片段2) 和类片段2中的方法loadImages()

当我按下“button2”时,我想用片段2替换片段1 然后在片段2可见(给用户)之后调用loadImages()

我尝试在片段类中使用onResume(),但它在片段可见之前调用该方法,并且会使转换延迟。

我也试过了setUserVisibleHint()但没有用。

一个很好的例子是Instagram应用程序。当您单击配置文件时,它首先加载配置文件活动,然后导入所有图像。

我希望有人可以帮助我。我非常感谢你的帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

使用ViewTreeObserver回调:

@Override
public void onViewCreated(View v, Bundle savedInstanceState) {
    super.onViewCreated(v, savedInstanceState);
    final View view = v;

    // Add a callback to be invoked when the view is drawn
    view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
        @Override
        public void onDraw() {
            // Immediately detach the listener so it only is called once
            view.getViewTreeObserver().removeOnDrawListener(this);

            // You're visible! Do your stuff.
            loadImages();
        }
    });
}

答案 1 :(得分:0)

使用onActivityCreated()callBack

答案 2 :(得分:-1)

我对你要做的事感到有点困惑。听起来这些图像加载速度太快了......那么这是否意味着您已准备好显示图像?那是件坏事吗?

我的猜测(这只是一个猜测)是Instagram没有内存中的个人资料图片,所以他们必须进行API调用来检索它们,这就是为什么它们会出现延迟。如果您的情况相同,请考虑在片段的AsyncTask方法中启动onResume。在后台执行您需要为图像做的任何加载,然后使图像出现在主线程上的onPostExecute回调中。如果图像尚未加载,请确保仅启动任务。

但是,如果您已经将图像加载到内存中,并且只是希望在用户看到它们之前出现延迟,那么您可以在postDelayed上执行Handler方法。像这样:

new Handler().postDelayed(new Runnable() {          
    @Override
    public void run() {
        loadImages();   
    }
}, 1000);

修改

正如kcoppock指出的那样,处理程序代码非常糟糕。我的意思是它是一个快速的例子,但它是错误的我不应该首先包含它。更完整的答案是:

private Handler handler;

public void onResume(){
    super.onResume();
    if(handler == null){
        handler = new Handler();
        handler.postDelayed(new Runnable() {            
            @Override
            public void run() {
                loadImages();   
            }
        }, 1000);
    }
}

public void onDestroyView(){
    super.onDestroyView();
    handler.removeCallbacksAndMessages(null);
    handler = null;
}