programacion - manual android studio avanzado
Establecer el título personalizado de la barra de acciones desde el fragmento (18)
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:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:ellipsize="end"
android:maxLines="1"
android:text=""
android:textColor="#fff"
android:textSize="25sp" />
</RelativeLayout>
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");
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;
}
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);
}
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");
}
En el Fragmento podemos usarlo así, está funcionando bien para mí.
getActivity().getActionBar().setTitle("YOUR TITLE");
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
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.
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));
}
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);
}
}
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");
}
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:
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");
}
}
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 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
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
<!-- Nav Drawer Menu Items -->
<string-array name="nav_drawer_items">
<item>Title one</item>
<item>Title Two</item>
</string-array>
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.
Use lo siguiente:
getActivity().setTitle("YOUR_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");