【问题标题】:Android - update toolbar title in activity while handle back navigation with fragmentAndroid - 在使用片段处理返回导航时更新活动中的工具栏标题
【发布时间】:2015-12-01 10:27:24
【问题描述】:

我有 Activity 托管的带有片段的幻灯片菜单,当用户点击幻灯片菜单片段中的任何项目时,我需要处理返回导航

当用户点击列表中的项目时,我调用此方法来显示正确的片段

public void SelectItem(int position) {

        Fragment _fragment = null;
        switch (position) {
            case 0:
                _fragment = Test_Home.newInstance();
                break;

            case 1:
                _fragment = Diseases_Fragment.newInstance();
                break;

          ........

            case 8:
                Logout();
                break;

            default:
               break;

        }

        if (_fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.view_content, _fragment).addToBackStack(null).commit();
             // set title , this textview in toolbar 
            _frag_title.setText(nav_items[position]);
            mDrawerLayout.closeDrawer(GravityCompat.START);
        }

这个方法来处理返回按钮

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }

我的 onCreate 方法

 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home_view);
            Toolbar _toolbar = (Toolbar) findViewById(R.id.toolbar);

           setSupportActionBar(_toolbar);
           getSupportActionBar().setHomeButtonEnabled(true);
           getSupportActionBar().setDisplayHomeAsUpEnabled(true);
           _frag_title = (TextView) _toolbar.findViewById(R.id.frag_title);
    }

实际上它工作得很好,但我的问题是显示片段显示旧标题不显示新标题

有没有办法调用我的方法_frag_title.setText(nav_items[position]);

我的问题不在后退导航中,我的问题是如何在导航中更新工具栏标题

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

在更改片段时更改工具栏的标题,您必须按照以下方式进行操作。

  1. 必须使用带有 TAG 名称或 ID 的片段,我将向您展示如何使用 TAG 名称(在这种情况下您也可以使用 id 来更改我的代码)。

要使用标签,你必须添加片段标签,每当你在布局中添加片段时,让我们通过标签添加片段

Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 

按照上述方法完成后,在 onBackPressed 中使用以下代码检查您是哪个片段

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
        Fragment fragment = getFragmentManager().findFragmentByTag("YOUR_TARGET_FRAGMENT_TAG");
        if (fragment instanceof FragmentA) {
            // add your code to change title of toolbar
        }
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

【讨论】:

  • 如果使用getFragmentManager().beginTransaction() .add(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG") .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 会怎样?因为如果我使用add 方法而不是replace 它不会调用onResume
【解决方案2】:

这是我解决此问题后的一段代码

public void SelectItem(int position) {
        Fragment _fragment = null;
        switch (position) {
            case 0:
                _fragment = Test_Home.newInstance();
                break;

            case 1:
                _fragment = Diseases_Fragment.newInstance();
                break;

          ........
          .....

            case 8:
                Logout();
                break;

            default:
               break;

        }

        if (_fragment != null) {
         // I add tag when I add fragment to BackStack
          String backStackName = fragment.getClass().getName();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.view_content, fragment, "TARGET_TAG")
                .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .addToBackStack(backStackName)
                .commit();
        _frag_title.setText(nav_items[position]);
        mDrawerLayout.closeDrawer(GravityCompat.START);
        } 
       }

我在 onCreate 方法上添加 BackStackChangedListener

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_view);

        ......
        ....

        .
        getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                Fragment f = getSupportFragmentManager().findFragmentById(R.id.view_content);
                if (f != null) {
                    updateTitleAndDrawer(f);
                }
            }
        });
}

   private void updateTitleAndDrawer(Fragment f) {
        String name = f.getClass().getName();
        if (name != null) {
            ChangeTitle(name);
        }
    }
 private void ChangeTitle(String fragmentName) {
        if (fragmentName.equals(Test_Home.class.getName())) {
            _frag_title.setText(nav_items[0]);
        } else if (fragmentName.equals(Diseases_Fragment.class.getName())) {
            _frag_title.setText(nav_items[1]);
        } else if (fragmentName.equals(Questions_Fragment.class.getName())) {
            _frag_title.setText(nav_items[2]);

       .......... 
       .......
}

}

【讨论】:

    【解决方案3】:

    您必须在每个片段的简历上处理此问题,以在返回片段时指定标题。

    目前发生的情况是,您在onCreate 或实际创建fragment 时设置标题,但由于tool bar 不是驻留在Activity 内的东西(不在Fragment )您必须专门对此进行更改。最好的地方是片段的onResume方法。

    所以尝试在你的onResume 中设置TextView Fragment

    【讨论】:

    • 我的问题不在设置标题上,当用户点击返回工具栏保持旧标题不更新以显示片段时的问题,让我们考虑用标题二显示片段二,当用户点击返回时显示片段一但标题还是两个
    • @MinaFawzy 你能找出问题所在吗?
    • 我想我会想办法做到这一点,但你的答案是错误的
    • 哪部分错了,按下后退按钮时没有调用onResume?
    • 我在工具栏中使用 textview
    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多