J'essaie d'utiliser la bibliothèque ActionBarSherlock pour fournir un support ActionBar compatible avec les versions antérieures avec des onglets dans mon application Android. J'ai donc téléchargé la dernière version, construit la démo et exécuté.
Si vous allez dans la barre d’action, puis sélectionnez Navigation par tabulation, il se bloque à chaque fois. Voici la trace de la pile:
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): FATAL EXCEPTION: main
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.actionbarsherlock.sample.demos/com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation}: Java.lang.NullPointerException
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1748)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1764)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.access$1500(ActivityThread.Java:122)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1002)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.os.Looper.loop(Looper.Java:132)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.main(ActivityThread.Java:4025)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Java.lang.reflect.Method.invokeNative(Native Method)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Java.lang.reflect.Method.invoke(Method.Java:491)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:841)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:599)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at dalvik.system.NativeStart.main(Native Method)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): Caused by: Java.lang.NullPointerException
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation.onCreate(ActionBarTabNavigation.Java:19)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1048)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1712)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): ... 11 more
Je ne peux pas avancer avec mon application tant que cela n'est pas corrigé. J'ai écrit un tas de code, configuré la barre d'actions dans mon application et essayé de l'exécuter. Un blocage avec un NPE s'est bloqué en raison de la valeur de retour NULL de l'appel getSupportActionBar()
.
Le code correspondant est actuellement dans la démo de la bibliothèque:
public class ActionBarTabNavigation extends FragmentActivity implements ActionBar.TabListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager()
.beginTransaction()
.add(Android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(0))
.commit();
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (int i = 0; i < 3; i++) {
ActionBar.Tab tab = getSupportActionBar().newTab();
tab.setText("Tab " + i);
tab.setTabListener(this);
getSupportActionBar().addTab(tab);
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
getSupportFragmentManager()
.beginTransaction()
.replace(Android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(tab.getPosition()))
.commit();
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
}
Vous devriez ajouter le thème Sherlock à votre application.
<application Android:icon="@drawable/icon" Android:label="@string/app_name"
Android:debuggable="false" Android:theme="@style/Theme.Sherlock">
J'ai eu le même problème sur le Android ICS 4.0.4. J'utilisais requestWindowFeature(Window.FEATURE_NO_TITLE);
sur FragmentActivity, mais cela masquait l'ActionBar sur les périphériques ICS + qui rendait la getSupportActionBar()
nulle.
Il suffit de retirer le:requestWindowFeature(Window.FEATURE_NO_TITLE);
Et ça a fonctionné comme un charme.
J'espère que ça aide quelqu'un.
Une autre raison pour laquelle cela se produit sur les appareils Honeycomb + est que l'attribut windowNoTitle
est défini dans votre style. Débarrassez-vous de cela, car ActionBarSherlock le supprimera automatiquement dans les appareils pré-Honeycomb.
Une autre raison pour laquelle vous pourriez obtenir null de getSupportActionBar()
tente de l'appeler avant setContentView(R.layout.main)
ou d'ajouter un fragment dans votre exemple.
J'ai refactored oncreate et mis par erreur getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
après super.onCreate(savedInstanceState);
Voici un titre amusant: Ne définissez pas le thème -
Android:theme="@style/Theme.NoActionbar"
Une autre raison pour laquelle vous pourriez obtenir null de getSupportActionBar()
est lorsque l'activité est utilisée dans un TabHost sur Honeycomb +.
Selon la façon dont vous écrivez le code. assurez-vous d’avoir défini la barre d’outils avant de l’appeler.
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
Je viens de changer dans Manifest
Android:theme="@style/AppTheme.NoActionBar"
à:
Android:theme="@style/AppTheme"
et l'erreur est partie
vous êtes déclaré Thème.Sherlock ou Thème.Sherlock.Light en tant que votre thème d'activité ou dans le manifeste. Ou en utilisant un thème personnalisé qui hérite du
Exemple:-
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/Theme.Sherlock.Light" >
aussi vous pouvez utiliser le thème sombre: -
Android:theme="@style/Theme.Sherlock"
chaque fois que nous définissons customview en utilisant la bibliothèque sherlock. il suffit de supprimer cette requestWindowFeature (Window.FEATURE_NO_TITLE); comme cela nous faisons customview en utilisant la bibliothèque sherlock.
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.header_sherlock_xmllayout);
header_tvleft = (TextView) findViewById(R.id.header_tvleft);
header_tvleft.setText("Back");
J'ai eu ce problème après (stupidement) avoir oublié d'appeler le super.onCreate()
Je me suis heurté à cela après avoir ajouté une bibliothèque à mon projet. Le remède consistait à rechercher dans la bibliothèque et à supprimer tout nom de style "AppTheme" si vous utilisez ce même nom de thème dans votre manifeste. Il n'y avait pas de conflit sur mon Galaxy S4, Jelly Bean, alors qu'il y avait un conflit sur mon Galaxy Tab.
J'ai ajouté Android:theme="@Android:style/Theme.Dialog"
à mon activité dans le fichier manifeste d'Android pour tenter d'en faire une activité de dialogue. Cela aussi supprimera la barre d'action d'où un pointeur nul. Supprimez-le ou n'appelez pas getSupportActioBar
Je fais cette erreur parce que j'ajoute la toobar dans le fichier fragment xml. Le code pour trouver la barre d’outils dans fragment est la suivante: getActivity (). FindViewByid (id ...), mais ma barre d’outils est dans le fichier fragment xml, de sorte qu’aucune barre d’outils n’a été trouvée ni aucune when getSupportActionBar () . Alors, rappelez-vous: Ne placez pas la barre d’outils dans le fichier XML de votre fragment.