【问题标题】:ActionBar Title dynamically change with fragmentActionBar Title 随片段动态变化
【发布时间】:2015-10-15 22:18:18
【问题描述】:

我有 1 个 Activity,里面有 3 个 Fragment (Home-Login-RestorePass) 最初,HomeFragment 显示,另外两个被隐藏。我希望 ActionBar 标题根据显示的 Fragment 进行更改。

我正在尝试使用以下活动:

public void setActionBarTitle(String title){
    getSupportActionBar().setTitle(title);
}

@Override
public void onResume() {
    super.onResume();
    // Set title
    setActionBarTitle(getString(R.string.app_name));
}

片段也一样:

@Override
public void onResume() {
    super.onResume();
    // Set title
    ((LoginActivity) getActivity()).setActionBarTitle(getString(R.string.fragment_login));
}

但它不起作用。它总是在标题上显示 R.string.fragment_login

我正在使用 FragmentTransaction 进行片段转换:

btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
            HomeFragment homeFragment = (HomeFragment) getFragmentManager().findFragmentById(R.id.fragmentHome);
            LoginFragment loginFragment = (LoginFragment) getFragmentManager().findFragmentById(R.id.fragmentLogin);
            ft.hide(homeFragment).addToBackStack(null);
            ft.show(loginFragment).addToBackStack(null).commit();
        }
    });

此外,如果我可以根据片段在 ActionBar 上显示一个箭头按钮(后退),那就太好了。

感谢您的宝贵时间!问候。

【问题讨论】:

  • 您是否考虑过在您的Fragments 上使用add()/remove() 而不是show()/hide()?问题看起来可能是由于更改操作栏标题的调用发生冲突,因为即使隐藏的Fragments 也是“活动的”,它们只是缺少 UI。此外,FragmentonResume() 调用出现在您的Activity 之后,并且在Fragments 中,您显然(通过您的代码)将标题设置为fragment_login...?
  • @PPartisan 感谢您的时间,我尝试使用 add()/remove() 但它不起作用,其他 2 个片段位于主要片段之上,显然 remove() 不会从活动视图。我所有的片段都有其独特的 setActionBarTitle(fragmentString) 调用。我表达错了,对不起。再次感谢你:)

标签: android android-fragments android-actionbar


【解决方案1】:

请记住,如果您使用的是支持库,则必须在通过 getActivity() 获取 Activity 时专门投射它。然后您需要确保使用getSupportActionBar() 检索支持ActionBar。我可以在我的 Fragment 的onResume()...中使用以下代码在我的应用中设置 ActionBar 标题...

@Override
public void onResume() {
    super.onResume();
    AppCompatActivity activity = (AppCompatActivity) getActivity();
    ActionBar actionBar = activity.getSupportActionBar();
    actionBar.setTitle(R.string.my_fragment_title);
}

【讨论】:

    【解决方案2】:

    在活动中使用此方法更改Fragment 并以编程方式设置标题:

    private void displayFragment(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        String title = "";
        switch (position) {
        case 0:
            fragment = new Home();
            title = "Home";
            break;
        case 1:
            fragment = new Login();
            title = "Login";
            break;
        case 2:
            fragment = new RestorePass();
            title = "Restore Password";
            break;
    
        default:
            break;
        }
    
        // update selected fragment and title
        if (fragment != null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();
            getSupportActionBar().setTitle(title);
            // change icon to arrow drawable
            getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow);
        }
    }
    

    例如,您希望显示 Fragment Home

    displayFragment(0);
    

    【讨论】:

    • i f%&(#ing love you =) haha​​ .. 有了这个你解决了我的三个疑惑。谢谢,周末愉快。
    【解决方案3】:

    如果您在AndroidManifest 中设置活动属性android:label="",您将能够设置标题帖子初始化。我通过工具栏源代码发现了这种跟踪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      相关资源
      最近更新 更多