Alex598 Posté(e) 17 janvier 2012 Share Posté(e) 17 janvier 2012 Bonjour, j'ai un soucis depuis que je tente d'utiliser une TabHost sur mon application, et malheureusement ça contraint à fermer mon application... Je m'expliquer, tout d'abord pour mettre dans le contexte, moi et un collègue devons réaliser une application dans le cadre d'un projet d'étude, le but ? Récupérer un fichier en ligne mis par les profs (au format .ics) et notifier l'utilisateur dès qu'il y a une modification (changement dans l'emploi du temps, suppression/ajout de cours, ajout d'une semaine), enfin bref, tout ce qui n'est toujours pas automatisé dans notre chère IUT. Nous avons donc attaqué depuis un ptit moment l'appli mais avançons pas à pas (c'est notre première :huh:) et j'avoue qu'on galère pas mal. J'ai donc l'affichage qui s'exécute, un menu lorsqu'on clique sur le bouton "menu", mais avec ça j'ai créé aussi une TabHost pour distinguer la semaine actuelle et la semaine qui suit. Mon problème est ici, depuis que j'ai mis la TabHost, en gros c'est soit l'utilisation de la TabHost, soit de par exemple le défilement d'une Listview mais les deux en même temps n'est pas possible, ça fait une sorte de conflit d'affichage et interactivité. De plus, maintenant ça va jusqu'à fermer automatiquement l'application (échec du processus). Et je ne comprends pas trop pourquoi malgré de nombreuses recherches sur les TabHost ect =/ ! J'ai 4 activités dont 3 concernent la tab : l'activité principale de mon appli, et une activité par bouton de la Tab (du coup 2). Dans mon layout main.xml, j'ai ceci : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/CreateNotif" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Créer une notification" /> <Button android:id="@+id/ClearNotif" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Supprimer la notification" /> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="5dp" > <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp" /> </LinearLayout> </TabHost> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" > </LinearLayout> </LinearLayout> Est-ce que le problème vient déjà du fichier XML (dans la constitution même du fichier avec la TabHost) ? Ouuu sinon est-ce que ce problème serait dans mon code (dans ce cas je peux publier les parties correspondantes). Voilà, merci beaucoup d'avance, je bloque vraiment sur le sujet et c'est assez frustrant d'être bloqué sur ça :mellow: . Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 17 janvier 2012 Share Posté(e) 17 janvier 2012 Il nous faudrait le logcat pour t'aider :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 18 janvier 2012 Auteur Share Posté(e) 18 janvier 2012 Pas de problème :) : /* Je lance l'émulateur ainsi que l'appli pour la 1ère fois, et à la fin ça plante directement */ 01-18 09:05:42.600: D/AndroidRuntime(225): Shutting down VM 01-18 09:05:42.600: W/dalvikvm(225): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 01-18 09:05:42.609: E/AndroidRuntime(225): Uncaught handler: thread main exiting due to uncaught exception 01-18 09:05:42.680: E/AndroidRuntime(225): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.projets4.notifme/org.projets4.notifme.NotifMeActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class TabRow 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.os.Handler.dispatchMessage(Handler.java:99) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.os.Looper.loop(Looper.java:123) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.ActivityThread.main(ActivityThread.java:4363) 01-18 09:05:42.680: E/AndroidRuntime(225): at java.lang.reflect.Method.invokeNative(Native Method) 01-18 09:05:42.680: E/AndroidRuntime(225): at java.lang.reflect.Method.invoke(Method.java:521) 01-18 09:05:42.680: E/AndroidRuntime(225): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 01-18 09:05:42.680: E/AndroidRuntime(225): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 01-18 09:05:42.680: E/AndroidRuntime(225): at dalvik.system.NativeStart.main(Native Method) 01-18 09:05:42.680: E/AndroidRuntime(225): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class TabRow 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 01-18 09:05:42.680: E/AndroidRuntime(225): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.Activity.setContentView(Activity.java:1622) 01-18 09:05:42.680: E/AndroidRuntime(225): at org.projets4.notifme.NotifMeActivity.onCreate(NotifMeActivity.java:37) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 01-18 09:05:42.680: E/AndroidRuntime(225): ... 11 more 01-18 09:05:42.680: E/AndroidRuntime(225): Caused by: java.lang.ClassNotFoundException: android.view.TabRow in loader dalvik.system.PathClassLoader@44e8c8c8 01-18 09:05:42.680: E/AndroidRuntime(225): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 01-18 09:05:42.680: E/AndroidRuntime(225): at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 01-18 09:05:42.680: E/AndroidRuntime(225): at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.createView(LayoutInflater.java:466) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:544) 01-18 09:05:42.680: E/AndroidRuntime(225): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66) 01-18 09:05:42.680: E/AndroidRuntime(225): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) 01-18 09:05:42.680: E/AndroidRuntime(225): ... 21 more 01-18 09:05:42.889: I/dalvikvm(225): threadid=7: reacting to signal 3 01-18 09:05:42.969: I/dalvikvm(225): Wrote stack trace to '/data/anr/traces.txt' 01-18 09:07:04.379: I/Process(225): Sending signal. PID: 225 SIG: 9 /* Je ne relance que l'appli, ça fonctionne, arrivé au moment où j'ai cliqué sur menu et sélectionné préférences puis dans préférences une partie qui s'appelle "changer de groupe de TP", ça re-plante */ 01-18 09:09:07.399: W/KeyCharacterMap(251): No keyboard for id 0 01-18 09:09:07.399: W/KeyCharacterMap(251): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 01-18 09:09:12.158: D/AndroidRuntime(251): Shutting down VM 01-18 09:09:12.188: W/dalvikvm(251): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 01-18 09:09:12.188: E/AndroidRuntime(251): Uncaught handler: thread main exiting due to uncaught exception 01-18 09:09:12.220: E/AndroidRuntime(251): java.lang.NullPointerException 01-18 09:09:12.220: E/AndroidRuntime(251): at org.projets4.notifme.NotifMeActivity.onOptionsItemSelected(NotifMeActivity.java:127) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.app.Activity.onOptionsItemSelected(Activity.java:2282) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.app.Activity.onMenuItemSelected(Activity.java:2170) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:129) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.widget.ListView.performItemClick(ListView.java:3285) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.os.Handler.handleCallback(Handler.java:587) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.os.Handler.dispatchMessage(Handler.java:92) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.os.Looper.loop(Looper.java:123) 01-18 09:09:12.220: E/AndroidRuntime(251): at android.app.ActivityThread.main(ActivityThread.java:4363) 01-18 09:09:12.220: E/AndroidRuntime(251): at java.lang.reflect.Method.invokeNative(Native Method) 01-18 09:09:12.220: E/AndroidRuntime(251): at java.lang.reflect.Method.invoke(Method.java:521) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 01-18 09:09:12.220: E/AndroidRuntime(251): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 01-18 09:09:12.220: E/AndroidRuntime(251): at dalvik.system.NativeStart.main(Native Method) 01-18 09:09:12.268: I/dalvikvm(251): threadid=7: reacting to signal 3 01-18 09:09:12.300: I/dalvikvm(251): Wrote stack trace to '/data/anr/traces.txt' 01-18 09:09:14.610: I/Process(251): Sending signal. PID: 251 SIG: 9 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 18 janvier 2012 Share Posté(e) 18 janvier 2012 (modifié) Y'a quoi a la ligne 127 de NotifMeActivity? Modifié 18 janvier 2012 par Sylvain-a Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 18 janvier 2012 Auteur Share Posté(e) 18 janvier 2012 Il y a ça edit = (EditText)findViewById(R.id.url); qui provient de : /********Ecouteur boutons menu**********/ public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()) { case R.id.preference: //Toast.makeText(NotifMeActivity.this, "Pr�f�rences", Toast.LENGTH_LONG).show(); return true; case R.id.groupe: /********Code pour l'EditText et le bouton r�cup�rer**********/ edit = (EditText)findViewById(R.id.url); button = (Button)findViewById(R.id.recup); button.setOnClickListener(this); //Toast.makeText(NotifMeActivity.this, "Groupe", Toast.LENGTH_LONG).show(); return true; case R.id.sons: //Toast.makeText(NotifMeActivity.this, "Sons", Toast.LENGTH_LONG).show(); return true; case R.id.vibreur: //Toast.makeText(NotifMeActivity.this, "Vibreur", Toast.LENGTH_LONG).show(); return true; case R.id.notification: //Toast.makeText(NotifMeActivity.this, "Notification", Toast.LENGTH_LONG).show(); return true; case R.id.site: //Toast.makeText(NotifMeActivity.this, "Site", Toast.LENGTH_LONG).show(); Intent intentView = new Intent(Intent.ACTION_VIEW, Uri.parse("http://gestionedt.emploisdutempssrc.net/")); startActivity(intentView); return true; case R.id.upload: //Toast.makeText(NotifMeActivity.this, "Upload", Toast.LENGTH_LONG).show(); Intent intentGet = new Intent(Intent.ACTION_VIEW, Uri.parse("http://gestionedt.emploisdutempssrc.net/")); startActivity(intentGet); return true; case R.id.quitter: finish(); //Toast.makeText(NotifMeActivity.this, "Quitter", Toast.LENGTH_LONG).show(); return true; } return false; } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 18 janvier 2012 Share Posté(e) 18 janvier 2012 (modifié) Vérifie qu'il trouve bien ton EditText car a priori le findViewById renvoi null. Modifié 18 janvier 2012 par Sylvain-a Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 18 janvier 2012 Auteur Share Posté(e) 18 janvier 2012 Je ne comprend pas trop, l'EditText est pourtant référencé par le bon id ... Sinon, il n'y aurait pas un soucis à ce niveau ? : case R.id.groupe: /********Code pour l'EditText et le bouton récupérer**********/ edit = (EditText)findViewById(R.id.url); button = (Button)findViewById(R.id.recup); button.setOnClickListener(this); //Toast.makeText(NotifMeActivity.this, "Groupe", Toast.LENGTH_LONG).show(); return true; puisqu'en fait j'essaye de passer à un autre écran (après avoir sélectionné dans la liste "changer de groupe TP" je voudrais allez simplement sur un écran où je peux rentrer un champs texte du genre lien url et ensuite valider la sélection. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 18 janvier 2012 Share Posté(e) 18 janvier 2012 Teste les variables et t'auras la réponse tu fais un System.out.println(findViewById(R.id.url)); Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 19 janvier 2012 Auteur Share Posté(e) 19 janvier 2012 Ah tiens oui effectivement, ça m'envois null en sortie ... Je comprends pas pourquoi, j'ai vérifié mon objet EditText dans la partie XML et l'id est le même ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 19 janvier 2012 Share Posté(e) 19 janvier 2012 D'ou fais tu ce switch? Dans ta TabActivity, ou dans l'activity qui affiche les informations? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 19 janvier 2012 Auteur Share Posté(e) 19 janvier 2012 Je créé en XML l'EditText et le Button dans res > layout > listpref.xml Donc non je les affichent pas dans la TabActivity (si j'ai bien compris ta question) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 19 janvier 2012 Share Posté(e) 19 janvier 2012 Alors c'est normal que ça renvoit null.... Etant donné que ton layout ne doit pas être chargé ^^ Lorsque tu change de tab, il faut soit que tu charges le xml et l'ajoute a a l'écran, soit tu charges une seconde activity qui sera affiché dans le contenu de l'onglet, et cette activity chargera ton listpref.xml (via setContentView) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 19 janvier 2012 Auteur Share Posté(e) 19 janvier 2012 Ah d'accord ... Mais j'ai compris le principe, mais comment faire pour changer de vue dans une méthode OnOptionsItemSelected, enfin dans ce cas, parceque si j'essaie ça par exemple case R.id.groupe: /********Code pour l'EditText et le bouton r�cup�rer**********/ setContentView(R.layout.listpref); edit = (EditText)findViewById(R.id.url); System.out.println(findViewById(R.id.url)); button = (Button)findViewById(R.id.recup); button.setOnClickListener(this); //Toast.makeText(NotifMeActivity.this, "Groupe", Toast.LENGTH_LONG).show(); return true; ça ne fonctionne pas =/ ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 19 janvier 2012 Share Posté(e) 19 janvier 2012 Il faut que tu fasses le traitement de ton menu (création et traitement de la réception de l'évènement) dans l'activity secondaire et pas dans la tabactivity. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 19 janvier 2012 Auteur Share Posté(e) 19 janvier 2012 Euhhh, je n'ai pas d'activity secondaire ... j'ai une activité principale qui est implémenté de TabActivity, et ensuite j'ai 2 autres activités qui sont liées à la TabActivity Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sylvain-a Posté(e) 19 janvier 2012 Share Posté(e) 19 janvier 2012 ben c'est ça, Ton host appelle tes activités secondaires. Le layout listpref est chargé dans une de ces activités. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 19 janvier 2012 Auteur Share Posté(e) 19 janvier 2012 Bah non justement, ici listpref.xml servirait à charger des éléments qui doivent s'afficher à tout moment lorsque je clique sur le bouton menu puis sur préférence et enfin changer de groupe TP.. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alex598 Posté(e) 20 janvier 2012 Auteur Share Posté(e) 20 janvier 2012 (modifié) J'ai "résolu" mon problème, en fait j'ai remodifié un peu l'ensemble de mon code, au lieu de créer un sous-menu préférences dans mon menu, j'ai recréé un fichier xml préférences du type <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Préférences"> <EditTextPreference android:title="Changer le groupe TP" android:dialogTitle="Modification du groupe de TP" android:dialogMessage="Entrez l'url d'accès au fichier calendar de votre groupe" android:dialogIcon="@drawable/plus_24" android:defaultValue="" /> <CheckBoxPreference android:title="Jouer les sons" android:key="sons" android:summaryOn="Sons activés" android:summaryOff="Mode silence" android:defaultValue="true" /> <CheckBoxPreference android:title="Vibrations" android:key="vibreur" android:summaryOn="Mode vibreur" android:summaryOff="Vibreur désactivé" android:defaultValue="true" /> <CheckBoxPreference android:title="Affichage des notifications" android:key="notifications" android:summaryOn="Notifications activées" android:summaryOff="Notifications désactivées" android:defaultValue="true" /> </PreferenceScreen> et du coup dans mon code java j'ai créé cette classe package org.projets4.notifme; import android.os.Bundle; import android.preference.PreferenceActivity; public class Preference extends PreferenceActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); } } puis dans mon activity principale public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()) { case R.id.preference: Intent intent = new Intent(NotifMeActivity.this, Preference.class); startActivity(intent); return true; case R.id.site: Intent intentView = new Intent(Intent.ACTION_VIEW, Uri.parse("http://gestionedt.emploisdutempssrc.net/")); startActivity(intentView); return true; case R.id.upload: Intent intentGet = new Intent(Intent.ACTION_VIEW, Uri.parse("http://gestionedt.emploisdutempssrc.net/edt/ical/SRC/SRC2A1/basic.ics")); startActivity(intentGet); return true; case R.id.quitter: finish(); //Toast.makeText(NotifMeActivity.this, "Quitter", Toast.LENGTH_LONG).show(); return true; } return false; } C'est en fait beaucoup plus adapté pour gérer les préférences x) ! Mais par contre, j'ai un soucis sur l'affichage, c'est à dire que quand je tente de cliquer sur une des checkbox pour en modifier son état, ou quand je tente d'accéder à l'EditText, ça ferme le menu au clic sans pour autant modifier les états ... EDIT : Problème de nouveau résolu ... chose bête, en mettant un try catch et en affichant du coup l'erreur dans le log, je m'aperçoit bêtement ne pas avoir déclaré Preference.class dans le manifest xD ... Modifié 20 janvier 2012 par Alex598 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.