BottomNavigationView - 如何避免重建Fragments并重复使用它们
BottomNavigationView - 如何避免重建Fragments并重复使用它们
我想在我的项目中创建一个底部导航栏。每个视图都有自己的片段。问题是,每次我点击按钮切换视图,例如从“最近”切换到“收藏”,它都会创建一个全新的片段,具有完全新的状态(例如,滚动位置,文本更改等)。我知道在官方的Android文档中写道底部导航栏应该重置任务状态,但我认为这对用户来说太不方便了。
我想要类似Instagram的功能,当你从动态切换到探索,再切回动态时,滚动位置、图片缓存等所有内容仍然保存。我尝试了几乎所有解决这个问题的方法,唯一有效的方法是根据情况设置可见性GONE并设置可见性VISIBLE,但我知道这不是正确的方法,应该有更好的方法来解决这个问题,我不是在讨论手动保存所需的实例。我几乎看过所有关于底部导航栏片段的教程,但有趣的是,没有人有兴趣在不调用new的情况下使用它。
我还尝试了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); } }