2015-10-13 14 views
6

Ich habe diesen Code in meiner Aktivität:Toolbar (SupportActionBar) Titel ändert Namen auf Orientierungsänderung App

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
    ... 
} 

ich die ActionBar Titel aus verschiedenen Fragmenten wie dies in onResume() Aktualisierung:

ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); 
if (actionBar != null) { 
    actionBar.setTitle(title); 
} 

Das funktioniert gut, aber nach der Änderung der Ausrichtung ändert sich der Titel wieder in den Namen der App. Wie kann ich das überwinden?

EDIT: Nach mehr zu untersuchen, habe ich versucht, diese und fand dieses seltsame Verhalten: Added diesen Code, wo ich Titel in Fragmenten einstellen:

final ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar(); 
if (actionBar != null) { 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Log.d("SWAPNIL", "IN RUN BEFORE: " + actionBar.getTitle()); 
      actionBar.setTitle(title); 
      Log.d("SWAPNIL", "IN RUN AFTER : " + actionBar.getTitle()); 
     } 
    }, 3000); 
} 

Und hier ist das Protokoll:

10-13 10:27:04.526 3719-3719/com.example.xxxx D/SWAPNIL: onResumeHelp 
10-13 10:27:07.528 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN BEFORE: MY APP NAME 
10-13 10:27:07.528 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN AFTER : title 
10-13 10:27:21.012 3719-3719/com.example.xxxx D/SWAPNIL: onResumeHelp 
10-13 10:27:24.013 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN BEFORE: title 
10-13 10:27:24.013 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN AFTER : title 

Es wurde geändert wie in den Protokollen, wurde jedoch nicht in der Benutzeroberfläche angezeigt. Bitte helfen Sie mir!

Antwort

9

Okay, endlich, nach zwei Ausgaben Tage an diesem albernen Ding, habe ich die Lösung (ich würde sagen Abhilfe).

Dies ist wahrscheinlich ein verschachtelter Fragment Bug.

Ich habe Fragmentstruktur verschachtelt. Wie wir wissen Fragment.getActivity() gibt Eltern Activity zurück. Nach viel Debugging habe ich beobachtet, dass, wenn Sie getActivity() nach der Änderung der Ausrichtung aufrufen (sogar innerhalb Fragment.onActivityCreated()) gibt es Referenz der alten Activity mit Ausnahme in den obersten Elternteil Fragment, wo es die neu erstellte Activity korrekt zurückgibt.

Also habe ich diese Methode geschrieben Strom erhalten Activity von jeder Fragment:

/** 
* When inside a nested fragment and Activity gets recreated due to reasons like orientation 
* change, {@link android.support.v4.app.Fragment#getActivity()} returns old Activity but the top 
* level parent fragment's {@link android.support.v4.app.Fragment#getActivity()} returns current, 
* recreated Activity. Hence use this method in nested fragments instead of 
* android.support.v4.app.Fragment#getActivity() 
* 
* @param fragment 
* The current nested Fragment 
* 
* @return current Activity that fragment is hosted in 
*/ 
public Activity getActivity(Fragment fragment) { 
    if (fragment == null) { 
     return null; 
    } 
    while (fragment.getParentFragment() != null) { 
     fragment = fragment.getParentFragment(); 
    } 
    return fragment.getActivity(); 
} 
+2

Unsicher, ob ich gut gemacht oder danke sagen sollte. Dies ist eine gute Lektion für jeden Android-Entwickler. Google sollte diese Bugs ernst nehmen, anstatt nur unfertige Android-Versionen zu veröffentlichen. – Sufian

+0

Markieren Sie dies als Antwort, da es das Problem tatsächlich löst. – Sufian

+1

@Sufian danke :) Ich werde dies sicherlich auf Android Bug Reporting ablegen, wenn ich etwas Zeit habe, das Problem richtig zu dokumentieren. –

1

