BottomNavigationView - 如何避免重建Fragments并重复使用它们

7 浏览
0 Comments

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);
    }
}

0