Я хотел бы создать нижнюю панель навигации в своем проекте. У каждого представления есть собственный фрагмент. Проблема заключается в том, что каждый раз, когда я нажимаю кнопку, чтобы изменить вид, например, из recents в избранное, он создает новый фрагмент с совершенно новыми состояниями (например, положение прокрутки, текст изменен, какой бы фрагмент не содержал). Я знаю, что в официальной документации на Android было написано, что нижняя панель навигации должна перезапускать состояния задачи, но я думаю, что это слишком неудобно для пользователей. Я хотел бы иметь аналогичную функциональность, такую как instagram, которую вы меняете из фида, чтобы исследовать и обратно, чтобы прокормить позицию прокрутки, в которой все кэширование изображений сохраняется. Я пробовал практически все способы решить эту проблему, единственное, что сработало, - это установить видимость GONE и установить видимость VISIBLE в соответствии с ситуацией, но я понимаю, что это НЕ ПРАВИЛЬНО, должен быть лучший способ сделать это, и я не говорю о ручном сохранение необходимых экземпляров. Я последовал почти каждому учебнику о донных фрагментах, но интересно то, что никто не заинтересован в том, чтобы использовать его, не вызывая новых каждый раз.
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frameLayout, FirstFragment.newInstance());
fragmentTransaction.commit();
bottomNavigationView = (BottomNavigationView) findViewById(R.id.navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment fragment = null;
switch (item.getItemId()) {
case R.id.menu_dialer:
fragment = FirstFragment.newInstance();
break;
case R.id.menu_email:
fragment = SecondFragment.newInstance();
break;
case R.id.menu_map:
fragment = ThirdFragment.newInstance();
break;
}
if (fragment != null) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frameLayout, fragment);
fragmentTransaction.commit();
}
return true;
}
});
Я также пробовал решения onAttach и Deattach, но снова не добился успеха.
Может быть, это связано с тем, что я использую версию canary или что-то не так в моих зависимостях от gradle?
НОВЫЕ ОБНОВЛЕНИЯ:
public class MainActivity extends AppCompatActivity {
private TextView mTextMessage;
private static final String TAG_FRAGMENT_ONE = "fragment_one";
private static final String TAG_FRAGMENT_TWO = "fragment_two";
private FragmentManager fragmentManager;
private Fragment currentFragment;
String TAG = "babken";
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
Fragment fragment = null;
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
fragment = fragmentManager.findFragmentByTag(TAG_FRAGMENT_ONE);
if (fragment == null) {
fragment = FragmentFirst.newInstance();
}
replaceFragment(fragment, TAG_FRAGMENT_ONE);
break;
case R.id.navigation_dashboard:
fragment = fragmentManager.findFragmentByTag(TAG_FRAGMENT_TWO);
if (fragment == null) {
fragment = FragmentSecond.newInstance();
}
replaceFragment(fragment, TAG_FRAGMENT_TWO);
break;
}
return true;
}
};
private void replaceFragment(@NonNull Fragment fragment, @NonNull String tag) {
if (!fragment.equals(currentFragment)) {
fragmentManager
.beginTransaction()
.replace(R.id.armen, fragment, tag)
.commit();
currentFragment = fragment;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(TAG_FRAGMENT_ONE);
if (fragment == null) {
fragment = FragmentFirst.newInstance();
}
replaceFragment(fragment, TAG_FRAGMENT_ONE);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
}