Establecer el título personalizado de la barra de acciones desde el fragmento

En mi Main FragmentActivity , configuro mi título personalizado de ActionBar esta manera:

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

Esto funciona perfecto Sin embargo, una vez que abra otros Fragments , quiero que el título cambie. No estoy seguro de cómo acceder a la Activity principal para hacer esto? En el pasado, hice esto:

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

¿Alguien puede aconsejar sobre el método adecuado?

XML:

     

En tu actividad:

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

Y en tu fragmento:

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

=== Actualización 10 de abril de 2015 ===

Debes usar listener para actualizar el título de tu barra de acciones

Fragmento:

 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.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { public void onFragmentInteraction(String title); } 

}

Y actividad:

 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(String title) { getSupportActionBar().setTitle(title); } 

}

Lea más aquí: https://developer.android.com/training/basics/fragments/communicating.html

Lo que estás haciendo es correcto. Fragments no tienen acceso a las API de ActionBar , por lo que debe llamar a getActivity . A menos que su Fragment sea ​​una clase interna estática, en cuyo caso debe crear una WeakReference para el padre y llamar Actividad. getActionBar desde allí.

Para establecer el título de su ActionBar , mientras usa un diseño personalizado, en su Fragment deberá llamar a getActivity().setTitle(YOUR_TITLE) .

La razón por la que llama a setTitle es porque está llamando a getTitle como el título de su ActionBar . getTitle devuelve el título para esa Activity .

Si no desea obtener la llamada getTitle , tendrá que crear un método público que establezca el texto de su TextView en la Activity que aloja el Fragment .

En tu actividad :

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

En tu Fragmento :

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

Documentos:

Activity.getTitle

Activity.setTitle

Además, no necesita llamar a this.whatever en el código que proporcionó, solo un consejo.

Los ejemplos de Google tienden a usar esto dentro de los fragmentos.

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

El fragmento pertenecerá a una ActionBarActivity y ahí es donde se encuentra la referencia a la barra de acciones. Esto es más limpio porque el fragmento no necesita saber exactamente qué actividad es, solo debe pertenecer a una actividad que implemente ActionBarActivity. Esto hace que el fragmento sea más flexible y se puede agregar a múltiples actividades como deberían.

Ahora, todo lo que necesitas hacer en el fragmento es.

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

Esto funciona bien si tiene un fragmento de base del que heredan los fragmentos en lugar de la clase de fragmento normal.

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

Entonces en tu fragmento.

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

Establecer el título de la actividad de un Fragment arruina los niveles de responsabilidad. Fragment está contenido dentro de una Activity , por lo que esta es la Activity , que debería establecer su propio título de acuerdo con el tipo del Fragment por ejemplo.

Supongamos que tiene una interfaz:

 interface TopLevelFragment { String getTitle(); } 

Los Fragment que pueden influenciar el título de la Activity luego implementan esta interfaz. Mientras en la actividad de alojamiento escribes:

 @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 esta manera, la Activity siempre controla qué título usar, incluso si se combinan varios TopLevelFragment , lo cual es bastante posible en una tableta.

En el Fragmento podemos usarlo así, está funcionando bien para mí.

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

En caso de que tenga problemas con el código, intente poner getSupportActionBar().setTitle(title) dentro onResume() de su fragmento en lugar de onCreateView(...) ie

En MainActivity.java :

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

En Fragmento:

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

Use lo siguiente:

 getActivity().setTitle("YOUR_TITLE"); 

No creo que la respuesta aceptada sea la respuesta perfecta para ello. Como todas las actividades que usan

Barra de herramientas

se extienden usando

AppCompatActivity

, los fragmentos invocados pueden usar el código mencionado a continuación para cambiar el título.

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

Si tienes una actividad principal con muchos fragmentos que colocas, usualmente usando el navegadorDrawer. Y tienes una serie de títulos para los fragmentos tuyos, cuando presionas hacia atrás, para que cambien, pon esto en la actividad principal que contiene los fragmentos

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

Esto supone que para cada fragmento le da una etiqueta, generalmente en algún lugar cuando agrega los fragmentos a la lista de navigationDrawer, de acuerdo con la posición presionada en la lista. Entonces esa posición es lo que capturo en la etiqueta:

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

Ahora, el navMenuTitles es algo que carga en el onCreate

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

La matriz xml es un recurso de cadena de tipo de matriz en strings.xml

    Title one Title Two  

Guarde su respuesta en el objeto String [] y configúrelo en OnTabChange () en MainActivity como Belowwww

 String[] object = {"Fragment1","Fragment2","Fragment3"}; public void OnTabChange(String 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)); } 

Aquí está mi solución para establecer el título de ActionBar a partir de fragmentos, cuando se usa NavigationDrawer. Esta solución usa una Interfaz para que los fragmentos no necesiten hacer referencia directamente a la Actividad principal:

1) Crea una interfaz:

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

2) En Fragment’s onAttach , envía la actividad al tipo de interfaz y llama al método SetActivityTitle:

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

3) En la actividad, implemente la interfaz ActionBarTitleSetter :

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

La desventaja de su enfoque de lanzamiento como tal

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

es que su fragmento ya no es reutilizable fuera de MainActivityFragment. Si no planea usarlo fuera de esa actividad, entonces no hay problema. Un mejor enfoque sería establecer condicionalmente el título dependiendo de la actividad. Entonces, dentro de tu fragmento, escribirías:

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

si está utilizando la plantilla estable de Android Studio 1.4 provista por google, debe escribir el código siguiente en onNavigationItemSelected en el que está relacionada la condición de invocación de fragmento.

  setTitle("YOUR FRAGMENT TITLE"); 

Estoy obteniendo una solución muy simple para establecer el título de ActionBar en cualquier fragmento o cualquier actividad sin ningún dolor de cabeza.

Simplemente modifique el xml donde se define la barra de herramientas de la siguiente manera:

      

1) Si desea establecer la barra de acciones en un fragmento, entonces:

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

Para usarlo desde cualquier lugar, puede definir un método en la actividad

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

Para llamar a este método en actividad, simplemente llámalo.

 setActionBarTitle("Your Title") 

Para llamar a este método desde un fragmento de la actividad, simplemente llámalo.

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

Solo para agregar a la respuesta seleccionada, es posible que también desee agregar un segundo método a su actividad principal. Entonces terminarías con los siguientes métodos en tu actividad principal:

 public void setActionBarTitle(String title) { getSupportActionBar().setTitle(title); } public void setActionBarTitle(int resourceId) { setActionBarTitle(getResources().getString(resourceId); } 

Esto le permitirá establecer el título tanto de una variable String como de una identificación de recurso como R.id.this_is_a_string de su archivo strings.xml. Esto también funcionará un poco más como getSupportActionBar().setTitle() funciona ya que le permite pasar un ID de recurso.

Hay muchas formas como se describe anteriormente. También puede hacer esto en onNavigationDrawerSelected() en su DrawerActivity

 public void setTitle(final String title){ ((TextView)findViewById(R.id.toolbar_title)).setText(title); } @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments fragment = null; String 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); } } 

Al menos para mí, hubo una respuesta fácil (después de investigar mucho) para cambiar el título de una pestaña en tiempo de ejecución:

TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText (“Mi nuevo texto”);

Si está usando ViewPager (como mi caso), puede usar:

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

en el método onPageSelected de su VIEW_PAGER.addOnPageChangeListener

El mejor evento para el título de cambio en 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); }