Ihre Aktivität wird neu erstellt, wenn Sie den Bildschirm drehen. OnCreate wird also erneut aufgerufen, und Sie haben dort keinen Titel festgelegt.

Fügen Sie folgendes zu Ihrem onCreate:

actionBar.setTile("Enter title here") 
+0

Er setzt den Titel in 'onResume()' von Fragmenten. Dies wird höchstwahrscheinlich nicht funktionieren. – Sufian

+0

Yeah, Fragments 'onResume()' wird nach 'onCreate() 'der Aktivität' ' –

+0

aufgerufen. Fügen Sie einige Breakpoints hinzu und debuggen Sie durch und sehen Sie, welche Schritte Ihre App nach der Rotation durchläuft. Dann werden Sie wissen, ob Ihr onResume() aufgerufen wird und was aufgerufen wird, um Ihren Actionbar-Titel –

0

in Manifest-Datei hinzufügen

<activity 
    android:name=".Activity" 
    android:configChanges="orientation|screenSize|keyboardHidden"/> 

oder Code in onConfigChange()

if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ 
    // Set Title for Landscape 
}else{ 
    // Set Title for Portrait 
+3

Android [Dokumentation] (http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange) sagt: "Diese Technik sollte als letztes Mittel betrachtet werden, wenn Sie Neustarts aufgrund einer Konfiguration vermeiden müssen ändern und wird nicht für die meisten Anwendungen empfohlen. " Ich denke, das ist keine richtige Lösung, eher ein hacky Weg. –

+0

Diese Konfigurationsänderung wird viel zu oft empfohlen und ist nie die Lösung. Wenn Sie nicht möchten, dass das gleiche Layout nach dem Drehen erhalten bleibt, verwenden Sie dieses nicht. –

0

vielleicht können Sie Ihre Aktionsleiste/Symbolleiste ändern, in onPostCreate() -Methode in Ihrer Aktivität .. Der Code ist nur einfach. Ich versuche, meine Emulator/Geräteausrichtung für viele Male zu ändern und es funktioniert wie Charme ..

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onPostCreate(savedInstanceState); 
    toolbar.setTitle(mTitle); 
} 
2

Sie müssen von sorianiv hier die Antwort geschrieben, um zu sehen: In android app Toolbar.setTitle method has no effect – application name is shown as title

die zusätzliche toolbar.setTitle("") dieses Problem behoben Hinzufügen für mich.

Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar); 
    toolbar.setTitle(""); 
     ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar); 
    toolbar.setTitle("Profiles"); 
+0

die Frage, die Sie erwähnten, ist etwas anders. Ich stehe vor dem Problem, das ich gepostet habe, weil Android mir die alte "Aktivität" zurückgibt, wenn ich "getActivity()" in einem "Fragment" (alte Aktivität in dem Sinn, dass Aktivität aufgrund von Orientierungsänderung usw. neu erstellt wird) aufruft. Und daher meine Lösung. –

+0

Ihre Lösung ist definitiv vollständiger, aber ich habe Ihnen diesen Link übergeben, da sie das genaue Symptom löst, das Sie hatten, dass Ihre Symbolleiste nach dem Drehen wieder zum App-Namen wurde. Das hat das Problem für mich gelöst. Wenn aufgrund der falschen Aktivität weitere Probleme auftreten, werde ich Ihre Lösung implementieren. –

+0

Das löste ein ähnliches Problem für mich. Ich rief 'setTitle()' innerhalb der 'onPostExecute()' von 'AsyncTask' auf.Es scheint, als müssten Sie nur 'setTitle (" ")' in 'onCreate()' aufrufen, um den Titel mit 'getSupportActionBar() weiter zu ändern. SetTitle (" ... ");' – xAF

0

Ich lief in das gleiche Problem, und ich löste es durch getSupportActionBar statt toolbar verwenden.

getSupportActionBar().setTitle("..."); 
Verwandte Themen