Android-片段通过FragmentManager替换后返回到第一个状态
我有一个活动,有3个选项卡按钮,每个按钮都会将自己的片段带入屏幕。其中一个Fragmnet有一个MusicLayer和imagebuttons,当我点击它们时,它们的图标会改变。(如播放按钮更改,可暂停) 问题是,当我单击“播放图像”按钮并更改选项卡并返回带有MusicLayer的选项卡时,图像按钮会重置。我认为fragmentmanager.replace方法会创建一个新的fragment实例。我怎样才能避免这种情况 这是我的代码片段Android-片段通过FragmentManager替换后返回到第一个状态,android,android-fragments,fragment,fragmentmanager,Android,Android Fragments,Fragment,Fragmentmanager,我有一个活动,有3个选项卡按钮,每个按钮都会将自己的片段带入屏幕。其中一个Fragmnet有一个MusicLayer和imagebuttons,当我点击它们时,它们的图标会改变。(如播放按钮更改,可暂停) 问题是,当我单击“播放图像”按钮并更改选项卡并返回带有MusicLayer的选项卡时,图像按钮会重置。我认为fragmentmanager.replace方法会创建一个新的fragment实例。我怎样才能避免这种情况 这是我的代码片段 public class HomeActivity ext
public class HomeActivity extends SlidingFragmentActivity {
private LocationTracker lt;
private ImageButton imgbTimeline, imgbProfile, imgbMusic;
private Fragment menufragment = new Plik_MenuFragment();
private Fragment timeline = new Plik_TimelineFragment();
private Fragment profile = new Plik_ProfileFragment();
private Fragment musicPlayer = new Plik_MusicPlayerFragment();
private ViewPager viewpager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
// inner slidemenu setting class executing.
setInitials();
// Fragment işleri
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.slidemenu_container, menufragment);
ft.add(R.id.homepage_container, profile);
ft.add(R.id.homepage_container, musicPlayer);
ft.add(R.id.homepage_container, timeline);
ft.commit();
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.imgbTimeline :
ft.replace(R.id.homepage_container, timeline);
ft.addToBackStack(null);
imgbTimeline.setBackgroundColor(Color.BLACK);
imgbProfile.setBackgroundColor(Color.GRAY);
imgbMusic.setBackgroundColor(Color.GRAY);
break;
case R.id.imgbProfile :
ft.replace(R.id.homepage_container, profile);
ft.addToBackStack(null);
imgbTimeline.setBackgroundColor(Color.GRAY);
imgbProfile.setBackgroundColor(Color.BLACK);
imgbMusic.setBackgroundColor(Color.GRAY);
break;
case R.id.imgbMusic :
ft.replace(R.id.homepage_container, musicPlayer);
ft.addToBackStack(null);
imgbTimeline.setBackgroundColor(Color.GRAY);
imgbProfile.setBackgroundColor(Color.GRAY);
imgbMusic.setBackgroundColor(Color.BLACK);
break;
default:
break;
}
ft.commit();
}
};
imgbTimeline.setOnClickListener(ocl);
imgbProfile.setOnClickListener(ocl);
imgbMusic.setOnClickListener(ocl);
我认为问题在于您正在替换管理器中的所有时间片段。尝试控制可见片段,并使用以下代码:
public class HomeActivity extends SlidingFragmentActivity {
private LocationTracker lt;
private ImageButton imgbTimeline, imgbProfile, imgbMusic;
private Fragment menufragment = new Plik_MenuFragment();
private Fragment timeline = new Plik_TimelineFragment();
private Fragment profile = new Plik_ProfileFragment();
private Fragment musicPlayer = new Plik_MusicPlayerFragment();
private ViewPager viewpager;
private Fragment visible;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
// inner slidemenu setting class executing.
setInitials();
// Fragment işleri
// SUPOSE timeline is main fragment:
visible = timeline;
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.slidemenu_container, menufragment);
ft.add(R.id.homepage_container, profile);
ft.add(R.id.homepage_container, musicPlayer);
ft.add(R.id.homepage_container, timeline);
ft.commit();
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.imgbTimeline :
ft.hide(visible);
ft.show(timeline);
ft.addToBackStack(null);
visible = timeline;
imgbTimeline.setBackgroundColor(Color.BLACK);
imgbProfile.setBackgroundColor(Color.GRAY);
imgbMusic.setBackgroundColor(Color.GRAY);
break;
case R.id.imgbProfile :
ft.hide(visible);
ft.show(profile);
ft.addToBackStack(null);
visible = profile;
ft.addToBackStack(null);
imgbTimeline.setBackgroundColor(Color.GRAY);
imgbProfile.setBackgroundColor(Color.BLACK);
imgbMusic.setBackgroundColor(Color.GRAY);
break;
case R.id.imgbMusic :
ft.hide(visible);
ft.show(musicPlayer);
ft.addToBackStack(null);
visible = musicPlayer;
imgbTimeline.setBackgroundColor(Color.GRAY);
imgbProfile.setBackgroundColor(Color.GRAY);
imgbMusic.setBackgroundColor(Color.BLACK);
break;
default:
break;
}
ft.commit();
}
};
imgbTimeline.setOnClickListener(ocl);
imgbProfile.setOnClickListener(ocl);
imgbMusic.setOnClickListener(ocl);
发件人:
删除或替换片段并将事务添加到
在后堆栈中,被移除的片段被停止(而不是销毁)。
如果用户导航回以恢复片段,它将重新启动。如果
如果不将事务添加到后堆栈中,则片段将被删除
当移除或替换时被破坏
因此,如果您调用ft.addToBackStack(),它不应该破坏您的片段
记录您的日志以更好地了解正在发生的事情
@Override
protected void onResume() {
super.onResume();
Log.d("onResume", "Fragment X");
}
对onPause执行相同的操作,而不是-
ft.replace(R.id.homepage_container, timeline);
使用此项—
ft.add(R.id.homepage_container, timeline);
现在下面的片段将是活的。如果您不想无意中单击下面的片段,请添加到当前片段布局顶部容器-
android:clickable="true"