0

Сценарий: Активность A открывает активность B, активность B имеет два фрагмента a и b в viewpager, используя FragmentPagerAdapter, фрагменты a и b имеют некоторые переключатели и флажки, где пользователь взаимодействует;Сохранение состояний фрагментов viewpager Активность после перехода к предыдущему действию

Мне нужно хранить кнопки и флажки статусы в фрагментах, даже если я оставил активность B к A

Мои попытки: 1- удалены super.onBack() нажата, чтобы заставить систему в вызываемую onSavedInstanceState в но все равно не удалось сохранить фрагменты в нем, как экземпляр их в адаптере и не знаю, как получить тот же объект, созданный из них, для активности.

2- проверено onSaveInstanceState(), onViewStateRestored() в каждом фрагмент и onSavedInstance никогда не вызывались с использованием setRetainInstance (true) в oncreate(); затем принудительно вызывает onSaveInstanceState(), вызвав его onPause()

I Прочитайте большинство доступных решений в стеке и не работало, мой код выглядит следующим образом:

public class FilterPagerAdapter extends FragmentPagerAdapter { 


    public final static int KEYWORDS_TAB = 0; 
    public final static int AREAS_TAB = 1; 
    private int tabCount; 
    private Context context; 

public FilterPagerAdapter(FragmentManager fm, int tabCount, Context context) { 
    super(fm); 
    this.tabCount = tabCount; 
    this.context = context; 
} 


@Override 
public Fragment getItem(int position) { 
    Fragment fragment; 
    switch (position) { 
     case KEYWORDS_TAB: 
      fragment = KeyWordsFragment.newInstance(); 
      break; 
     case AREAS_TAB: 
      fragment = AreasFragment.newInstance(); 
      break; 
     default: 
      return null; 
    } 
    return fragment; 
} 

@Override 
public int getCount() { 
    return tabCount; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    String tabTitle = ""; 
    switch (position) { 
     case KEYWORDS_TAB: 
      tabTitle = context.getResources().getString(R.string.tab_keywords); 
      break; 
     case AREAS_TAB: 
      tabTitle = context.getResources().getString(R.string.tab_area); 
      break; 
     default: 

    } 
    return tabTitle; 
} 

}

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_filters); 

    ButterKnife.bind(this); 

    mAreas = new Areas(); 
    mKeywords = new KeyWords(); 
    viewControllers(); 
} 


private void viewControllers() { 

    tabLayout.addTab(tabLayout.newTab().setText(R.string.tab_keywords), CATEGORIES_TAB); 
    tabLayout.addTab(tabLayout.newTab().setText(R.string.tab_area), BRANDS_TAB); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
    tabLayout.addOnTabSelectedListener(this); 

    filterPagerAdapter = new FilterPagerAdapter(getSupportFragmentManager(), 
      tabLayout.getTabCount(), this); 
    viewPager.setAdapter(filterPagerAdapter); 
    tabLayout.setupWithViewPager(viewPager); 
} 

@Override 
public void onBackPressed() { 

    startActivity(new Intent(FiltersActivity.this, BranchesActivity.class)); 
} 


@Override 
public void onStop() { 
    super.onStop(); 
    tabLayout.removeOnTabSelectedListener(this); 
} 

}

ответ

0

Во-первых, я бы рекомендовал не навязывает ни одного вызова на onSavedInstanceState или любой другой жизненным циклом обратных вызовов. Лучше подойти к потоку жизненного цикла, чем сделать жизненный цикл подходящим для вашего потока.

Во-вторых, скорее всего, это не повод для использования setRetainInstance() на фрагментах вроде этого. Этот метод полезен для creating viewless Fragments and store large data-sets. Выход за пределы этого прецедента имеет тенденцию приводить к множеству головных болей.

Итак, с учетом этого пути должно быть несколько способов решить эту проблему, и они зависят от типа данных, которые он представляет.

Метод 1:

Один из способов, который похож на то, что вы пытались с # 1, является продвижение к следующей деятельности (в данном случае ActivityA), а не идти назад, когда пользователь нажимает назад. Это остановит и, возможно, остановит ActivityB, а также метод onSaveInstanceState(), в котором вы можете сохранить состояние своих фрагментов.

FragmentPagerAdapter позвонит по номеру getItem(), когда ему понадобится новый Fragment. Все Fragments, которые уже созданы, будут тогда в FragmentManager. Каждый фрагмент должен будет обрабатывать свое собственное состояние. Нет необходимости в том, чтобы Activity или Adapter знали об этом. Каждый ранее созданный Фрагмент будет иметь onSavedInstanceState(), и пакет, возвращенный из этого, будет передан в onCreate(bundle) и onCreateView(bundle).

Метод 2:

Вышеперечисленные работы для многих случаев, когда данные не очень важны. Вы могли бы уйти от него, чтобы стереть его, и сохранить состояние для удобства. Если пользователь по какой-то причине находился далеко от ActivityB, система могла выгружать его из стека. Если это произойдет, то оно все равно может быть уничтожено и государство вернется.В этом случае вам нужно будет использовать SharedPreferences или другое более постоянное хранилище данных для сохранения и восстановления состояния.

Метод 3:

Я заметил, что имя ActivityB фактически FiltersActivity. Я делаю предположение, что FiltersActivity - это действие, в котором пользователь выбирает фильтры, которые отправляются обратно на номер BranchesActivity. Если вы не хотите, чтобы эти постоянные, тогда другой метод должен был бы просто передавать информацию туда и обратно между ними.

  1. BranchesActivity будет проходить в текущих фильтров FiltersActivity.

  2. FiltersActivity то по умолчанию все настройки на фильтры, которые были переданы в.

  3. FiltersActivity позволяет пользователю выбрать новый набор фильтров.

  4. Пользователи нажимают «назад» на FiltersActivity, который возвращает выбранные фильтры.

  5. BranchesActivity теперь имеет новые фильтры. Когда пользователь хочет изменить фильтры, BranchesActivity будет вернуться к шагу 1.

+0

Прежде всего Brilliant иллюстративного ответ, во-вторых, я думаю, третий метод подходит для моего случая, я буду реализовывать его и получить вернуться к вам –

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

  • Нет связанных вопросов^_^