BottomNavigationView 的片段转换动画

4

我目前有一个应用程序,它包含一个MainActivity、一个BottomNavigationView和3个相应的碎片:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    // Bottom Nav
    bottomNav = findViewById(R.id.bottom_nav);
    bottomNav.setOnNavigationItemSelectedListener(
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                    Fragment fragment = null;

                    switch (menuItem.getItemId()) {
                        case R.id.bottom_nav_home:
                            fragment = new HomeFragment();
                            break;
                        case R.id.bottom_nav_favorites:
                            fragment = new FavoritesFragment();
                            break;
                        case R.id.bottom_nav_settings:
                            fragment = new SettingsFragment();
                            break;
                    }
                    return loadFragment(fragment, position);
                }
            }
    );
}

private boolean loadFragment(Fragment fragment) {
    if(fragment != null) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
        transaction.replace(R.id.container, fragment);
        transaction.commit();
        return true;
    }
    return false;
}

这个功能非常好用。我的问题是在切换片段时,进入/退出动画总是相同的。

所以如果我从主页到收藏夹,然后返回主页,主页会从右侧进入,而我希望从左侧进入。

是否有一种方法可以根据用户从应用程序的哪里进入来设置自定义进入/退出过渡动画?


一个简单的解决方案是将当前位置存储在一个变量中,然后当您调用 loadFragment 时,可以传入新的位置。然后检查 if (newPosition > currentPosition) -> 从左到右滑动,否则从右到左滑动。 - Filippo Vigani
我正在考虑这个解决方案,但在调用替换片段之前,我如何知道当前所处的位置? - Mitch Greene
2个回答

5

对于后来的读者,我稍微修改了@Ian Greene的方法。 在应用程序启动时有一个检查来禁用动画。

 private boolean loadFragment(Fragment fragment, int newPosition) {
    if(fragment != null) {
        if(newPosition == 0) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.contentLayout, fragment).commit();

        }
        if(startingPosition > newPosition) {
            getSupportFragmentManager()
                .beginTransaction()
                    .setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right )
                .replace(R.id.contentLayout, fragment).commit();

        }
        if(startingPosition < newPosition) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
                    .replace(R.id.contentLayout, fragment).commit();

        }
        startingPosition = newPosition;
        return true;
    }

    return false;
}

然后在创建时

    if (savedInstanceState == null) {
        loadFragment(mFirstFragment, 0);
    }

并且backPressed

@Override
public void onBackPressed() {
    int selectedItemId = bottomNavigationView.getSelectedItemId();
    if (R.id.navigation_home != selectedItemId) {
        loadFragment(mFirstFragment,1);
        toolbar.setTitle(title[0]);
        bottomNavigationView.setSelectedItemId(R.id.navigation_home);
    } else {
        super.onBackPressed();
    }
}

我希望这能帮助到某些人。
 @Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    Fragment fragment = null;
    int newPosition = 0;
    if (bottomNavigationView.getSelectedItemId() != menuItem.getItemId()) {
        switch (menuItem.getItemId()) {
            case R.id.navigation_home:
                fragment = mFirstFragment;
                toolbar.setTitle(title[0]);
                newPosition = 1;
                break;
            case R.id.navigation_dashboard:
                fragment = mSecondFragment;
                toolbar.setTitle(title[1]);
                newPosition = 2;
                break;
            case R.id.navigation_notifications:
                fragment = mThirdFragment;
                toolbar.setTitle(title[2]);
                newPosition = 3;
                break;
        }
    }
    return loadFragment(fragment, newPosition);
}

3

对于后来需要查询此内容的人。我想出了一种方法来跟踪当前位置,正如Filippo Vigani所建议的那样。这是我所做的:

public class MainActivity extends AppCompatActivity implements
    AddCategoryFragment.AddCategoryFragmentListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loadFragment(new HomeFragment(), 1);

    // Bottom Nav
    bottomNav = findViewById(R.id.bottom_nav);
    bottomNav.setOnNavigationItemSelectedListener(
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                    Fragment fragment = null;
                    int newPosition = 0;

                    switch (menuItem.getItemId()) {
                        case R.id.bottom_nav_home:
                            fragment = new HomeFragment();
                            newPosition = 1;
                            break;
                        case R.id.bottom_nav_favorites:
                            fragment = new FavoritesFragment();
                            newPosition = 2;
                            break;
                        case R.id.bottom_nav_settings:
                            fragment = new SettingsFragment();
                            newPosition = 3;
                            break;
                    }
                    return loadFragment(fragment, newPosition);
                }
            }
    );
} // End of onCreate


private boolean loadFragment(Fragment fragment, int newPosition) {
    if(fragment != null) {
        if(startingPosition > newPosition) {
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right );
            transaction.replace(R.id.container, fragment);
            transaction.commit();
        }
        if(startingPosition < newPosition) {
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
            transaction.replace(R.id.container, fragment);
            transaction.commit();
        }
        startingPosition = newPosition;
        return true;
    }

    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接