web-dev-qa-db-fra.com

ActionBar Title change dynamiquement avec fragment

J'ai 1 activité avec 3 fragments à l'intérieur (Home-Login-RestorePass) Initialement, HomeFragment montre et les deux autres sont cachés. Je souhaite que le titre de la barre d’action change en fonction du fragment affiché.

J'essaie dans mon activité avec:

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

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

et les fragments ont le même:

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

Mais ça ne marche pas. Il montre toujours R.string.fragment_login sur le titre.

J'utilise FragmentTransaction pour la transition de fragment:

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();
        }
    });

De plus, si je pouvais faire apparaître un bouton fléché (Retour) sur ActionBar en fonction du fragment, ce serait génial.

Merci pour votre temps! Cordialement.

8
Maverick.pe

Utilisez cette méthode en activité pour modifier la Fragment et définir le titre par programme:

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);
    }
}

Par exemple, vous souhaitez que le fragment Home soit affiché:

displayFragment(0);
10
Anggrayudi H

Gardez à l'esprit que si vous utilisez la bibliothèque de support, vous devez spécifiquement lancer votre activité lorsque vous l'obtenez via getActivity(). Et vous voudrez ensuite vous assurer de récupérer un ActionBar de support en utilisant getSupportActionBar(). J'ai pu définir le titre de la barre d'action dans mon application en utilisant le code suivant dans la fonction onResume()... de mon fragment.

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

Si vous définissez l'attribut d'activité Android:label="" dans la AndroidManifest, vous pourrez définir l'initialisation du titre. J'ai découvert ce traçage via le code source de la barre d'outils. 

0
jahcoder