Festlegen des benutzerdefinierten ActionBar-Titels aus dem Fragment

90

In meinem Main FragmentActivityrichte ich meinen benutzerdefinierten ActionBarTitel 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>
TheLettuceMaster
quelle
stackoverflow.com/a/28279341/1651286 sollte aufgrund seiner Skalierbarkeit die akzeptierte Antwort sein. Da bei allen anderen Ansätzen Fragmente an bestimmte Aktivitäten gebunden sind, was kein skalierbares Design ist, was auch, wenn dasselbe Fragment für mehrere Aktivitäten verwendet werden muss, empfiehlt dies auch das Android-Framework.
Akhil Dad
Schauen Sie diesen Link stackoverflow.com/a/46705242/1770868
Ahmad Aghazadeh

Antworten:

97

=== 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

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")
} }

Und MainModelView:

class MainViewModel : ViewModel() {
private val _title = MutableLiveData<String>()
val title: LiveData<String>
get() = _title
fun updateActionBarTitle(title: String) = _title.postValue(title) }

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:

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

Frank Nguyen
quelle
1
Es hat bei mir funktioniert! Ich habe stattdessen nur getActionBar (). SetTitle (title) in der Aktivität verwendet. Danke
happyreed76
1
Genau das, wonach ich gesucht habe, hat für mich besser funktioniert als die gewählte Antwort. Vielen Dank!
Dstrube
1
Dies sollte die akzeptierte Antwort sein! Es zeigt korrekt, wie es gemacht werden soll: Wenn ein Fragment mit seiner Hosting-Aktivität kommunizieren möchte, sollte die Kommunikation immer über eine Schnittstelle erfolgen. Das Fragment stellt die Schnittstelle bereit und die Aktivität implementiert sie! Wenn mehrere Fragmente auf dieselbe Weise mit einer Aktivität kommunizieren müssen, schreiben Sie ein abstraktes Fragment, das die Schnittstelle bereitstellt, und lassen Sie dann jedes Fragment von diesem "Basisfragment" erben.
Winklerrr
3
Übrigens: Die in dieser Antwort verwendete Methode onAttach (Aktivität) ist zu diesem Zeitpunkt veraltet. Überprüfen Sie innerhalb der onAttach(Context)Methode, ob die übergebene Hostaktivität die erforderliche Schnittstelle implementiert (Abrufen der Hostaktivität über context.getActivity()).
Winklerrr
1
Nach vielen Jahren habe ich dies in die akzeptierte Antwort geändert, da Schnittstellen bekanntlich die Art und Weise sind, wie Fragmente und Aktivitäten kommunizieren müssen.
TheLettuceMaster
148

Was Sie tun, ist richtig. FragmentsSie haben keinen Zugriff auf die ActionBarAPIs, daher müssen Sie aufrufen getActivity. Sofern Fragmentes sich nicht um eine statische innere Klasse handelt, sollten Sie in diesem Fall eine WeakReferenceübergeordnete Klasse erstellen und Aktivität aufrufen. getActionBarvon dort.

Um den Titel für Sie festzulegen, müssen Sie anrufen ActionBar, während Sie ein benutzerdefiniertes Layout verwenden .FragmentgetActivity().setTitle(YOUR_TITLE)

Der Grund, warum Sie anrufen, setTitleist, dass Sie getTitleals Titel Ihres Anrufs anrufen ActionBar. getTitlegibt den Titel dafür zurück Activity.

Wenn Sie keinen Anruf erhalten möchten getTitle, müssen Sie eine öffentliche Methode erstellen, die den Text Ihres TextViewin dem ActivityHost festlegt, in dem sich das befindet Fragment.

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:

Activity.getTitle

Activity.setTitle

Außerdem müssen Sie nicht this.whateverden von Ihnen angegebenen Code eingeben , sondern nur einen Tipp.

