【问题标题】:Android - Fragments return to their first state after replacing them via FragmentManagerAndroid - 通过 FragmentManager 替换片段后,片段返回到它们的第一个状态
【发布时间】:2015-08-15 10:30:27
【问题描述】:

我有一个包含 3 个选项卡按钮的活动,每个按钮都会将自己的片段带入屏幕。其中一个片段有一个音乐播放器和图像按钮,当我单击它们时它们会改变它们的图标。 (例如播放按钮将可绘制更改为暂停)

问题是,当我单击此播放图像按钮并更改选项卡并使用音乐播放器返回选项卡时,图像按钮会重置。我认为 fragmentmanager.replace 方法创建了一个新的片段实例。我怎样才能避免这种情况。

这是我的代码 sn-p。

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);

【问题讨论】:

    标签: android android-fragments fragment fragmentmanager


    【解决方案1】:

    我认为问题在于您要替换管理器中的所有时间片段。尝试控制可见片段,并使用以下代码:

    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);
    

    【讨论】:

      【解决方案2】:

      来自Android Developers

      当您删除或替换片段并将事务添加到 返回堆栈,被移除的片段被停止(不被销毁)。 如果用户返回以恢复片段,它会重新启动。如果 您不将事务添加到后台堆栈,那么片段是 移除或更换时销毁。

      所以如果你调用 ft.addToBackStack() 它不应该破坏你的 Fragments。

      登录您的Fragments lifecycle methods 以更好地了解正在发生的事情。

      @Override
      protected void onResume() {
          super.onResume();
          Log.d("onResume", "Fragment X");
      }
      

      对 onPause 做同样的事情,

      【讨论】:

        【解决方案3】:

        而不是这个 -

        ft.replace(R.id.homepage_container, timeline);
        

        使用这个 -

        ft.add(R.id.homepage_container, timeline);
        

        现在下面的片段将是活动的。如果您不想无意中单击下面的片段,请添加到当前片段布局顶部容器-

        android:clickable="true"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-10
          • 1970-01-01
          相关资源
          最近更新 更多