In meinem Main FragmentActivity
richte 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 andere öffne Fragments
, möchte ich, dass sich der Titel ändert. Ich bin nicht sicher, wie ich dazu auf den Main zugreifen soll Activity
. 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>
android
android-fragments
android-actionbar
android-fragmentactivity
TheLettuceMaster
quelle
quelle
Antworten:
=== Update 30. Oktober 2019 ===
Da wir über neue Komponenten wie ViewModel und LiveData verfügen , können wir den Aktivitätstitel mithilfe von ViewModel und Live Data auf andere / einfachere Weise aus dem Fragment aktualisieren
Aktivität
MainFragment
Und MainModelView:
Und dann können Sie den Aktivitätstitel von Fragment mit aktualisieren
viewModel.updateActionBarTitle("Custom Title From Fragment")
=== Update 10. April 2015 ===
Sie sollten den Listener verwenden, um den Titel Ihrer Aktionsleiste zu aktualisieren
Fragment:
Und Aktivität:
Lesen Sie hier mehr: https://developer.android.com/training/basics/fragments/communicating.html
quelle
onAttach(Context)
Methode, ob die übergebene Hostaktivität die erforderliche Schnittstelle implementiert (Abrufen der Hostaktivität übercontext.getActivity()
).Was Sie tun, ist richtig.
Fragments
Sie haben keinen Zugriff auf dieActionBar
APIs, daher müssen Sie aufrufengetActivity
. SofernFragment
es sich nicht um eine statische innere Klasse handelt, sollten Sie in diesem Fall eineWeakReference
übergeordnete Klasse erstellen und Aktivität aufrufen.getActionBar
von dort.Um den Titel für Sie festzulegen, müssen Sie anrufen
ActionBar
, während Sie ein benutzerdefiniertes Layout verwenden .Fragment
getActivity().setTitle(YOUR_TITLE)
Der Grund, warum Sie anrufen,
setTitle
ist, dass SiegetTitle
als Titel Ihres Anrufs anrufenActionBar
.getTitle
gibt den Titel dafür zurückActivity
.Wenn Sie keinen Anruf erhalten möchten
getTitle
, müssen Sie eine öffentliche Methode erstellen, die den Text IhresTextView
in demActivity
Host festlegt, in dem sich das befindetFragment
.In Ihrer Aktivität :
In deinem Fragment :
Docs:
Activity.getTitle
Activity.setTitle
Außerdem müssen Sie nicht
this.whatever
den von Ihnen angegebenen Code eingeben , sondern nur einen Tipp.quelle
XML
und auch "dies" entfernt. Keine Veränderungen ... Und nein, es ist keinestatic
innere Klasse.ActionBar
von a festzulegenFragment
. Außerdem habe ich das Entfernen nichtthis.whatever
als Lösung für irgendetwas angeboten, das war nur ein Tipp zur Code-Formatierung.menu_act
) habe ich globales "mTitle" erstellt und in a Fragment, zuerst weise ich "mTitle" (( (menu_act) getActivity() ).mTitle = "new_title"
) einen Titel zu und sofort( (menu_act) getActivity() ).restoreActionBar();
. In "restoreActionBar ()" habe ich "actionBar.setTitle (mTitle);".Google-Beispiele verwenden dies in der Regel innerhalb der Fragmente.
Das Fragment gehört zu einer ActionBarActivity, und dort befindet sich der Verweis auf die Actionbar. Dies ist sauberer, da das Fragment nicht genau wissen muss, um welche Aktivität es sich handelt, sondern nur zu einer Aktivität gehören muss, die ActionBarActivity implementiert. Dies macht das Fragment flexibler und kann wie vorgesehen zu mehreren Aktivitäten hinzugefügt werden.
Jetzt müssen Sie im Fragment nur noch etwas tun.
Dies funktioniert gut, wenn Sie ein Basisfragment haben, von dem Ihre Fragmente anstelle der normalen Fragmentklasse erben.
Dann in deinem Fragment.
quelle
Das Einstellen
Activity
des Titels von einemFragment
bringt die Verantwortlichkeitsstufen durcheinander.Fragment
ist in einem enthaltenActivity
, also ist dies dasActivity
, das seinen eigenen Titel entsprechend dem Typ desFragment
zum Beispiel setzen sollte.Angenommen, Sie haben eine Schnittstelle:
Die
Fragment
s, die denActivity
Titel des ' beeinflussen können, implementieren dann diese Schnittstelle. Während der Hosting-Aktivität schreiben Sie:Auf diese Weise haben Sie
Activity
immer die Kontrolle darüber, welcher Titel verwendet werden soll, auch wenn mehrereTopLevelFragment
s kombiniert werden, was auf einem Tablet durchaus möglich ist.quelle
Ich denke nicht, dass die akzeptierte Antwort eine perfekte Antwort dafür ist. Da alle Aktivitäten, die verwenden
werden mit erweitert
können die darauf aufgerufenen Fragmente den unten genannten Code zum Ändern des Titels verwenden.
quelle
In dem Fragment, das wir so verwenden können, funktioniert es gut für mich.
quelle
Nur für den Fall, dass Sie Probleme mit dem Code haben, versuchen Sie,
getSupportActionBar().setTitle(title)
inonResume()
Ihr Fragment zu setzen, anstattonCreateView(...)
dhIn MainActivity.java :
Im Fragment:
quelle
((MainActivity) getActivity()).setTitle("title")
genügte jedoch. In Kotlin tut es mein Fragmentactivity!!.title = "title
.Verwenden Sie Folgendes:
quelle
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:
2) Wandeln Sie die Aktivität in onAttach des Fragments in den Schnittstellentyp um und rufen Sie die SetActivityTitle-Methode auf:
3) Implementieren Sie in der Aktivität die ActionBarTitleSetter- Schnittstelle:
quelle
Ein einfaches Kotlin-Beispiel
Angenommen, diese Gradle-Deps stimmen überein oder sind eine höhere Version in Ihrem Projekt:
Passen Sie dies an Ihre Fragmentklassen an:
quelle
Wenn Sie eine Hauptaktivität mit vielen Fragmenten haben, die Sie eingefügt haben, verwenden Sie normalerweise den navigationDrawer. Und Sie haben eine Reihe von Titeln für Ihre Fragmente. Wenn Sie zurück drücken, damit sie sich ändern, setzen Sie dies in die Hauptaktivität, die die Fragmente enthält
Dies setzt voraus, dass Sie ihm für jedes Fragment ein Tag geben, normalerweise irgendwo, wenn Sie die Fragmente entsprechend der in der Liste gedrückten Position zur Liste von navigationDrawer hinzufügen. Diese Position ist das, was ich auf dem Tag festhalte:
Jetzt laden Sie die navMenuTitles auf onCreate
Die Array-XML ist eine String-Ressource vom Typ Array in der Datei strings.xml
quelle
Speichern Sie Ihre Antwort im String [] -Objekt und setzen Sie sie in MainActivity auf OnTabChange () als Belowwww
quelle
Der Nachteil Ihres Ansatzes, so zu gießen
ist, dass Ihr Fragment außerhalb von MainActivityFragment nicht mehr wiederverwendbar ist. Wenn Sie nicht vorhaben, 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:
quelle
Wenn Sie die von Google bereitgestellte stabile Vorlage für Android Studio 1.4 verwenden, mussten Sie folgenden Code in die
onNavigationItemSelected
Methode schreiben, in der Ihr zugehöriges Fragment die if-Bedingung aufruft.quelle
Bestes Event für Titelwechsel
onCreateOptionsMenu
quelle
quelle
Um die ausgewählte Antwort zu ergänzen, möchten Sie möglicherweise auch eine zweite Methode zu Ihrer Hauptaktivität hinzufügen. Sie würden also in Ihrer Hauptaktivität die folgenden Methoden anwenden:
Auf diese Weise können Sie den Titel sowohl aus einer String-Variablen als auch aus einer Ressourcen-ID festlegen, z. B.
R.id.this_is_a_string
aus Ihrer Datei strings.xml. Dies funktioniert auch ein bisschen mehr wie esgetSupportActionBar().setTitle()
funktioniert, da Sie eine Ressourcen-ID übergeben können.quelle
Es gibt viele Möglichkeiten, wie oben beschrieben. Sie können dies auch
onNavigationDrawerSelected()
in Ihrem tunDrawerActivity
quelle
Zumindest für mich gab es eine einfache Antwort (nach langem Hin und Her) auf das Ändern eines Tab-Titels zur Laufzeit:
TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText ("Mein neuer Text");
quelle
Wenn Sie
ViewPager
(wie mein Fall) verwenden, können Sie verwenden:in
onPageSelected
Methode IhrerVIEW_PAGER.addOnPageChangeListener
quelle
In Ihrer Hauptaktivität unter
onCreate:
Und in Ihrer Fragmentaktivität unter
onResume
:Optional: - Wenn eine Warnung vor einer Nullreferenz angezeigt wird
quelle