2015-10-13 19 views
6

私は私の活動でこのコードがあります:onResume()ツールバー(SupportActionBar)タイトルの変更は、姿勢変化に名をアプリケーションに

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

私はこのような種々の断片からアクションバーのタイトルを更新しています:

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

これはうまくいきますが、向きが変更された後、タイトルが再びアプリ名に変わります。どのように私はこれを克服できますか?

EDIT:

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

そして、ここでは、ログです::

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 
私は断片的にタイトルを設定して、このコードを 追加: は、より多くを調査した後、私はこれを試してみましたが、この奇妙な行動を発見しました

ログごとに変更されていましたが、UIには反映されませんでした。 私を助けてください!

答えて

9

オーケーを、最終的には、2を過ごした後、この愚かなことの日、私は解決策を得た(私は回避策を言うだろう)。

おそらくネストされたFragmentのバグです。

私はフラグメント構造をネストしています。我々が知っているようにFragment.getActivity()は親Activityを返します。私は多くのデバッグの後に、をオリエンテーションの変更後(Fragment.onActivityCreated()の中でも)呼び出すと、新しく作成されたActivityを正しく返す最上位の親フラグメント以外の古いActivityの参照を返します。

だから私はどのFragmentから現在Activityを取得するには、このメソッドを書いている:

/** 
* 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

私はうまくやったと言うか、感謝しなければならないのか分からない。これはすべてのAndroid開発者にとって良い教訓です。 Googleは未完成のAndroidバージョンをリリースするだけでなく、これらのバグを真剣に受け止めなければなりません。 – Sufian

+0

問題を実際に解決するので、これを答えとしてマークしてください。 – Sufian

+1

@Sufianありがとう:)私は確かに問題を適切に文書化する時間があるときに、Androidのバグレポートでこれを提出するつもりです。 –

1

あなたは、画面を回転させるとアクティビティが再作成されています。だからonCreateはもう一度呼び出されていますが、そこにタイトルを設定していません。

あなたのonCreateに以下を追加します。

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

彼はフラグメントの 'onResume()'にタイトルを設定しています。これはおそらくうまくいかないでしょう。 – Sufian

+0

ええ、Fragmentの 'onResume()'がActivityの 'onCreate()'の後に呼び出されます。 –

+0

いくつかのブレークポイントを追加してデバッグして、回転後にアプリがどのステップを通過するかを確認します。次に、あなたのonResume()が呼び出されているか、あなたのアクションバーのタイトルを変更するために何が呼び出されているかを知ることができます。 –

0

は、(マニフェストファイルにonConfigChangeで

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

または のコードを追加します)

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

Android [documentation](http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange)では、「このテクニックは、設定のために再起動を避けなければならない場合、最後の手段と考えるべきですほとんどのアプリケーションでは推奨されていません。 これは適切な解決策ではなく、むしろハックな方法だと思います。 –

+0

この設定変更はあまりにも頻繁に推奨され、決して解決策ではありません。回転後に正確に同じレイアウトを残しておきたい場合を除き、これを使用しないでください。 –

0

多分あなたはあなたの活動であなたのアクションバー/ツールバー、onPostCreateで()メソッドを変更することができます。.. コードされます単純な。あなたがここにsorianivによる答弁書を参照してくださいする必要があり

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

..私は何度も私のエミュレータ/デバイスの向きを変更しようと、それは魔法のように動作します: In android app Toolbar.setTitle method has no effect – application name is shown as title

追加toolbar.setTitle("")は、この問題を解決追加します私のために。

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

あなたが言いました質問は少し異なります。 'Fragment'の中で' getActivity() 'を呼び出すとAndroidが古い' Activity'を返すので、私が投稿した問題に直面しています(オリエンテーションの変更などによってアクティビティが再作成されます)。それで私の解決策。 –

+0

あなたのソリューションは間違いなく完全ですが、私はあなたが持っていた正確な症状を解決するので、あなたのツールバーが回転後にアプリ名に戻っていたので、このリンクを渡しました。これは私の問題を解決しました。間違ったアクティビティが返されたためにそれ以上の問題が発生した場合、私はあなたのソリューションを実装します。 –

+0

これは私にとっても同様の問題を解決しました。 'AsyncTask'の' onPostExecute() 'の中で' setTitle() 'を呼び出していました。あなたは 'getSupportActionBar()。setTitle(" ... ");でタイトルをさらに変更できるように' onCreate() 'で' setTitle( "") – xAF

0

私はちょうど同じ問題に走った、と私はgetSupportActionBar代わりのtoolbarを使用して、それを解決しました。

getSupportActionBar().setTitle("..."); 
関連する問題