我的一个片段有一个listview,可以在片段生命周期开始时从我的服务中获取适配器。在正常的生命周期中,它没有问题,但是当我旋转设备时,即使在活动重新创建之前,也会重新显示正在显示的片段,因此我的活动上的服务实例尚未就绪,它仅在onServiceConnected()之后就绪。即使我尝试恢复并在fragment.onResume()中设置此适配器,也无法保证服务已经绑定。 在我的代码中,我处理在方向更改后添加片段(在onServiceConnected()之后),但片段生命周期不遵守此顺序。 为什么在活动之前重新创建片段?
我该怎么办?
的活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
actionBar = getSupportActionBar();
drawerlayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerlayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.END);
Intent it = new Intent(this, MyService.class);
if (!MyService.RUNNING) {
startService(it);
}
bindService(it, this, 0);
}
@Override
public void onServiceConnected(ComponentName name, IBinder binderservice) {
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
"Activity onServiceConnected");
LocalBinder binder = (LocalBinder) binderservice;
this.service = binder.getService();
//load a fragment with a radio player
carregaRadio();
if (!service.isIRCConnected()) {
// load a fragment to login on a chat
carregaLogin();
} else {
// load fragments according to the chat
// variables on the service when service was already
// running before activity creation.
carregaChatdoService();
}
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
}
答案 0 :(得分:0)
即使活动被销毁,也会保留或保存片段实例。这就是我通过在我的活动OnGlobalLayoutListener
中添加onCreate
来解决类似问题的方法。您的问题可能会有所不同,因此您可以在onGlobalLayout
中绑定服务,并且在调用onServiceConnected
时,您的片段应该可以使用了。
viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Log.d("Activity", "onGlobalLayout");
if ( musicService != null)
tabPagerAdapter.getPlaylistFragment().loadPlaylist(musicService.getPlaylist());
viewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
} );