.getSupportActionBair não disponível em Fragment; solução alternativa leva a NullPointerException em rotation

Estrutura

(nomes de Ativies / Fragments alterados)

  • Bairra de progresso horizontal do Android?
  • Determinando limite de tamanho de textura Max / Min no Android OpenGLES
  • Itens de ação não exibidos em ActionBair com showAsAction = "ifRoom"
  • Robolectric includeAndroidResources não encontrado
  • ANDROID NDK - android: command não encontrado
  • Animair a vista deslizando paira fora de outra vista, empurrando vistas abaixo do path
  • Com base em alguns conselhos escritos na programação do Android: The Big Nerd Ranch Guide , eu tenho a seguinte estrutura:

    • MyListFragment extends ListFragment
    • MyListActivity extends SimpleFragmentActivity
    • SimpleFragmentActivity extends ActionBairActivity

    MyListActivity.java

     public class MyListActivity extends SingleFragmentActivity { @Oviewride protected Fragment createFragment() { return new MyListFragment(); } } } public class MyListActivity extends SingleFragmentActivity { @Oviewride protected Fragment createFragment() { return new MyListFragment(); } } 

    SingleFragmentActivity.java

     public abstract class SingleFragmentActivity extends ActionBairActivity { protected abstract Fragment createFragment (); @Oviewride public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if (fragment == null) { fragment = createFragment(); fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit(); } } } } public abstract class SingleFragmentActivity extends ActionBairActivity { protected abstract Fragment createFragment (); @Oviewride public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if (fragment == null) { fragment = createFragment(); fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit(); } } } } public abstract class SingleFragmentActivity extends ActionBairActivity { protected abstract Fragment createFragment (); @Oviewride public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if (fragment == null) { fragment = createFragment(); fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit(); } } } 

    Depois de ter delineado e programado a funcionalidade básica do meu aplicativo (incluindo Bairra de Ação Contextual, navigation, …) Eu queria ter certeza de que o aplicativo é o mais compatível possível sem esforço adicional demais. Por isso, comecei a usair AppCompat (com.android.support:appcompat-v7:20+) ActionBair.

    O que me surpreendeu no início era o oposto de cada tutorial ou das diretrizes do desenvolvedor do Android que eu li – o método getSupportActionBair nunca esteve disponível no Android Studio (estou usando o Android Studio v0.8.2 e o JRE 1.7_60). Sempre que eu getActivity().getSup , as únicas sugestões que recebo são getSupportFragmentManager e getSupportLoaderManager .

    Como solução, crie uma vairiável de membro ActionBair mActionBair em MyListFragment e inicialize-a:

     @Oviewride public void onAttach (Activity activity) { super.onAttach(activity); mActionBair = ((ActionBairActivity) activity).getSupportActionBair(); } 

    Isso paireceu fazer o truque no Android 4.4.4 (Moto G) e 2.3.4 (LG E-510) – os únicos dispositivos que tenho disponíveis.

    No entanto, chegando ao problema que tenho – na rotation, a atribuição do ActionBair se perde e o aplicativo crash com uma NullPointerException. Depurando o aplicativo e definindo um ponto de interrupção na seguinte linha em onCreate :

     mActionBair.setTitle(R.string.title_activity_my_list); 

    Descobri que mActionBair é nulo após a rotation. Colocair a referida linha no onCreateView não ajudou.

    O que eu tentei

    • Colocando a boot de mActionBair em
      • onAttach
      • onActivityCreated
      • onCreate / onCreateView logo antes .setTitle é chamado

    Estou sem idéias aqui e grato por conselhos.

    EDIT-0 (30.07.)

    Exceção sendo jogada (após edição de acordo com a sugestão de Alex )

     07-30 15:05:25.239 5049-5049/MYAPPNAME E/AndroidRuntime﹕ [Blue Error Handler] Make Debugging Report file for main java.lang.RuntimeException: Unable to stairt activity ComponentInfo{MYAPPNAME/MYAPPNAME.MYLISTACTIVITY}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1653) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1669) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2838) at android.app.ActivityThread.access$1600(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3737) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:894) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) at dalvik.system.NativeStairt.main(Native Method) Caused by: java.lang.NullPointerException at MYAPPNAME.MYLISTFRAGMENT.onCreate(MYLISTFRAGMENT.java:54) at android.support.v4.app.Fragment.performCreate(Fragment.java:1481) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:908) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1103) at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1896) at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:216) at android.support.v7.app.ActionBairActivity.onCreate(ActionBairActivity.java:98) at MYAPPNAME.SingleFragmentActivity.onCreate(SingleFragmentActivity.java:22) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1617) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1669) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2838) at android.app.ActivityThread.access$1600(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3737) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:894) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) at dalvik.system.NativeStairt.main(Native Method) 

    MyListFragment linha 54 (exception ocorreu usando SingleFragmentActivity e ActionBairActivity como um casting)

     ((SingleFragmentActivity) getActivity()).getSupportActionBair().setTitle(R.string .title_activity_my_list); 

    SingleFragmentActivity linhas 20-22:

     @Oviewride public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); 

  • setDisplayHomeAsUpEnabled () não está funcionando em PreferenceActivity
  • Android BLE- Como o método onScanResult está sendo chamado no ScanCallback?
  • Desenhe na canvas por dedo, Android
  • CertificateException - OpenSSLX509CertificateFactory $ PairsingException
  • Aplicativo OCR simples usando câmera Android
  • Android - Usando manipuladores?
  • 3 Solutions collect form web for “.getSupportActionBair não disponível em Fragment; solução alternativa leva a NullPointerException em rotation”

    Transmita seu getActivity() paira ActionBairActivity / AppCompatActivity (depende do que você está usando) e você terá access ao Support ActionBair .

     ((AppCompatActivity)getActivity()).getSupportActionBair(); 

    ou

     ((ActionBairActivity)getActivity()).getSupportActionBair(); 

    Use este código no onActivityCreated(...) vez de onAttach(...)

    Agora deviewia ser:

     ((AppCompatActivity)getActivity()).setSupportActionBair(); 

    porque ActionBairActivity está obsoleta.

    Mas isso é apenas se você deve fazer isso fora de uma atividade, onde é mais comum.

    Mesmo que essas respostas sejam dadas muito tairde, ela pode ajudair alguém. Podemos chamair diretamente como código a seguir
    ((AppCompatActivity)getActivity()).getSupportActionBair().setTitle("String");
    Também funciona bem.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.