首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导航抽屉backstack,如何让actionbar标题随点击后的片段而改变

导航抽屉backstack,如何让actionbar标题随点击后的片段而改变
EN

Stack Overflow用户
提问于 2017-12-13 10:31:16
回答 1查看 436关注 0票数 0

因此,我设法让一个股票导航抽屉工作,并使动作栏标题随着所选片段的变化而改变。我还设法让backstack很容易地工作。

我不知道该怎么做才能让动作栏的标题在后退的时候变回来。谷歌文档说要添加一个onBackStackChangedListener:

代码语言:javascript
复制
getSupportFragmentManager().addOnBackStackChangedListener(
        new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                // Update your UI here.
            }
        });

但是我不知道该把它放在哪里?他们说when I .commit to changes,所以我认为它被放在

代码语言:javascript
复制
if (id == R.id.nav_spatial_awareness) {
            setTitle("Spatial Awareness");
            SpatialAwareness spatialAwarenessFragment = new SpatialAwareness();
            android.support.v4.app.FragmentManager spatialAwarenessManager = getSupportFragmentManager();
            spatialAwarenessManager.beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.main_content_layout, spatialAwarenessFragment, spatialAwarenessFragment.getTag())
                    .commit();

但这并不管用,这就是我所尝试的,我得到的都是红色的曲折

代码语言:javascript
复制
if (id == R.id.nav_spatial_awareness) {
            setTitle("Spatial Awareness");
            SpatialAwareness spatialAwarenessFragment = new SpatialAwareness();
            android.support.v4.app.FragmentManager spatialAwarenessManager = getSupportFragmentManager();
            spatialAwarenessManager.beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.main_content_layout, spatialAwarenessFragment, spatialAwarenessFragment.getTag())
                    .commit();

            getSupportFragmentManager().addOnBackStackChangedListener(
                    new FragmentManager.OnBackStackChangedListener() {
                        public void onBackStackChanged() {
                            setTitle("Spatial Awareness");
                        }
                    });

请帮帮我菜鸟

所以我试了一下

代码语言:javascript
复制
if (id == R.id.nav_spatial_awareness) {
            setTitle("Spatial Awareness");
            final SpatialAwareness spatialAwarenessFragment = new SpatialAwareness();
            android.support.v4.app.FragmentManager spatialAwarenessManager = getSupportFragmentManager();
            spatialAwarenessManager.beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.main_content_layout, spatialAwarenessFragment, "spatialAwarenessFragmentTag")
                    .commit();

            getSupportFragmentManager().addOnBackStackChangedListener(
                    new FragmentManager.OnBackStackChangedListener() {
                        public void onBackStackChanged() {
                            android.app.Fragment currentBackStackFragment = getFragmentManager().findFragmentByTag("spatialAwarenessFragmentTag");
                            if(currentBackStackFragment instanceof SpatialAwareness){
                                setTitle("Spatial");
                            }
                        }
                    });

我给了我的片段一个标签,然后尝试匹配实例,然后更改标题,仍然不行:(

EN

回答 1

Stack Overflow用户

发布于 2018-07-07 03:30:44

是的,前面提到的here解决方案是将FragmentManager.OnBackStackChangedListener添加到您的活动的FragmentManager中。

以下是我参与的一个项目的示例:

(我有一个包含7个片段的导航抽屉,当MainActivity打开时,OverviewFragment是最初打开的那个)

我的MainActivity:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, FragmentManager.OnBackStackChangedListener {

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        if (savedInstanceState == null) {
            // open the default fragment
            OverviewFragment fragment = new OverviewFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, fragment).commit();
            setTitle(R.string.title_fragment_overview);
        }

        getSupportFragmentManager().addOnBackStackChangedListener(this);
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        Fragment fragment = null;
        switch (item.getItemId()) {
            case R.id.nav_overview:
                fragment = new OverviewFragment();
                break;
            case R.id.nav_schedule:
                fragment = new ScheduleFragment();
                break;
            case R.id.nav_all_tasks:
                fragment = new AllTasksFragment();
                break;
            case R.id.nav_announcements:
                fragment = new AnnouncementFragment();
                    break;
            case R.id.nav_my_courses:
                fragment = new MyCoursesFragment();
                break;
            case R.id.nav_map:
                fragment = new MapFragment();
                break;
            case R.id.nav_settings:
                fragment = new SettingsFragment();
                break;
            default:
                fragment = new OverviewFragment();
        }

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .addToBackStack(null)
                .commit();

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onBackStackChanged() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment currentFragment = 
        fragmentManager.findFragmentById(R.id.fragment_container);
        if (currentFragment instanceof  OverviewFragment) {
            setTitle(R.string.title_fragment_overview);
            navigationView.getMenu().findItem(R.id.nav_overview).setChecked(true);
        }
        else if (currentFragment instanceof ScheduleFragment) {
            setTitle(R.string.title_fragment_schedule);
            navigationView.getMenu().findItem(R.id.nav_schedule).setChecked(true);
        }
        else if (currentFragment instanceof AllTasksFragment) {
            setTitle(R.string.title_fragment_all_tasks);
            navigationView.getMenu().findItem(R.id.nav_all_tasks).setChecked(true);
        }
        else if (currentFragment instanceof MyCoursesFragment) {
            setTitle(R.string.title_fragment_my_courses);
            navigationView.getMenu().findItem(R.id.nav_my_courses).setChecked(true);
        }
        else if (currentFragment instanceof AnnouncementFragment) {
            setTitle(R.string.title_fragment_announcements);
            navigationView.getMenu().findItem(R.id.nav_announcements).setChecked(true);
        }
        else if (currentFragment instanceof MapFragment) {
            setTitle(R.string.title_fragment_map);
            navigationView.getMenu().findItem(R.id.nav_map).setChecked(true);
        }
        else if (currentFragment instanceof SettingsFragment) {
            setTitle(R.string.title_fragment_settings);
            navigationView.getMenu().findItem(R.id.nav_settings).setChecked(true);
        }
    }
}

下面是整个项目:https://github.com/FCI-E-campus/fci-e-campus-android

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47784621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档