2016-03-29 17 views
0

Я знаю, что этот вопрос задан, но ответа мне не удалось.фрагмент, созданный дважды при изменении ориентации

У меня есть фрагмент с видом ресайклера в нем. У меня есть кнопка, которая может отображать и скрывать этот фрагмент. Все это работает нормально до тех пор, пока изменение экрана не изменится. Затем фрагмент воссоздается, а один сверху показан и скрыт, но есть тот, за которым он остается.

Я понимаю, что нужно использовать

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

Спасибо большое, ребята !!!!!!!

ответ

1

я предлагаю внести некоторые изменения в свой код Я полагаю, что 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"); 
    } 
} 
+0

Большое спасибо. Это работает. Есть ли что-то не так с ответом ниже, чтобы просто заменить add на замену? – RJB

+0

Я не думаю, что использование замещения работает. Я не уверен, но если вы спрячете фрагмент, тогда поверните экран, я думаю, что фрагмент появится без нажатия кнопки – Sam

+0

. Вы совершенно правы. Спасибо!!! – RJB

1

Вместо этого:

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

попробовать это:

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

Название вводит в заблуждение. Replace фактически работает как добавление тоже, если в первый раз. Что происходит, что когда ваша деятельность вращается, onCreate() вызывается снова, так что вы добавляете один и тот же фрагмент поверх существующего

+0

Большое спасибо. – RJB

+0

Спасибо, это спас меня день! – Mathew

Смежные вопросы