Dans ma main FragmentActivity
, je configure mon ActionBar
titre personnalisé comme ceci:
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'en ouvre un autre Fragments
, je veux que le titre change. Je ne sais pas comment accéder au Main Activity
pour faire cela? Dans le passé, j'ai fait ceci:
((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
catTitle);
Quelqu'un peut-il vous conseiller sur la bonne méthode?
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>
java
android
android-fragments
android-actionbar
android-fragmentactivity
TheLettuceMaster
la source
la source
Réponses:
=== Mise à jour du 30 octobre 2019 ===
Puisque nous avons de nouveaux composants tels que ViewModel et LiveData , nous pouvons avoir un moyen différent / plus simple de mettre à jour le titre de l'activité à partir de Fragment en utilisant ViewModel et Live Data
Activité
class MainActivity : AppCompatActivity() { private lateinit var viewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) if (savedInstanceState == null) { supportFragmentManager.beginTransaction() .replace(R.id.container, MainFragment.newInstance()) .commitNow() } viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) viewModel.title.observe(this, Observer { supportActionBar?.title = it }) } }
MainFragment
class MainFragment : Fragment() { companion object { fun newInstance() = MainFragment() } private lateinit var viewModel: MainViewModel override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.main_fragment, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) activity?.run { viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) } ?: throw Throwable("invalid activity") viewModel.updateActionBarTitle("Custom Title From Fragment") } }
Et MainModelView:
class MainViewModel : ViewModel() { private val _title = MutableLiveData<String>() val title: LiveData<String> get() = _title fun updateActionBarTitle(title: String) = _title.postValue(title) }
Et puis vous pouvez mettre à jour le titre de l'activité à partir de Fragment en utilisant
viewModel.updateActionBarTitle("Custom Title From Fragment")
=== Mise à jour du 10 avril 2015 ===
Vous devez utiliser l'écouteur 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.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { public void onFragmentInteraction(String 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(String title) { getSupportActionBar().setTitle(title); } }
En savoir plus ici: https://developer.android.com/training/basics/fragments/communicating.html
la source
onAttach(Context)
méthode si l'activité d'hôte passée implémente l'interface requise (récupérez l'activité de l'hôte viacontext.getActivity()
).Ce que vous faites est correct.
Fragments
n'ont pas accès auxActionBar
API, vous devez donc appelergetActivity
. Sauf si vousFragment
êtes une classe interne statique, auquel cas vous devez créer unWeakReference
pour le parent et appeler Activity.getActionBar
De là.Pour définir le titre de votre
ActionBar
, tout en utilisant une mise en page personnalisée, dans votre,Fragment
vous devrez appelergetActivity().setTitle(YOUR_TITLE)
.La raison pour laquelle vous appelez
setTitle
est que vous appelezgetTitle
comme titre de votreActionBar
.getTitle
renvoie le titre pour celaActivity
.Si vous ne souhaitez pas recevoir d'appel
getTitle
, vous devrez créer une méthode publique qui définit le texte de votreTextView
dans leActivity
qui héberge leFragment
.Dans votre activité :
public void setActionBarTitle(String title){ YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title); }
Dans votre fragment :
Documents:
Activity.getTitle
Activity.setTitle
De plus, vous n'avez pas besoin d'appeler
this.whatever
le code que vous avez fourni, juste un conseil.la source
XML
et également supprimé "ceci". Aucun changement ... Et non, ce n'est pas unestatic
classe interne.ActionBar
from aFragment
. De plus, je n'offrais pas la suppressionthis.whatever
comme solution à quoi que ce soit, ce n'était qu'un conseil de formatage de code.menu_act
) j'ai créé "mTitle" global, et, dans un fragment, j'attribue d'abord un titre à "mTitle" (( (menu_act) getActivity() ).mTitle = "new_title"
), et je le fais immédiatement( (menu_act) getActivity() ).restoreActionBar();
. Dans "restoreActionBar ()", j'ai "actionBar.setTitle (mTitle);".Les exemples Google ont tendance à l'utiliser dans les fragments.
private ActionBar getActionBar() { return ((ActionBarActivity) getActivity()).getSupportActionBar(); }
Le fragment appartiendra à une ActionBarActivity et c'est là que se trouve la référence à la barre d'actions. C'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 prévu.
Maintenant, tout ce que vous avez à 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 source
Le réglage
Activity
du titre à partir d'unFragment
gâchis les niveaux de responsabilité.Fragment
est contenu dans unActivity
, donc c'est leActivity
, qui devrait définir son propre titre en fonction du type deFragment
par exemple.Supposons que vous ayez une interface:
interface TopLevelFragment { String getTitle(); }
Les
Fragment
s qui peuvent influencer leActivity
titre du s implémentent alors cette interface. Pendant 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,
Activity
on contrôle toujours le titre à utiliser, même si plusieursTopLevelFragment
s sont combinés, ce qui est tout à fait possible sur une tablette.la source
Je ne pense pas que la réponse acceptée soit une réponse parfaite. Depuis toutes les activités qui utilisent
sont étendus en utilisant
, les fragments appelés à partir de celui-ci peuvent utiliser le code mentionné ci-dessous pour changer le titre.
((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");
la source
Dans le Fragment, nous pouvons utiliser comme ça, ça marche bien pour moi.
getActivity().getActionBar().setTitle("YOUR TITLE");
la source
Juste au cas où vous rencontriez des problèmes avec le code, essayez de mettre à l'
getSupportActionBar().setTitle(title)
intérieuronResume()
de votre fragment au lieu deonCreateView(...)
ieDans MainActivity.java :
public void setActionBarTitle(String title) { getSupportActionBar().setTitle(title); }
En fragment:
@Override public void onResume(){ super.onResume(); ((MainActivity) getActivity()).setActionBarTitle("Your Title"); }
la source
((MainActivity) getActivity()).setTitle("title")
suffisait. À Kotlin, mon fragment le faitactivity!!.title = "title
.Utilisez le suivant:
getActivity().setTitle("YOUR_TITLE");
la source
Voici ma solution pour définir le titre ActionBar à partir de fragments, lors de l'utilisation de NavigationDrawer. Cette solution utilise une interface afin 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(String title); }
2) Dans le onAttach du fragment, transtypez l'activité en type Interface et appelez la méthode SetActivityTitle:
@Override public void onAttach(Activity activity) { super.onAttach(activity); ((ActionBarTitleSetter) activity).setTitle(getString(R.string.title_bubbles_map)); }
3) Dans l'activité, implémentez l' interface ActionBarTitleSetter :
@Override public void setTitle(String title) { mTitle = title; }
la source
Meilleur événement pour changer de titre
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); }
la source
Un exemple simple de Kotlin
En supposant que ces niveaux correspondent ou sont une version supérieure de votre projet:
kotlin_version = '1.3.41' nav_version_ktx = '2.0.0'
Adaptez ceci à vos classes de fragments:
/** * A simple [Fragment] subclass. * * Updates the action bar title when onResume() is called on the fragment, * which is called every time you navigate to the fragment * */ class MyFragment : Fragment() { private lateinit var mainActivity: MainActivity override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { //[...] mainActivity = this.activity as MainActivity //[...] } override fun onResume() { super.onResume() mainActivity.supportActionBar?.title = "My Fragment!" } }
la source
Si vous avez une activité principale avec de nombreux fragments que vous mettez, généralement en utilisant le navigateurDrawer. Et vous avez une panoplie de titres pour vos fragments, lorsque vous appuyez en arrière, pour qu'ils changent, mettez cela dans l'activité 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 attribuez une balise, généralement quelque part lorsque vous ajoutez les fragments à la liste de navigationDrawer, en fonction de la position appuyée sur la liste. Donc, cette position est ce que je capture sur l'étiquette:
Maintenant, le navMenuTitles est quelque chose que vous chargez sur le onCreate
// load slide menu items navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
Le tableau xml est une ressource de chaîne de type tableau sur strings.xml
<!-- Nav Drawer Menu Items --> <string-array name="nav_drawer_items"> <item>Title one</item> <item>Title Two</item> </string-array>
la source
Enregistrez votre réponse dans l'objet String [] et définissez-le OnTabChange () dans MainActivity comme ci-dessouswww
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)); }
la source
L'inconvénient de votre approche du casting comme ça
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"); }
la source
si vous utilisez le modèle stable android studio 1.4 fourni par google, vous deviez écrire le code suivant dans la
onNavigationItemSelected
méthode dans laquelle votre fragment associé appelle la condition if.setTitle("YOUR FRAGMENT TITLE");
la source
<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimaryDark" app:popupTheme="@style/AppTheme.PopupOverlay" > <TextView style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" android:id="@+id/toolbar_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/app_name" /> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout>
public void setActionBarTitle(String title) { toolbarTitle.setText(title); }
setActionBarTitle("Your Title")
((MyActivity)getActivity()).setActionBarTitle("Your Title");
la source
Juste pour ajouter à la réponse sélectionnée, vous pouvez également ajouter une deuxième méthode à votre activité principale. Vous vous retrouveriez donc avec les méthodes suivantes dans votre activité principale:
public void setActionBarTitle(String title) { getSupportActionBar().setTitle(title); } public void setActionBarTitle(int resourceId) { setActionBarTitle(getResources().getString(resourceId); }
Cela vous permettra de définir le titre à la fois à partir d'une variable String et d'un ID de ressource tel que
R.id.this_is_a_string
votre fichier strings.xml. Cela fonctionnera également un peu plus comme celagetSupportActionBar().setTitle()
fonctionne car cela vous permet de transmettre un ID de ressource.la source
Il existe de nombreuses façons, comme indiqué ci-dessus. Vous pouvez également le faire
onNavigationDrawerSelected()
dans votreDrawerActivity
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 source
Au moins pour moi, il y avait une réponse facile (après beaucoup de recherches) pour changer le titre d'un onglet au moment de l'exécution:
TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText ("Mon nouveau texte");
la source
Si vous utilisez
ViewPager
(comme mon cas), vous pouvez utiliser:dans la
onPageSelected
méthode de votreVIEW_PAGER.addOnPageChangeListener
la source
Dans votre MainActivity, sous
onCreate:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Et dans votre activité de fragment sous
onResume
:Facultatif: - s'ils affichent un avertissement de référence nulle
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); Objects.requireNonNull(getActivity()).setTitle(R.string.app_name_science);
la source