Définition du titre de la barre d’action personnalisée à partir d’un fragment

Dans mon FragmentActivity principal, je configure mon titre ActionBar personnalisé comme ActionBar :

  LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflator.inflate(R.layout.custom_titlebar, null); TextView tv = (TextView) v.findViewById(R.id.title); Typeface tf = Typeface.createFromAsset(this.getAssets(), "fonts/capsuula.ttf"); tv.setTypeface(tf); tv.setText(this.getTitle()); actionBar.setCustomView(v); 

Cela fonctionne parfaitement. Cependant, une fois que j’ouvre d’autres Fragments , je veux que le titre change. Je ne sais pas comment accéder à l’ Activity principale pour le faire? Dans le passé, j’ai fait ceci:

 ((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle( catTitle); 

Quelqu’un peut-il conseiller sur la méthode appropriée?

XML:

     

Dans votre activité:

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

Et dans ton fragment:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Set title bar ((MainFragmentActivity) getActivity()) .setActionBarTitle("Your title"); } 

=== Mise à jour du 10 avril 2015 ===

Vous devez utiliser listener pour mettre à jour le titre de votre barre d’action

Fragment:

 public class UpdateActionBarTitleFragment extends Fragment { private OnFragmentInteractionListener mListener; public UpdateActionBarTitleFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mListener != null) { mListener.onFragmentInteraction("Custom Title"); } return inflater.inflate(R.layout.fragment_update_action_bar_title2, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentInteractionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toSsortingng() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { public void onFragmentInteraction(Ssortingng title); } 

}

Et activité:

 public class UpdateActionBarTitleActivity extends ActionBarActivity implements UpdateActionBarTitleFragment.OnFragmentInteractionListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_update_action_bar_title); } @Override public void onFragmentInteraction(Ssortingng title) { getSupportActionBar().setTitle(title); } 

}

Lire plus ici: https://developer.android.com/training/basics/fragments/communicating.html

Ce que vous faites est correct. Fragments n’ont pas access aux API ActionBar , vous devez donc appeler getActivity . À moins que votre Fragment soit une classe interne statique, vous devez alors créer une WeakReference pour le parent et appeler l’activité. getActionBar partir de là.

Pour définir le titre de votre ActionBar , tout en utilisant une disposition personnalisée, dans votre Fragment vous devez appeler getActivity().setTitle(YOUR_TITLE) .

La raison pour laquelle vous appelez setTitle est que vous appelez getTitle comme titre de votre ActionBar . getTitle renvoie le titre de cette Activity .

Si vous ne voulez pas recevoir l’appel getTitle , vous devrez créer une méthode publique qui définit le texte de votre TextView dans l’ Activity qui héberge le Fragment .

Dans votre activité :

 public void setActionBarTitle(Ssortingng title){ YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title); } 

Dans votre fragment :

 ((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE); 

Documents:

Activity.getTitle

Activity.setTitle

En outre, vous n’avez pas besoin d’appeler this.whatever dans le code que vous avez fourni, juste une astuce.

Les exemples Google ont tendance à utiliser cela dans les fragments.

 private ActionBar getActionBar() { return ((ActionBarActivity) getActivity()).getSupportActionBar(); } 

Le fragment appartiendra à ActionBarActivity et c’est là que se trouve la référence à la barre d’actions. Ceci est plus propre car le fragment n’a pas besoin de savoir exactement de quelle activité il s’agit, il doit seulement appartenir à une activité qui implémente ActionBarActivity. Cela rend le fragment plus flexible et peut être ajouté à plusieurs activités comme elles le sont.

Maintenant, tout ce que vous devez faire dans le fragment est.

 getActionBar().setTitle("Your Title"); 

Cela fonctionne bien si vous avez un fragment de base dont vos fragments héritent au lieu de la classe de fragment normale.

 public abstract class BaseFragment extends Fragment { public ActionBar getActionBar() { return ((ActionBarActivity) getActivity()).getSupportActionBar(); } } 

Puis dans votre fragment.

 public class YourFragment extends BaseFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getActionBar().setTitle("Your Title"); } } 

