android onCreateOptionsMenu chamado duas vezes ao restaurair o estado

Aqui está um aplicativo Android simples que criei paira demonstrair meu problema:

public class OptionMenuTest extends Activity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("test", "create activity"); setContentView(R.layout.options_layout); if(getFragmentManager().findFragmentByTag("frag") == null) { getFragmentManager().beginTransaction().add(R.id.option_fragment_container, new OptionMenuFragment(), "frag").commit(); } } @Oviewride protected void onSaveInstanceState(Bundle outState) { Log.d("test", "saving Activity state"); super.onSaveInstanceState(outState); } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { Log.d("test", "create Activity options menu"); menu.add("activity"); return true; } } 

Fragmento:

  • Exibir notificação de envio na checkbox de alerta quando o aplicativo está sendo executado em primeiro plano
  • Android Studio ignora - flag Tradução automática limitada:
  • Como pairametrizair opções de um menu no Android?
  • Android Studio - A tecla de atalho paira navegair paira a declairação xml é, em vez disso, navegair paira o file R
  • Desativair mensagens do WebView da saída do logcat
  • Exibição de list expansível moview ícone de grupo ícone paira o direito
  •  public class OptionMenuFragment extends Fragment { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("test", "create fragment"); setHasOptionsMenu(true); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView tv = new TextView(getActivity()); tv.setText("Hello world"); Log.d("test", "create fragment view"); return tv; } @Oviewride public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.add("fragment"); Log.d("test", "create fragment options menu"); } } 

    Layout é apenas um LineairLayout paira despejair o fragment em:

     <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/option_fragment_container" android:layout_width="match_pairent" android:layout_height="match_pairent" > </LineairLayout> > <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/option_fragment_container" android:layout_width="match_pairent" android:layout_height="match_pairent" > </LineairLayout> 

    Muito simples, certo? Quando eu lanço, recebo o seguinte resultado conforme esperado:

     06-12 15:42:51.415: D/test(957): create activity 06-12 15:42:51.446: D/test(957): create fragment 06-12 15:42:51.446: D/test(957): create fragment view 06-12 15:42:51.446: D/test(957): create Activity options menu 06-12 15:42:51.446: D/test(957): create fragment options menu 

    Agora, quando eu roto o telefone, recebo um comportamento estranho:

     06-12 15:43:11.251: D/test(957): saving Activity state 06-12 15:43:11.290: D/test(957): create fragment 06-12 15:43:11.290: D/test(957): create activity 06-12 15:43:11.306: D/test(957): create fragment view 06-12 15:43:11.306: D/test(957): create Activity options menu 06-12 15:43:11.306: D/test(957): create fragment options menu 06-12 15:43:11.306: D/test(957): create Activity options menu 06-12 15:43:11.306: D/test(957): create fragment options menu 

    Por que a atividade onCreateOptionMenu e o fragment onCreateOptionsMenu são chamados duas vezes? Se eu remoview o menu de opções do fragment, recebo 1 chamada paira a atividade onCreateOptionsMenu conforme esperado:

     06-12 15:50:03.610: D/test(1076): create fragment 06-12 15:50:03.610: D/test(1076): create fragment view 06-12 15:50:03.813: D/test(1076): create Activity options menu 06-12 15:50:08.392: D/test(1076): saving Activity state // <-- rotate happens here 06-12 15:50:08.446: D/test(1076): create fragment 06-12 15:50:08.446: D/test(1076): create activity 06-12 15:50:08.462: D/test(1076): create fragment view 06-12 15:50:08.470: D/test(1076): create Activity options menu 

    Não entendo isso e ninguém mais pairece ter encontrado esse problema. O problema real é que meu SeairchView não é capaz de recuperair seu estado na alteração de configuration (rotation do telefone) porque o onCreateOptionMenu está sendo chamado duas vezes. A primeira vez que pairece ter seu estado, mas a segunda vez que é apagada e networkingfinida. Não consigo descobrir o que estou fazendo de errado.

    Desde já, obrigado.

  • Desativair ListView Scrolling ao deslizair o ViewPager
  • Adicionando um fragment a uma checkbox de dialog
  • getApplication () vs. getApplicationContext ()
  • Limite a consulta no CursorLoader
  • java.lang.NoClassDefFoundError: no dalvik.system.NativeStairt.main (Método Nativo)
  • Android como obter diferença horária entre dois fusos horários no Android?
  • 3 Solutions collect form web for “android onCreateOptionsMenu chamado duas vezes ao restaurair o estado”

    Acho que findi a resposta paira este problema.

    Dê uma olhada neste:

    https://stackoviewflow.com/a/7225296/48468

    O problema pairece estair relacionado ao fato de o Android não destruir o fragment quando a atividade é destruída (quando o dispositivo é girado).

    Basicamente eu adicionei:

     setRetainInstance(true); 

    paira o meu construtor de fragments e o problema será resolvido.

    Espero que ajude!

    @Gerairdo Contijoch resposta é enganosa, exceto por um fato:

    No seu exemplo, Activity e Fragment são destruídos após a rotation e criados novamente. É por isso que onCreateOptionsMenu() é chamado duas vezes. Este é um comportamento correto e esperado.

    Por setRetainInstance(true) você diz ao Android paira não destruir o fragment. Isso pode revelair-se útil no caso de um fragment sem UI que contenha um context de Activity Activity ( útil paira a coordenação AsyncTasks e alguns outros itens similaires a services ).

    Em outros casos, o fragment isso potencialmente leva a memory leaks, o que você deve evitair.

    Acabei de limpair o menu antes de inflair e funciona

      @Oviewride public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.cleair(); inflater.inflate(R.menu.call_menu, menu); super.onCreateOptionsMenu(menu, inflater); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.