Android Fragment.isAdded()在support-v4:23.4.0中的行为与以前的版本不同
当我将support-v4版本从23.1.1升级到23.4.0时,我注意到了这个问题:基本上,isAdded()在返回true时总是返回false 我有一个活动(FragmentActivity),它有一个包含片段的ViewPager。每个片段在启动时在onCreate()中启动一个异步任务以下载一些图像;为了提高效率,在回调中,我检查isAdded(),以确保在继续处理之前附加了片段 如果我包括support-v4库的23.1.1版,我的代码将按预期工作。然而,当我更新到23.4.0时,isAdded()似乎几乎总是返回false,这甚至不允许当前片段完成异步结果的处理 注意:翻阅相册并不重要——对isAdded()的每个调用似乎都返回false 下面的相关代码(注意:本例简化了一些代码):Android Fragment.isAdded()在support-v4:23.4.0中的行为与以前的版本不同,android,android-fragments,android-fragmentactivity,support-v4,Android,Android Fragments,Android Fragmentactivity,Support V4,当我将support-v4版本从23.1.1升级到23.4.0时,我注意到了这个问题:基本上,isAdded()在返回true时总是返回false 我有一个活动(FragmentActivity),它有一个包含片段的ViewPager。每个片段在启动时在onCreate()中启动一个异步任务以下载一些图像;为了提高效率,在回调中,我检查isAdded(),以确保在继续处理之前附加了片段 如果我包括support-v4库的23.1.1版,我的代码将按预期工作。然而,当我更新到23.4.0时,isA
//注意FetchableListener实现onFetchableUpdate()
公共类CameraAlbumItemFragment
实现Fetchable.FetchableListener
{
私有静态最终字符串摄影机\u相册\u项目\u片段\u摄影机\u KEY=“摄影机”;
//成员变量
//
@可调零的私人摄像机;
@可为空的私有ArrayList m_imageDownloads;
公共静态CameraAlbumItemFragment newInstance(@NotNull Camera Camera)
{
final CameraAlbumItemFragment=新的CameraAlbumItemFragment();
fragment.setRetainInstance(真);
最终捆绑=新捆绑(1);
捆绑。可打包(相机、相册、物品、碎片、相机、钥匙);
fragment.setArguments(bundle);
返回片段;
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
m_camera=getArguments().getParcelable(相机、相册、项目、片段、相机、键);
//如果图像尚未下载,则启动后台
//任务来检索它们。不太可能,但请确保我们的相机不是空的
//
如果(m_camera!=null&&m_imageDownloads==null)
{
//这将启动一个异步任务,该任务在收到服务器的响应时调用onFetchableUpdate()
m_camera.updateNonCurrentView(getActivity(),this);
}
}
/**片段的用户界面*/
@凌驾
创建视图时的公共视图(@NotNull LAYOUTING充气机,
@可为空的视图组容器,
@可为空的捆绑包savedInstanceState)
{
最终视图=充气机。充气(R.layout.camera\u album\u项目,容器,错误);
//设置图像(如果已下载)
//
//设置“循环图像”按钮的单击侦听器
//这必须在这里完成,而不是在布局中使用android:onClick属性
//文件,因为这是一个片段,而不是一个活动
//
final ImageView cameraImageView=(ImageView)view.findViewById(R.id.camera\u image\u view);
返回视图;
}
/**
*将图像添加到下载的图像列表中。根据显示或隐藏“循环图像”按钮
*检索到的图像数
*
*@param位图由后台进程检索的图像
*/
public void addImage(@null最终位图,@NotNull最终字符串viewName)
{
断言m_imageDownloads!=null;
m_imageDownloads.add(新的CameraViewImageDownloadResult(位图、视图名));
}
@凌驾
public void onFetchableUpdate(@NotNull-Fetchable-Fetchable,@null-Object-data)
{
//*********************************************************
//注意:这里对isAdded()的调用几乎返回false
//每次在support-v4:23.4.0中,但不是在23.1.1中
//**********************************************************
if(fetchable==m_-camera&&isAdded())
{
最终列表cameraViews=m_camera.getViews();
m_imageDownloads=newarraylist(cameraViews.size());
//下载相机图像
for(CameraView CameraView:cameraViews)
{
if(cameraView.isCurrent())
{
最终字符串imageURL=cameraView.getCameraURL();
if(imageURL!=null)
{
新的GetCameraImageAsyncTask(这个,cameraView.getName()).execute(imageURL);
}
其他的
{
Log.e(Log_标记,“+cameraView.getName()没有有效的图像URL”);
addImage(null,cameraView.getName());
}
}
其他的
{
addImage(null,cameraView.getName());
}
}
//我们不再需要维护观测者引用
m_摄像头。拆卸监视器(此);
}
}
/**
*获取用于显示摄影机视图的图像视图
*
*@返回相机图像视图
*/
@可空
private ImageView getCameraImageView()
{
最终视图v=getView();
如果(v!=null)
{
返回(图像视图)v.findViewById(R.id.camera\u image\u view);
}
其他的
{
返回null;
}
}
}
以及它的活动(FragmentActivity),其中包含一个ViewPager
public class CameraAlbumActivity
extends FragmentActivity
{
// Intent Data Key
//
public final static String CAMERA_ALBUM_SELECTED_ID_KEY = "selectedId" ;
private static final String LOG_TAG = "CameraAlbumActivity" ;
@Override
protected void onCreate ( @Nullable Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
final Intent intent = getIntent();
final Object sharedData = SharedDataWrapper.getInstance().getData();
CameraCollection cameraCollection ;
if ( sharedData != null && sharedData instanceof CameraCollection )
{
cameraCollection = ( CameraCollection ) sharedData;
}
else
{
// just create an empty collection
cameraCollection = new CameraCollection() ;
}
// Load view
setContentView( R.layout.album );
// Get references to buttons
//
m_previousButton = (ImageView)findViewById( R.id.album_previous_btn );
m_nextButton = (ImageView)findViewById( R.id.album_next_btn );
// Configure view pager
//
m_viewPager = (ViewPager)findViewById( R.id.album_view_pager );
final CameraAlbumPagerAdapter adapter = new CameraAlbumPagerAdapter( getSupportFragmentManager(), cameraCollection );
m_viewPager.setAdapter( adapter );
m_viewPager.addOnPageChangeListener( new OnCyclingContentAlbumViewScrollListener( this, adapter ) );
// Set the selected item
int selectedId = intent.getIntExtra( CAMERA_ALBUM_SELECTED_ID_KEY, -1 );
if( selectedId == -1 )
{
return;
}
List<Camera> models = cameraCollection.getAllModels();
for ( int i = 0 ; i < models.size() ; i++ )
{
Camera camera = models.get( i );
if ( selectedId == camera.getId() )
{
m_viewPager.setCurrentItem( i, false );
break;
}
}
}
/**
* OnPageChangeListeners should be removed to prevent memory leaks
*/
@Override
public void onDestroy()
{
m_viewPager.clearOnPageChangeListeners() ;
super.onDestroy() ;
}
/**
* Scroll one item to the right, if possible
*
* @param v the view triggering the event
*/
public void scrollToNext ( @SuppressWarnings("UnusedParameters") View v )
{
int currentIndex = m_viewPager.getCurrentItem();
if( currentIndex < m_viewPager.getAdapter().getCount() - 1 )
{
m_viewPager.setCurrentItem( currentIndex + 1, true );
}
}
/**
* Scroll one item to the left, if possible
*
* @param v the view triggering the event
*/
public void scrollToPrevious ( @SuppressWarnings("UnusedParameters") View v )
{
int currentIndex = m_viewPager.getCurrentItem();
if( currentIndex > 0 )
{
m_viewPager.setCurrentItem( currentIndex - 1, true );
}
}
/**
* Set the visibility of the previous and next buttons based on view pager contents and position
*/
public void setPreviousAndNextButtonVisibility ()
{
final int position = m_viewPager.getCurrentItem();
m_previousButton.setVisibility( position == 0 ? View.INVISIBLE : View.VISIBLE );
m_nextButton.setVisibility( position < m_viewPager.getAdapter().getCount() - 1 ? View.VISIBLE : View.INVISIBLE );
}
/**
* @return The item fragment which is currently displayed
*/
@Nullable
public Fragment getCurrentItemFragment ()
{
int currentItem = m_viewPager.getCurrentItem();
ModelCollectionAlbumPagerAdapter adapter = (ModelCollectionAlbumPagerAdapter)m_viewPager.getAdapter();
return adapter.getRegisteredFragment( currentItem );
}
}
公共类活动
扩展碎片活动
{
//意向数据键
//
公共最终静态字符串照相机\u相册\u选定\u ID\u KEY=“selectedId”;
私有静态最终字符串日志\u TAG=“CameraAlbumActivity”;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
最终意图=getIntent();
最终对象sharedData=SharedDataWrapper.getInstance().getData();
CameraCollection CameraCollection;
如果(sharedData!=null
public class CameraAlbumActivity
extends FragmentActivity
{
// Intent Data Key
//
public final static String CAMERA_ALBUM_SELECTED_ID_KEY = "selectedId" ;
private static final String LOG_TAG = "CameraAlbumActivity" ;
@Override
protected void onCreate ( @Nullable Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
final Intent intent = getIntent();
final Object sharedData = SharedDataWrapper.getInstance().getData();
CameraCollection cameraCollection ;
if ( sharedData != null && sharedData instanceof CameraCollection )
{
cameraCollection = ( CameraCollection ) sharedData;
}
else
{
// just create an empty collection
cameraCollection = new CameraCollection() ;
}
// Load view
setContentView( R.layout.album );
// Get references to buttons
//
m_previousButton = (ImageView)findViewById( R.id.album_previous_btn );
m_nextButton = (ImageView)findViewById( R.id.album_next_btn );
// Configure view pager
//
m_viewPager = (ViewPager)findViewById( R.id.album_view_pager );
final CameraAlbumPagerAdapter adapter = new CameraAlbumPagerAdapter( getSupportFragmentManager(), cameraCollection );
m_viewPager.setAdapter( adapter );
m_viewPager.addOnPageChangeListener( new OnCyclingContentAlbumViewScrollListener( this, adapter ) );
// Set the selected item
int selectedId = intent.getIntExtra( CAMERA_ALBUM_SELECTED_ID_KEY, -1 );
if( selectedId == -1 )
{
return;
}
List<Camera> models = cameraCollection.getAllModels();
for ( int i = 0 ; i < models.size() ; i++ )
{
Camera camera = models.get( i );
if ( selectedId == camera.getId() )
{
m_viewPager.setCurrentItem( i, false );
break;
}
}
}
/**
* OnPageChangeListeners should be removed to prevent memory leaks
*/
@Override
public void onDestroy()
{
m_viewPager.clearOnPageChangeListeners() ;
super.onDestroy() ;
}
/**
* Scroll one item to the right, if possible
*
* @param v the view triggering the event
*/
public void scrollToNext ( @SuppressWarnings("UnusedParameters") View v )
{
int currentIndex = m_viewPager.getCurrentItem();
if( currentIndex < m_viewPager.getAdapter().getCount() - 1 )
{
m_viewPager.setCurrentItem( currentIndex + 1, true );
}
}
/**
* Scroll one item to the left, if possible
*
* @param v the view triggering the event
*/
public void scrollToPrevious ( @SuppressWarnings("UnusedParameters") View v )
{
int currentIndex = m_viewPager.getCurrentItem();
if( currentIndex > 0 )
{
m_viewPager.setCurrentItem( currentIndex - 1, true );
}
}
/**
* Set the visibility of the previous and next buttons based on view pager contents and position
*/
public void setPreviousAndNextButtonVisibility ()
{
final int position = m_viewPager.getCurrentItem();
m_previousButton.setVisibility( position == 0 ? View.INVISIBLE : View.VISIBLE );
m_nextButton.setVisibility( position < m_viewPager.getAdapter().getCount() - 1 ? View.VISIBLE : View.INVISIBLE );
}
/**
* @return The item fragment which is currently displayed
*/
@Nullable
public Fragment getCurrentItemFragment ()
{
int currentItem = m_viewPager.getCurrentItem();
ModelCollectionAlbumPagerAdapter adapter = (ModelCollectionAlbumPagerAdapter)m_viewPager.getAdapter();
return adapter.getRegisteredFragment( currentItem );
}
}
getSupportFragmentManager().executePendingTransactions();