2015-06-06 5 views
2

У меня есть деятельность, MainActivity, которая обменивается между семью фрагментами. Фрагменты не имеют определенного порядка, поэтому, когда приложение запускается и деятельность первых создан, я установить один по умолчанию/стартовый экран:Перемещение между видами деятельности и освежающими видами

FragmentManager fm = getSupportFragmentManager(); 
Fragment fragment = fm.findFragmentById(R.id.fragmentDrawerContainer); 

if (fragment == null) 
{ 
    fm.beginTransaction() 
      .add(R.id.fragmentDrawerContainer, new DefaultFragment()) 
      .commit(); 

    // An int I use to track which Fragment is currently being viewed, 
    // for navigation drawer purposes 
    mCurrentPosition = DEFAULT_FRAGMENT_POSITION; 
} 

панели навигации, пользователь может перейти на новый активность, SettingsActivity, в которой размещается PreferenceFragment для изменения определенных параметров, таких как единицы измерения (метрические или имперские) и цветовые темы.

// Standard navigation from one activity to another from inside selectItem() method of nav drawer 
Intent intent = new Intent(this, SettingsActivity.class); 
startActivity(intent); 

После того, как пользователь переходит обратно в MainActivity из SettingsActivity, либо сзади или кнопки вверх, мне нужно две вещи случаются:

1) фрагмент пользователь смотрел на последний еще должен быть там. В настоящее время активность перезаряжается DefaultFragment (потому что, как я думаю, активность воссоздана).

2) Каждый фрагмент содержит настраиваемый вид я написал, а представление должно обновляться, используя значения из SharedPreferences после возвращения пользователя из SettingsActivity.

Чтобы решить # 1, я попытался использовать android:launchMode="singleTop", который работает, но я не могу получить представление для обновления, если не переключусь на другой фрагмент, а затем вернусь.

Я пытался позвонить myView.invalidate() в методе фрагментов onResume(), но он не работает.

Любые идеи? Пожалуйста, дайте мне знать, если я не понял. Заранее спасибо!

+0

использовать backstack, чтобы увидеть, кто в настоящее время отображается несколько сообщений [0] (http://stackoverflow.com/questions/30416815/can-i-put-a-fragment-on-backstack-which-hasnt-been-initialized -yet/30417083 # 30417083), [1] (http://stackoverflow.com/questions/30686186/android-show-back-button-depending-on-backstack-count/30686674#30686674), [2] (http : //stackoverflow.com/questions/30493716/is-there-a-way-to-listen-to-fragmenttransactions-of-a-fragmentmanager/30493931#30493931) .. некоторые из них косвенны. я думаю, вы вызываете его на неправильном фрагменте – Elltz

ответ

0

1) Использовать метод onSaveInstanceState в MainActivity для сохранения текущего фрагмента. Восстановите его в методе onCreate.

public void onCreate(Bundle savedInstanceState) { 
    ... 
    if (savedInstanceState != null) { 
     //Restore the fragment's instance 
     mContent = getSupportFragmentManager().getFragment(
        savedInstanceState, "mContent"); 
     ... 
    } 
    ... 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

//Save the fragment's instance 
getSupportFragmentManager().putFragment(outState, "mContent", mContent); 


} 

В фрагменте, сохранение состояния экземпляра путем переопределения onSaveInstanceState и восстановление на onActivityCreated:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ... 
    if (savedInstanceState != null) { 
     //Restore the fragment's state here 
    } 
} 
... 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

//Save the fragment's state here 


} 

Проверить this

2) В методе onResume вашего фрагмента get ваши общие предпочтения и установить до просмотров:

SharedPreferences preferences =  this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
String value = preferences .getString("key", "default_value"); 
Смежные вопросы