我的activity
中有10个标签。一旦我打开活动,就会显示第一个片段,但会调用下一个片段中存在的方法(AsyncTask)。 如果我转到下一个标签说第3个标签,那么第4个fragment
中出现的方法会被调用,依此类推。
我不明白这种行为。请帮忙!
答案 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
}
}
仅当用户可以看到该特定选项卡时才会调用此选项,因此只有这样才能调用所有加载函数。
答案 3 :(得分:1)
将AsyncTask方法放在此内。
您可以像这样覆盖setMenuVisibility:
@Override
public void setMenuVisibility(final boolean visible) {
if (visible) {
//execute AsyncTask method
}
super.setMenuVisibility(visible);
}
快乐的编码!!