adneal
quelle
Ich versuche es und ich kann es nicht zum Laufen bringen. Für was es wert ist, habe ich meine gepostet XMLund auch "dies" entfernt. Keine Veränderungen ... Und nein, es ist keine staticinnere Klasse.
TheLettuceMaster
Warten Sie, was funktioniert nicht? In Ihrem OP erwähnen Sie nichts , was nicht funktioniert. Sie erwähnen nur, dass Sie die "richtige" Methode kennen möchten, um den Titel in der ActionBarvon a festzulegen Fragment. Außerdem habe ich das Entfernen nicht this.whateverals Lösung für irgendetwas angeboten, das war nur ein Tipp zur Code-Formatierung.
Adneal
Ich glaube, ich verstehe, womit Sie Probleme haben, und habe meine Antwort entsprechend bearbeitet.
Adneal
Thankx perfekte Antwort
Ammar ali
@KickingLettuce, ich kämpfe eine Weile mit dieser Antwort, bis ich sie zum Laufen gebracht habe (deshalb habe ich sie sowie Ihre Frage positiv bewertet): In meiner Hauptaktivität in der Navigationsleiste ( 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);".
Jose Manuel Abarca Rodríguez
29

Google-Beispiele verwenden dies in der Regel innerhalb der Fragmente.

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

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.

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");
    }
}
Kalel Wade
quelle
Vielen Dank. Sehr schöne Lösung. Auf diese Weise können Sie auch eine benutzerdefinierte Ansicht an Ihre Aktionsleiste übergeben.
Amir
Mit den neuesten Updates für Android SDK möchten Sie möglicherweise anstelle von ActionBarActivity auf AppCompatActivity downcasten, falls Sie die Abwärtskompatibilitätsbibliothek der Version 7 verwenden (was Sie wahrscheinlich sollten).
fr4gus
8

Das Einstellen Activitydes Titels von einem Fragmentbringt die Verantwortlichkeitsstufen durcheinander. Fragmentist in einem enthalten Activity, also ist dies das Activity, das seinen eigenen Titel entsprechend dem Typ des Fragmentzum Beispiel setzen sollte.

Angenommen, Sie haben eine Schnittstelle:

interface TopLevelFragment
{
    String getTitle();
}

Die Fragments, die den ActivityTitel des ' beeinflussen können, implementieren dann 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 haben Sie Activityimmer die Kontrolle darüber, welcher Titel verwendet werden soll, auch wenn mehrere TopLevelFragments kombiniert werden, was auf einem Tablet durchaus möglich ist.

Aleks N.
quelle
6

Ich denke nicht, dass die akzeptierte Antwort eine perfekte Antwort dafür ist. Da alle Aktivitäten, die verwenden

Symbolleiste

werden mit erweitert

AppCompatActivity

können die darauf aufgerufenen Fragmente den unten genannten Code zum Ändern des Titels verwenden.

((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");
Manoj Perumarath
quelle
5

In dem Fragment, das wir so verwenden können, funktioniert es gut für mich.

getActivity().getActionBar().setTitle("YOUR TITLE");
NagarjunaReddy
quelle
Dies funktioniert nicht, wenn die Symbolleiste unserer Aktivität eine Textansicht hat, die die Rolle des Titels hat
Simon
4

Nur für den Fall, dass Sie Probleme mit dem Code haben, versuchen Sie, getSupportActionBar().setTitle(title)in onResume()Ihr Fragment zu setzen, anstatt onCreateView(...)dh

In MainActivity.java :

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

Im Fragment:

 @Override
 public void onResume(){
     super.onResume();
     ((MainActivity) getActivity()).setActionBarTitle("Your Title");
 }
Realpac
quelle
Dies war mein Problem - wo ich den Titel festlegte. Es ((MainActivity) getActivity()).setTitle("title")genügte jedoch. In Kotlin tut es mein Fragment activity!!.title = "title.
Joe Lapp
2

Verwenden Sie Folgendes:

getActivity().setTitle("YOUR_TITLE");
Anisetti Nagendra
quelle
Diese Antwort dient zum Ändern des Titels der Aktivität. Die Frage bezieht sich stattdessen auf den Titel der Aktionsleiste.
David d C e Freitas
Danke @Anisetti! Genau das habe ich in der Fragment-Klasse gemacht.
Francis Rodrigues
2

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) Wandeln Sie die Aktivität in onAttach des Fragments in den Schnittstellentyp um 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 ActionBarTitleSetter- Schnittstelle:

@Override 
public void setTitle(String title) { 
    mTitle = title; 
}
Assaf S.
quelle
Dies sollte die akzeptierte Antwort sein, da alle anderen Ansätze Fragmente an bestimmte Aktivitäten binden, was kein skalierbares Design ist. Dies empfiehlt auch das Android-Framework
Akhil Dad
2

Ein einfaches Kotlin-Beispiel

Angenommen, diese Gradle-Deps stimmen überein oder sind eine höhere Version in Ihrem Projekt:

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!"
    }


    }
