片段在方向改变时创建了两次

fragment created twice on orientation change

我知道有人问过这个问题,但我没有成功回答。

我有一个带有回收站视图的片段。我有一个按钮可以显示和隐藏这个片段。在更改屏幕方向之前,这一切都可以正常工作。然后片段被重新创建,上面的那个被显示和隐藏,但后面有一个留在那儿。

我知道我需要使用

if (savedInstanceState == null) 

在某处,却无法在何处成功。非常感谢, 这是我的代码。

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    recyclerViewFragment = new RecyclerViewFragment();

    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
    trans.add(R.id.recycle_view_container, recyclerViewFragment, RECYCLER_FRAGMENT);
    trans.commit();
    trans.show(recyclerViewFragment);

    Button showHideButton = (Button)findViewById(R.id.button_show_hide);
    showHideButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showHideFragment(recyclerViewFragment);
        }
    });
    showHideButton.playSoundEffect(SoundEffectConstants.CLICK);

}

public void showHideFragment(final Fragment fragment){

    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
    trans.setCustomAnimations(android.R.anim.slide_in_left , android.R.anim.slide_out_right);

    if (fragment.isHidden()) {
        trans.show(fragment);
        Log.d("hidden","Show");
    } else {
        trans.hide(fragment);
        Log.d("Shown","Hide");
    }

    trans.commit();
}

非常感谢你们!!!!!!

而不是这个:

trans.add(R.id.recycle_view_container, recyclerViewFragment, RECYCLER_FRAGMENT);

试试这个:

trans.replace(R.id.recycle_view_container, recyclerViewFragment, RECYCLER_FRAGMENT);

名称具有误导性。 Replace 实际上也可以作为添加,如果是第一次的话。发生的事情是,当您的 activity 旋转时,onCreate() 会再次被调用,因此您将在现有片段

之上添加相同的片段

我建议对您的代码进行一些更改 我想 RECYCLER_FRAGMENT 是一个常量,其中包含用于标记您的片段的标签

 RecyclerViewFragment recyclerViewFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    if(savedInstanceState == null) {
        recyclerViewFragment = new RecyclerViewFragment();

        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.add(R.id.recycle_view_container, recyclerViewFragment, RECYCLER_FRAGMENT);
        trans.commit();
    }else{
        recyclerViewFragment = getSupportFragmentManager().findFragmentByTag(RECYCLER_FRAGMENT);
        if(savedInstanceState.getString("vi").equals("hid")){
            getSupportFragmentManager().beginTransaction().hide(recyclerViewFragment).commit();
        }
    }

    Button showHideButton = (Button)findViewById(R.id.button_show_hide);
    showHideButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager manager = getSupportFragmentManager();

            if (fragment.isVisible()) {
                manager.beginTransaction().hide(recyclerViewFragment).commit();
            } else {
                manager.beginTransaction().show(recyclerViewFragment).commit();
            }
        }
    });


}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if(recyclerViewFragment.isVisible() == true){
        outState.putString("vi","vis");
    }else{
        outState.putString("vi", "hid");
    }
}