在第一个片段(tab)的onCreateView被调用

时间:2017-11-01 11:34:36

标签: android android-fragments android-tabs fragmentpageradapter

我的activity中有10个标签。一旦我打开活动,就会显示第一个片段,但会调用下一个片段中存在的方法(AsyncTask)。 如果我转到下一个标签说第3个标签,那么第4个fragment中出现的方法会被调用,依此类推。

我不明白这种行为。请帮忙!

4 个答案:

答案 0 :(得分:2)

您必须知道viewPager如何在不同位置填充fragment

当您从位置0开始时,则会创建位置0上的fragment和位置1中的fragment

然后当您滑动到位置1时,创建了2位置上的fragments,因此您现在在不同位置创建了三个viewPager(0,1,2 ... fragment上只有3页。

我们滑动到位置2,最后一个位置,第一个位置(0)上的fragments被破坏,所以我们现在在位置2和3上有Fragment

mViewPager.setOffscreenPageLimit(2); // 2 is just an example LifeCycle的工作方式

您可以设置Fragment来限制它

如果您希望在setUserVisibleHint变为可见的情况下执行某些代码,请在class PdfForm { /* * Path to raw PDF form * @var string */ private $pdfurl; /* * Form data * @var array */ private $data; /* * Path to filled PDF form * @var string */ private $output; /* * Flag for flattening the file * @var string */ private $flatten; /** * Class Conctructor * * @param string $pdfurl * @param array $data */ public function __construct( $pdfurl, $data ) { $this->pdfurl = $pdfurl; $this->data = $data; } /** * Generate a filled PDF file * */ private function generate() { $fdf = $this->makeFdf( $this->data ); $this->output = $this->tmpfile(); exec( "pdftk {$this->pdfurl} fill_form {$fdf} output {$this->output}{$this->flatten}" ); unlink( $fdf ); } 方法中添加部分代码

答案 1 :(得分:2)

Override below method and move your code for Aync task into this instead of onStart() or onCreateView.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Load your data here or do network operations here
        isFragmentLoaded = true;
    }
}

答案 2 :(得分:1)

默认情况下为viewpager.setOffscreenPageLimit(1),这意味着默认情况下,View寻呼机将在当前选项卡的右侧和右侧选项卡上加载至少1个。

这样做,主要是因为滑动viewpager时有一点,当两个标签的某个区域可见时。对于那些平滑过渡,需要预加载。

无法将其设为viewpager.setOffscreenPageLimit(0).

唯一的出路是使用此方法setUserVisibleHint 将此添加到您的片段

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // load data here
    }else{
       // fragment is no longer visible
    }
}

仅当用户可以看到该特定选项卡时才会调用此选项,因此只有这样才能调用所有加载函数。

检查sample example

答案 3 :(得分:1)

将AsyncTask方法放在此内。

您可以像这样覆盖setMenuVisibility:

@Override
public void setMenuVisibility(final boolean visible) {
   if (visible) {
      //execute AsyncTask method
   }

   super.setMenuVisibility(visible);
}

快乐的编码!!