Aller au contenu

TabHost et... mon appli qui plante


Alex598

Recommended Posts

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: .

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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 =/ ...

Lien vers le commentaire
Partager sur d’autres sites

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é par Alex598
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...