lasec0203
quelle
1

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

@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 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:

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

Jetzt laden Sie die navMenuTitles auf onCreate

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

Die Array-XML ist eine String-Ressource vom Typ Array in der Datei strings.xml

 <!-- Nav Drawer Menu Items -->
    <string-array name="nav_drawer_items">
        <item>Title one</item>
        <item>Title Two</item>
    </string-array>
Miguel
quelle
1

Speichern Sie Ihre Antwort im String [] -Objekt und setzen Sie sie 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));
}
Narendra Kumar
quelle
1

Der Nachteil Ihres Ansatzes, so zu gießen

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

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:

if (getActivity() instanceof ActionBarActivity) {
    ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Some Title");
}
Mieczysław Daniel Dyba
quelle
1

Wenn Sie die von Google bereitgestellte stabile Vorlage für Android Studio 1.4 verwenden, mussten Sie folgenden Code in die onNavigationItemSelectedMethode schreiben, in der Ihr zugehöriges Fragment die if-Bedingung aufruft.

 setTitle("YOUR FRAGMENT TITLE");
Manan Patel
quelle
Das ist wunderbar, wenn Sie direkt von der Aktivität aus auf den Titel zugreifen können ... aber wenn der Titel eine dynamisch festgelegte Zeichenfolge im Fragment ist, muss eine Kommunikation zwischen dem Fragment und der Aktivität stattfinden
me_
1

Bestes Event für Titelwechsel 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);
}
Ahmad Aghazadeh
quelle
1

Ich bekomme eine sehr einfache Lösung, um den ActionBar-Titel entweder in Fragmenten oder in Aktivitäten ohne Kopfschmerzen festzulegen.

Ändern Sie einfach die XML-Datei, in der die Symbolleiste definiert ist, wie folgt:

<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 einem Fragment festlegen möchten, gehen Sie wie folgt vor:

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

Für die Verwendung von überall können Sie eine Methode in der Aktivität definieren

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

Um diese Methode in Aktivität 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");
JoboFive
quelle
Ausgezeichnet! Die Verwendung von toolbar_title überschreibt den Fragmenttitel, wenn Android-Navigationskomponenten verwendet werden.
Paixols
0

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:

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

public void setActionBarTitle(int resourceId) {
    setActionBarTitle(getResources().getString(resourceId);
}

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_stringaus Ihrer Datei strings.xml. Dies funktioniert auch ein bisschen mehr wie es getSupportActionBar().setTitle()funktioniert, da Sie eine Ressourcen-ID übergeben können.

CodyEngel
quelle
0

Es gibt viele Möglichkeiten, wie oben beschrieben. Sie können dies auch onNavigationDrawerSelected()in Ihrem tunDrawerActivity

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);
    }
}
Tricknologie
quelle
0

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

Kennzeichen
quelle
0

Wenn Sie ViewPager(wie mein Fall) verwenden, können Sie verwenden:

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

in onPageSelectedMethode IhrerVIEW_PAGER.addOnPageChangeListener

Reza
quelle
0

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 eine Warnung vor einer Nullreferenz angezeigt wird

Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);


Objects.requireNonNull(getActivity()).setTitle(R.string.app_name_science);
Amit Singh
quelle