static
переменные не обязательны в этом случае. Вы можете хранить значение везде, например, что еще «живое» - переменная экземпляра действия. Это будет выглядеть следующим образом:
((MyActivity)getActivity()).setFirstPagerPosition(position)
((MyActivity)getActivity()).getFirstPagerPosition()
. Лучший подход - передать активность фрагменту как экземпляр некоторого интерфейса, который он реализует следующим образом.
interface FirstPagerPositionStorage {
void setFirstPagerPosition(position);
int getFirstPagerPosition();
}
class MyActivity extends Activity implements FirstPagerPositionStorage{
...
}
MyFragment.newInstance((FirstPagerPositionStorage)this)
class MyFragment extends Fragment {
FirstPagerPositionStorage listener;
static MyFragment newInstance(FirstPagerPositionStorage listener){
MyFragment fragment = new MyFragment();
fragment.listener = listener;
return fragment;
}
}
Не использовать onPause
метод. для хранения таких значений используйте OnPageSelectedListener
из ViewPager
, есть метод onPageSelected(int position)
- используйте его для хранения значения
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrollStateChanged(int arg0) { }
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageSelected(int position) {
listener.setFirstPagerPosition(position);
//or if you will go with activity methods
((MyActivity)getActivity()).setFirstPagerPosition(position);
}
});
Если вы выбрали способ прослушивания, не забудьте проверить, реализует ли текущая деятельность этот интерфейс фрагментарно onAttach
метод
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (!(context instanceof FirstPagerPositionStorage)){
throw IllegalStateException("Activity must implement FirstPagerPositionStorage");
}
}
Это было проще и более классическим c Android способом. Современный способ заключается в использовании общего доступа ко всем нижним фрагментам навигации ViewModel
Большинство современных приложений будут реализованы таким образом. Это довольно круто использовать в сочетании с Jetpack Navigation
и BottomNavigation
- подробнее здесь
В любом случае все значения, сохраненные таким образом, будут потеряны и после закрытия действия. значение static
будет потеряно после закрытия приложения. Если вы хотите сохранить это значение между запусками приложения - используйте SharedPreference
или другое хранилище, такое как файловый кеш или база данных.
Использование static
переменных не очень хорошо, но совсем не плохо. Основной недостаток этого - вы можете привыкнуть к нему, и в конечном итоге приложение станет намного сложнее поддерживать из-за отсутствия надлежащего потока данных.
Надеюсь, это поможет