La définition du titre de l’activité à partir d’un Fragment perturbe les niveaux de responsabilité. Fragment est contenu dans une Activity , il s’agit donc de l’ Activity , qui devrait définir son propre titre en fonction du type de Fragment par exemple.

Supposons que vous ayez une interface:

 interface TopLevelFragment { Ssortingng getTitle(); } 

Les Fragment qui peuvent influencer le titre de l’ Activity implémentent alors cette interface. Lors de l’activité d’hébergement, vous écrivez:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getFragmentManager(); fm.beginTransaction().add(0, new LoginFragment(), "login").commit(); } @Override public void onAttachFragment(Fragment fragment) { super.onAttachFragment(fragment); if (fragment instanceof TopLevelFragment) setTitle(((TopLevelFragment) fragment).getTitle()); } 

De cette manière, l’ Activity contrôle toujours le titre à utiliser, même si plusieurs TopLevelFragment sont combinés, ce qui est tout à fait possible sur une tablette.

Dans le fragment que nous pouvons utiliser comme ça, ça marche bien pour moi.

 getActivity().getActionBar().setTitle("YOUR TITLE"); 

Juste au cas où vous rencontrez des problèmes avec le code, essayez de mettre getSupportActionBar().setTitle(title) dans onResume() de votre fragment au lieu de onCreateView(...)

Dans MainActivity.java :

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

En fragment:

  @Override public void onResume(){ super.onResume(); ((MainActivity) getActivity()).setActionBarTitle("Your Title"); } 

Utilisez le suivant:

 getActivity().setTitle("YOUR_TITLE"); 

Je ne pense pas que la réponse acceptée soit une réponse parfaite à cela. Depuis toutes les activités qui utilisent

Barre d’outils

sont étendues en utilisant

AppCompatActivity

, les fragments appelés peuvent utiliser le code mentionné ci-dessous pour modifier le titre.

 ((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title"); 

Si vous avez une activité principale avec de nombreux fragments, vous utilisez généralement la navigationDrawer. Et vous avez une panoplie de titres pour vos fragments, lorsque vous appuyez en arrière, pour qu’ils changent, mettez-les dans l’action principale qui contient les fragments.

 @Override public void onBackPressed() { int T=getSupportFragmentManager().getBackStackEntryCount(); if(T==1) { finish();} if(T>1) { int tr = Integer.parseInt(getSupportFragmentManager().getBackStackEntryAt(T-2).getName()); setTitle(navMenuTitles[tr]); super.onBackPressed(); } } 

Cela suppose que pour chaque fragment, vous lui atsortingbuez une balise, généralement quelque part lorsque vous ajoutez les fragments à la liste de navigationDrawer, en fonction de la position pressée dans la liste. Donc, cette position est ce que je capture sur l’étiquette:

  fragmentManager.beginTransaction(). replace(R.id.frame_container, fragment).addToBackStack(position).commit(); 

Maintenant, les navMenuTitles sont quelque chose que vous chargez sur onCreate

  // load slide menu items navMenuTitles = getResources().getSsortingngArray(R.array.nav_drawer_items); 

Le tableau xml est une ressource de type tableau sur ssortingngs.xml

    Title one Title Two  

Enregistrez ur Answer dans Ssortingng [] object et définissez-le OnTabChange () dans MainActivity comme Belowwww

 Ssortingng[] object = {"Fragment1","Fragment2","Fragment3"}; public void OnTabChange(Ssortingng tabId) { int pos =mTabHost.getCurrentTab(); //To get tab position actionbar.setTitle(object.get(pos)); } //Setting in View Pager public void onPageSelected(int arg0) { mTabHost.setCurrentTab(arg0); actionbar.setTitle(object.get(pos)); } 

Voici ma solution pour définir le titre ActionBar à partir de fragments, lors de l’utilisation de NavigationDrawer. Cette solution utilise une interface pour que les fragments n’aient pas besoin de référencer directement l’activité parente:

1) Créez une interface:

 public interface ActionBarTitleSetter { public void setTitle(Ssortingng title); } 

2) Dans le fragment onAttach du Fragment, convertissez l’activité en Type d’interface et appelez la méthode SetActivityTitle:

 @Override public void onAttach(Activity activity) { super.onAttach(activity); ((ActionBarTitleSetter) activity).setTitle(getSsortingng(R.ssortingng.title_bubbles_map)); } 

3) Dans l’activité, implémentez l’interface ActionBarTitleSetter :

 @Override public void setTitle(Ssortingng title) { mTitle = title; } 

