【问题标题】:How to keep fragments state like Instagram in Android?如何在 Android 中保持像 Instagram 一样的片段状态?
【发布时间】:2018-02-06 10:26:00
【问题描述】:

我需要实现我的应用的 UI,比如 Instagram 的。我需要使用底部导航视图从不同的片段切换,但我需要保持片段的状态,就像我离开它们一样。我怎样才能做到这一点?

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    item.setChecked(true);
    switch (item.getItemId()) {
        case R.id.action_formation:
            if (homeFragment == null) {
                homeFragment = new HomeFragment();
            }
            displayFragment(homeFragment);
            break;
        case R.id.action_result:
            if (introResultFragment == null) {
                introResultFragment = new IntroResultFragment();
            }
            displayFragment(introResultFragment);
            break;

        case R.id.action_market:
            displayFragment(new MarketFragment());
            break;
    }
    return false;
}


public void displayFragment(final Fragment fragment) {
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();
    fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().toString());
    fragmentTransaction.commit();
}

【问题讨论】:

标签: android android-fragments instagram bottomnavigationview


【解决方案1】:

已经很长时间了,但我想在 github 中提供我的开源库,它实现了与 Youtube 和 Instagram 相同的 UX: https://github.com/ZachBublil/ZNavigator

您必须将此依赖项添加到您的 gradle:

compile 'com.zach.znavigator:znavigator:1.0.0'

你唯一需要做的就是在BottomNavigationView中传递你想要的片段列表:

  public class SampleActivity extends NavigationActivity {

    private BottomNavigationView navigationView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        navigationView = (BottomNavigationView) findViewById(R.id.navigationView);

        LinkedHashMap<Integer, Fragment> rootFragments = new LinkedHashMap<>();
        rootFragments.put(R.id.tab1, new FirstTab());
        rootFragments.put(R.id.tab2,new SecondTab());
        rootFragments.put(R.id.tab3, new ThirdTab());
        init(rootFragments, R.id.container);

        navigationView.setOnNavigationItemSelectedListener(this);
        navigationView.setOnNavigationItemReselectedListener(this);
    }

    @Override
    public void tabChanged(int id) {
        navigationView.getMenu().findItem(id).setChecked(true);
    }
}

如果您想在其中一个选项卡中打开一个新片段作为内部屏幕,您可以通过在选项卡片段中使用 ZNavigation 类来实现:

ZNavigation.openChildFragment(getFragmentManager(),new ChildFragment());

【讨论】:

    【解决方案2】:

    只需记住活动片段,并使用 userVisiableHint 获取每个片段中的活动状态。

    private Fragment currentFragment; // need to be init
    
    private void switch2Fragment(Fragment target){
        getFragmentManager().executePendingTransactions();
        if(target.isAdded){
            getFragmentManager().beginTransaction().hide(currentFragment).show(target).commit();
        } else {
            getFragmentManager().beginTransaction().hide(currentFragment).add(R.id.xxx, target).commit();
        }
        currentFragment.setUserVisibleHint(false);
        currentFragment = target;
        target.setUserVisibleHint(true);
    }
    
    private boolean isFragmentActive(Fragment target){
        return target.getUserVisibleHint();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多