In meinem Main FragmentActivity
stelle ich meinen benutzerdefinierten ActionBar
-Titel folgendermaßen ein:
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);
Das funktioniert perfekt. Sobald ich jedoch Fragments
öffne, möchte ich, dass sich der Titel ändert. Ich bin nicht sicher, wie ich auf das Main Activity
zugreifen kann, um dies zu tun? In der Vergangenheit habe ich Folgendes getan:
((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
catTitle);
Kann jemand über die richtige Methode beraten?
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>
In Ihrer Aktivität:
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
Und in deinem Fragment:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Set title bar
((MainFragmentActivity) getActivity())
.setActionBarTitle("Your title");
}
=== Update 10. April 2015 ===
Sie sollten den Listener verwenden, um den Titel der Aktionsleiste zu aktualisieren
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);
}
}
Und Aktivität:
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);
}
}
Lesen Sie hier mehr: https://developer.Android.com/training/basics/fragments/communicating.html
Was du tust, ist richtig. Fragments
hat keinen Zugriff auf die ActionBar
-APIs, daher müssen Sie getActivity
aufrufen. Wenn Ihr Fragment
keine statische innere Klasse ist, sollten Sie in diesem Fall ein WeakReference
für das übergeordnete Element erstellen und von dort aus die Aktivität .getActionBar
aufrufen.
Um den Titel für Ihr ActionBar
bei Verwendung eines benutzerdefinierten Layouts festzulegen, müssen Sie in Ihrem Fragment
getActivity().setTitle(YOUR_TITLE)
aufrufen.
Der Grund, warum Sie setTitle
aufrufen, ist, dass Sie getTitle
als Titel Ihrer ActionBar
-Datei aufrufen. getTitle
gibt den Titel für diese Activity
zurück.
Wenn Sie nicht den Aufruf getTitle
erhalten möchten, müssen Sie eine öffentliche Methode erstellen, die den Text Ihres TextView
im Activity
festlegt, der das Fragment
hostet.
In Ihrer Aktivität:
public void setActionBarTitle(String title){
YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title);
}
In deinem Fragment:
((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);
Docs:
Außerdem müssen Sie in dem von Ihnen angegebenen Code nicht this.whatever
aufrufen, sondern lediglich einen Tipp.
Google-Beispiele tendieren dazu, dies innerhalb der Fragmente zu verwenden.
private ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar();
}
Das Fragment gehört zu einer ActionBarActivity und dort befindet sich der Verweis auf die Aktionsleiste. Dies ist sauberer, da das Fragment nicht genau wissen muss, um welche Aktivität es sich handelt. Es muss nur zu einer Aktivität gehören, die ActionBarActivity implementiert. Dies macht das Fragment flexibler und kann wie gewünscht zu mehreren Aktivitäten hinzugefügt werden.
Alles, was Sie in dem Fragment tun müssen, ist.
getActionBar().setTitle("Your Title");
Dies funktioniert gut, wenn Sie ein Basisfragment haben, von dem Ihre Fragmente anstelle der normalen Fragmentklasse erben.
public abstract class BaseFragment extends Fragment {
public ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar();
}
}
Dann in deinem Fragment.
public class YourFragment extends BaseFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getActionBar().setTitle("Your Title");
}
}
Durch das Festlegen von Activity
's Titel von einer Fragment
werden die Verantwortungsebenen beeinträchtigt. Fragment
ist in einer Activity
enthalten, also ist dies die Activity
, die ihren eigenen Titel beispielsweise nach dem Typ der Fragment
setzen sollte.
Angenommen, Sie haben eine Schnittstelle:
interface TopLevelFragment
{
String getTitle();
}
Die Fragment
s, die den Titel der Activity
beeinflussen können, implementieren diese Schnittstelle. Während der Hosting-Aktivität schreiben Sie:
@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());
}
Auf diese Weise hat Activity
immer die Kontrolle darüber, welcher Titel verwendet werden soll, selbst wenn mehrere TopLevelFragment
s kombiniert werden, was auf einem Tablet durchaus möglich ist.
In dem Fragment können wir so verwenden, es funktioniert gut für mich.
getActivity().getActionBar().setTitle("YOUR TITLE");
Falls Sie Probleme mit dem Code haben, setzen Sie getSupportActionBar().setTitle(title)
in onResume()
Ihres Fragments anstelle von onCreateView(...)
In MainActivity.Java :
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
In Fragment:
@Override
public void onResume(){
super.onResume();
((MainActivity) getActivity()).setActionBarTitle("Your Title");
}
Verwenden Sie folgendes:
getActivity().setTitle("YOUR_TITLE");
Ich glaube nicht, dass die akzeptierte Antwort eine perfekte Antwort dafür ist. Da alle Aktivitäten, die nutzen
Werkzeugleiste
werden mit erweitert
AppCompatActivity
können die von ihr aufgerufenen Fragmente den unten genannten Code zum Ändern des Titels verwenden.
((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");
Speichern Sie Ihr Answer in String [] - Objekt und setzen Sie es in MainActivity auf OnTabChange () als 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));
}
Wenn Sie eine Hauptaktivität mit vielen Fragmenten haben, legen Sie normalerweise den navigationDrawer ein. Und Sie haben eine Reihe von Titeln für Ihre Fragmente, wenn Sie sie zurückdrücken, damit sich diese ändern können, legen Sie dies in die Hauptaktivität, die die Fragmente enthält
@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();
}
}
Dies setzt voraus, dass Sie für jedes Fragment ein Tag vergeben, normalerweise irgendwo, wenn Sie die Fragmente zur Liste von navigationDrawer hinzufügen, je nach Position, die in der Liste gedrückt ist. Diese Position ist also das, was ich am Tag festhalte:
fragmentManager.beginTransaction().
replace(R.id.frame_container, fragment).addToBackStack(position).commit();
Jetzt laden Sie die navMenuTitles in onCreate
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
Die Array-XML ist eine String-Ressource vom Typ Array für strings.xml
<!-- Nav Drawer Menu Items -->
<string-array name="nav_drawer_items">
<item>Title one</item>
<item>Title Two</item>
</string-array>
Hier ist meine Lösung zum Festlegen des ActionBar-Titels aus Fragmenten bei Verwendung von NavigationDrawer. Diese Lösung verwendet eine Schnittstelle, sodass die Fragmente nicht direkt auf die übergeordnete Aktivität verweisen müssen:
1) Erstellen Sie eine Schnittstelle:
public interface ActionBarTitleSetter {
public void setTitle(String title);
}
2) Wenden Sie die Aktivität in " onAttach " des Fragments in den Typ "Interface" an, und rufen Sie die SetActivityTitle-Methode auf:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((ActionBarTitleSetter) activity).setTitle(getString(R.string.title_bubbles_map));
}
3) Implementieren Sie in der Aktivität die Schnittstelle ActionBarTitleSetter :
@Override
public void setTitle(String title) {
mTitle = title;
}
wenn Sie eine stabile, von Google bereitgestellte Android-Studio 1.4-Vorlage als einfach verwenden, müssen Sie den folgenden Code in onNavigationItemSelected
methodein schreiben, in dem Ihr verwandtes Fragment if-Bedingung aufruft.
setTitle("YOUR FRAGMENT TITLE");
Ich bekomme eine sehr einfache Lösung, um ActionBar-Titel in entweder Fragment oder irgendeine Aktivität ohne Kopfschmerzen.
Ändern Sie einfach die XML-Datei, in der die Symbolleiste wie folgt definiert ist:
<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>
1) Wenn Sie die Aktionsleiste in ein Fragment setzen möchten, gilt Folgendes:
Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
Für die Verwendung von überall aus können Sie eine Methode in der Aktivität definieren
public void setActionBarTitle(String title) {
toolbarTitle.setText(title);
}
Um diese Methode in Activity aufzurufen, rufen Sie sie einfach auf.
setActionBarTitle("Your Title")
Um diese Methode aus einem Fragment der Aktivität aufzurufen, rufen Sie sie einfach auf.
((MyActivity)getActivity()).setActionBarTitle("Your Title");
Der Nachteil Ihrer Herangehensweise an das Casting ist so
((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
catTitle);
ist, dass Ihr Fragment außerhalb von MainActivityFragment nicht mehr verwendet werden kann. Wenn Sie nicht beabsichtigen, es außerhalb dieser Aktivität zu verwenden, gibt es kein Problem. Ein besserer Ansatz wäre, den Titel abhängig von der Aktivität bedingt festzulegen. In Ihrem Fragment würden Sie also schreiben:
if (getActivity() instanceof ActionBarActivity) {
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Some Title");
}
Zumindest für mich gab es (nach langem Graben) eine einfache Antwort auf das Ändern eines Tab-Titels zur Laufzeit:
TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); TabLayout.getTabAt (MyTabPos) .setText ("My New Text");
In Ihrer Hauptaktivität unter onCreate:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Und in Ihrer Fragmentaktivität unter onResume
:
getActivity().setTitle(R.string.app_name_science);
Optional: - wenn sie eine Warnung vor einer Nullreferenz anzeigen
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
Objects.requireNonNull(getActivity()).setTitle(R.string.app_name_science);
Wenn Sie ViewPager
verwenden (wie in meinem Fall), können Sie Folgendes verwenden:
getSupportActionBar().setTitle(YOURE_TAB_BAR.getTabAt(position).getText());
in onPageSelected
Methode Ihres VIEW_PAGER.addOnPageChangeListener
Bestes Ereignis für Titeländerung 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);
}
Ein einfaches Kotlin-Beispiel
Angenommen, diese Gradle-Deps stimmen mit der höheren Version in Ihrem Projekt überein oder sind höher:
kotlin_version = '1.3.41'
nav_version_ktx = '2.0.0'
Passen Sie dies an Ihre Fragmentklassen an:
/**
* 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!"
}
}
Um nur die ausgewählte Antwort hinzuzufügen, möchten Sie möglicherweise auch eine zweite Methode zu Ihrer Hauptaktivität hinzufügen. So würden Sie in Ihrer Hauptaktivität die folgenden Methoden erhalten:
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
public void setActionBarTitle(int resourceId) {
setActionBarTitle(getResources().getString(resourceId);
}
Dadurch können Sie den Titel sowohl aus einer String-Variablen als auch aus einer Ressourcen-ID wie R.id.this_is_a_string
aus Ihrer strings.xml-Datei festlegen. Dies funktioniert auch ein wenig mehr wie getSupportActionBar().setTitle()
, da Sie eine Ressourcen-ID übergeben können.
Es gibt viele Möglichkeiten, wie oben beschrieben. Sie können dies auch in onNavigationDrawerSelected()
in Ihrer DrawerActivity
tun.
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);
}
}