L’inconvénient de votre approche de casting comme ça

 ((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle( catTitle); 

est que votre fragment n’est plus réutilisable en dehors de MainActivityFragment. Si vous ne prévoyez pas de l’utiliser en dehors de cette activité, il n’y a pas de problème. Une meilleure approche serait de définir conditionnellement le titre en fonction de l’activité. Donc, à l’intérieur de votre fragment, vous écririez:

 if (getActivity() instanceof ActionBarActivity) { ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Some Title"); } 

Si vous utilisez le modèle stable Android Studio 1.4 fourni par Google, vous devez écrire le code suivant dans la méthode onNavigationItemSelected dans lequel votre appel apparenté si condition.

  setTitle("YOUR FRAGMENT TITLE"); 

Je reçois une solution très simple pour définir ActionBar Title dans un fragment ou une activité quelconque sans aucun mal de tête.

Modifiez simplement le xml où est définie la barre d’outils comme ci-dessous:

      

1) Si vous voulez définir la barre d’action dans un fragment, alors:

 Toolbar toolbar = findViewById(R.id.toolbar); TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title); 

Pour l’utiliser de n’importe où, vous pouvez définir une méthode dans l’activité

 public void setActionBarTitle(Ssortingng title) { toolbarTitle.setText(title); } 

Pour appeler cette méthode en activité, appelez-la simplement.

 setActionBarTitle("Your Title") 

Pour appeler cette méthode à partir d’un fragment de l’activité, appelez-la simplement.

 ((MyActivity)getActivity()).setActionBarTitle("Your Title"); 

Juste pour append à la réponse sélectionnée, vous pouvez également append une deuxième méthode à votre activité principale. Vous vous retrouveriez donc avec les méthodes suivantes dans votre activité principale:

 public void setActionBarTitle(Ssortingng title) { getSupportActionBar().setTitle(title); } public void setActionBarTitle(int resourceId) { setActionBarTitle(getResources().getSsortingng(resourceId); } 

Cela vous permettra de définir le titre à la fois d’une variable Ssortingng et d’un ID de ressource tel que R.id.this_is_a_ssortingng partir de votre fichier ssortingngs.xml. Cela fonctionnera également un peu plus comme comment getSupportActionBar().setTitle() fonctionne car il vous permet de passer un ID de ressource.

Il y a beaucoup de façons comme indiqué ci-dessus. Vous pouvez également le faire dans onNavigationDrawerSelected() dans votre DrawerActivity

 public void setTitle(final Ssortingng title){ ((TextView)findViewById(R.id.toolbar_title)).setText(title); } @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments fragment = null; Ssortingng title = null; switch(position){ case 0: fragment = new HomeFragment(); title = "Home"; break; case 1: fragment = new ProfileFragment(); title = ("Find Work"); break; ... } if (fragment != null){ FragmentManager fragmentManager = getFragmentManager(); fragmentManager .beginTransaction() .replace(R.id.container, fragment).commit(); //The key is this line if (title != null && findViewById(R.id.toolbar_title)!= null ) setTitle(title); } } 

Au moins pour moi, il y avait une réponse facile (après beaucoup de recherches) à la modification d’un titre d’onglet à l’exécution:

TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText (“Mon nouveau texte”);

Si vous utilisez ViewPager (comme mon cas), vous pouvez utiliser:

 getSupportActionBar().setTitle(YOURE_TAB_BAR.getTabAt(position).getText()); 

dans la méthode onPageSelected de votre VIEW_PAGER.addOnPageChangeListener

Meilleur événement pour le titre de modification onCreateOptionsMenu

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.general, container, setHasOptionsMenu(true); // <-Add this line return view; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // If use specific menu menu.clear(); inflater.inflate(R.menu.path_list_menu, menu); // If use specific menu ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your Fragment"); super.onCreateOptionsMenu(menu, inflater); }