it-swarm.com.de

Festlegen des benutzerdefinierten ActionBar-Titels aus Fragment

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>
74
KickingLettuce

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

64
Frank Nguyen

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 FragmentgetActivity().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:

Activity.getTitle

Activity.setTitle

Außerdem müssen Sie in dem von Ihnen angegebenen Code nicht this.whatever aufrufen, sondern lediglich einen Tipp.

146
adneal

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");
    }
}
25
Kalel Wade

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 Fragments, 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 TopLevelFragments kombiniert werden, was auf einem Tablet durchaus möglich ist.

7
Aleks N.

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

getActivity().getActionBar().setTitle("YOUR TITLE");
5
NagarjunaReddy

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");
 }
3
realpac

Verwenden Sie folgendes:

getActivity().setTitle("YOUR_TITLE");
2

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

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));
}
1
Narendra Kumar

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>
1
Miguel

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; 
}
1
Assaf S.

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");
1
Manan Patel

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

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

0
Mark

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);
0
Amit Singh

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

0
Reza

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);
}
0
Ahmad Aghazadeh

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


    }
0
lasec0203

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.

0
CodyEngel

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