cr0vax Posté(e) 1 avril 2010 Share Posté(e) 1 avril 2010 Salut tout le monde. J'ai un petit souci de code là. En fait, j'ai deux webview : android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="375dp" /> android:id="@+id/panel" android:layout_width="fill_parent" android:layout_height="103dp" /> Sauf que ... dépendamment d'un fichier de configuration, je souhaite en faire disparaître une (panel) et/ou resizer l'une ou l'autre. J'ai cherché à faire quelque chose comme ça : webview.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); Mais ça me fait un beau plantage : W/System.err( 1384): java.lang.NullPointerException W/System.err( 1384): at hello.world.hello.onCreate(hello.java:57) W/System.err( 1384): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) W/System.err( 1384): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) W/System.err( 1384): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) W/System.err( 1384): at android.app.ActivityThread.access$2200(ActivityThread.java:119) W/System.err( 1384): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) W/System.err( 1384): at android.os.Handler.dispatchMessage(Handler.java:99) W/System.err( 1384): at android.os.Looper.loop(Looper.java:123) W/System.err( 1384): at android.app.ActivityThread.main(ActivityThread.java:4363) W/System.err( 1384): at java.lang.reflect.Method.invokeNative(Native Method) W/System.err( 1384): at java.lang.reflect.Method.invoke(Method.java:521) W/System.err( 1384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) W/System.err( 1384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) W/System.err( 1384): at dalvik.system.NativeStart.main(Native Method) D/WEBVIEW ( 1384): FAILjava.lang.NullPointerException !!!!! Une idée de la bonne marche à suivre ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 1 avril 2010 Share Posté(e) 1 avril 2010 alors moi je ferais ça: un truc qui contient tes deux views. les deux avec un fill_parent : du coup android devrait gérer ça bien et faire 50/50... et là pour la view à faire disparaitre : taview.setVisibility(GONE); (j'ai plus le namespace de gone : View.GONE ou Visivility.GONE...) en gros ça veut dire : cache toi et disparait et prend pas de place. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 1 avril 2010 Auteur Share Posté(e) 1 avril 2010 Sauf que je veux pas du 50/50 :D Je veux plutôt du 80/20 voire du redimensionnement en fonction de mon fichier de conf. :/ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rafffel Posté(e) 1 avril 2010 Share Posté(e) 1 avril 2010 Regarde du coté de layout_weight tu met genre 0.8 pour l'un et 0.2 pour l'autre et tu met fill_parent pour les 2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 1 avril 2010 Auteur Share Posté(e) 1 avril 2010 Alors c'est pas mal, ça me permet d'utiliser webview.setVisibility(View.GONE); Par contre ... je peux toujours pas affecter mes dimensions de façon dynamique. Je comprend pas trop pourquoi ça me crash à la gu*****. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 1 avril 2010 Share Posté(e) 1 avril 2010 faudrait les kignes qui explosent et le code. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 1 avril 2010 Share Posté(e) 1 avril 2010 Vu que le java.lang.NullPointerException semble avoir peu de probabilités de venir de LayoutParams.FILL_PARENT, est ce que tu as bien défini ta webview? Ca semble con comme question, mais si c'est vraiment ta ligne qui plante, je ne vois que cela... WebView webview = (WebView) findViewById(R.id.webviewt); Si ton code fonctionne sans la ligne que tu as décrite et que c'est bien elle qui fait tout crasher ( ligne 57 de ton code?) je ne vois que cela comme explication. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 1 avril 2010 Auteur Share Posté(e) 1 avril 2010 C'est bien webview qui renvoit null MAIS il n'est pas null (testé). Je l'ai correctement instancié et je m'en sers tout au long du code : webview = (WebView)findViewById(R.id.webview); webview.setWebViewClient(new myWebViewClient()); webview.getSettings().setJavaScriptEnabled(true); controlCommand controlJS = new controlCommand(); webview.addJavascriptInterface(controlJS, "ClipAndBrowse"); //webview.loadUrl(c.getLocalURL()); webview.setVerticalScrollBarEnabled(c.isScrollVWindow()); Tout ça se fait sans erreurs. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
fabcool78 Posté(e) 2 avril 2010 Share Posté(e) 2 avril 2010 Fait du debug pas à pas, vérifies les valeurs. Pour des linearLayout, ca semble marcher. Tu peux même changer les layoutParams directement dans l'objet Linear layout. Autre solution: Remove ton WebView du LLayout, et rajoute le avec de nouveaux layout params. Si tu ne trouve rien, ajoute les sources d'android et fait du pas à pas dans les sources, tu verras où est ton pb. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 2 avril 2010 Auteur Share Posté(e) 2 avril 2010 Ouais pour le moment, j'ai mis en standby. Mais je vais essayer les pistes que tu me donnes. Par contre pour les sources, elles sont sur une autre machine, et c'est casse-pied ;) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 8 avril 2010 Auteur Share Posté(e) 8 avril 2010 Bon ... J'a pris l'option proposée par rafffel ce qui donne : xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="2" /> android:id="@+id/panel" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="8" /> Le résultat est un peu bizarre cependant : http://imagik.fr/view/237754 A gauche, c'est quand l'application se lance. J'ai entouré les webviews. Comme on peut le voir, j'ai un espace noir qui n'a rien à faire là. A droite, c'est la même application avec le même code lorsque j'appuie sur home (cette appli. est une home même si ça ne se voit pas ;)) ou lorsque une fenêtre de dialogue s'est ouverte. J'avoue bloquer depuis longtemps sur ce bug sans le comprendre. Quelqu'un a une idée ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 8 avril 2010 Auteur Share Posté(e) 8 avril 2010 Personne ? :/ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 9 avril 2010 Share Posté(e) 9 avril 2010 (modifié) Au hasard, je dirais, fais une recherche sur le forum, on en parle plein de fois, mais ce serait pas sympa... Prévois ceci dans tes webview: android:layout_height="0dip" Il faut mettre la valeur à 0dip avant de jouer avec le poids ;) Par contre, je suis vraiment étonné pour cet espace noir au dessus! C'estt vraiment zarbi. Je suis étonné qu'il se mette au-dessus.. J'aurais compris qu'il soit en dessous! Modifié 9 avril 2010 par Profete162 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 9 avril 2010 Auteur Share Posté(e) 9 avril 2010 Arf, j'avais regardé dans la doc. et c'était pas vraiment explicite. Oui, cette bande noire est très curieuse. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 13 avril 2010 Auteur Share Posté(e) 13 avril 2010 En fait, le problème vient du fait que je voulais changer dynamiquement l'apparence de mon application. Lire un fichier de configuration puis passer l'application en plein écran ou non en fonction de mon fichier de configuration. Cette fameuse barre noire est en fait un bug de la plate-forme. L'explication est la suivante : Dans le Manifest, on peut appliquer un thème à son application. Par exemple : ou encore Evidemment, vu que c'est dans le Manifest, on ne peut rien changer. Donc pour pouvoir changer, on peut le faire en Java de la façon suivante : protected void onCreate(Bundle icicle) { super.onCreate(icicle); setTheme(android.R.style.Theme_Dark); setContentView(R.layout.main); } Enfin ça, c'est la façon dont c'est documenté. Dans la pratique, c'est ça : protected void onCreate(Bundle icicle) { setTheme(android.R.style.Theme_Dark); super.onCreate(icicle); setContentView(R.layout.main); } Soit ... Il faut déjà un moment pour y penser mais on y arrive (la preuve). Cependant, dans notre cas de figure, ça ne marche toujours pas. Il y a toujours cette bande noire et il n'y a aucun moyen d'y remédier si l'on souhaite être en plein écran en fonction d'un fichier de configuration. Ce bug ne sera probablement pas corrigé car l'utilisation de setTheme est actuellement plutôt déconseillée par les ingénieurs d'Android comme Dianne Hackborn (T-Mobile). Soit on est plein écran depuis le début et c'est sans aucun problème, soit on le fait dynamiquement et on a la bande noire. Alors évidemment, il est toujours possible de bidouiller. Si on regarde le cycle de vie d'une Activity, on a ça : On s'aperçoit que si une activity n'a plus le plein écran, elle va réinitialiser tout une partie de son code via onResume(). L'astuce est donc, au début de l'Activity ClipAndBrowse, de charger la configuration, d'appliquer le thème (on a donc une belle bande noire si l'on veut être en plein écran) puis, toujours si l'on veut être en plein écran, de lancer une Activity qui elle est en plein écran (via son thème dans le Manifest). Cette Activity est tout de suite tuée ce qui replace ClipAndBrowse à l'écran mais cette fois sans la bande noire. Le code de notre Activity fantôme : public class hack extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hack); Log.d("HACK","DISPLAY NOTHING LOOKS SO FUN"); this.finish(); } } L'opération est assez rapide et n'a lieu qu'à la création de la première Activity. Ça me semble donc acceptable. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 13 avril 2010 Share Posté(e) 13 avril 2010 Je ne suis pas sûr d'avoir tout compris mais... aurais-tu les mêmes soucis si tu passais en full-screen avec les méthodes de l'API adéquates ? protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a full-screen window final Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.content_view); ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 13 avril 2010 Auteur Share Posté(e) 13 avril 2010 setTheme, avec un thème Fullscreen est parfaitement adéquat et documenté dans les API ... et fait exactement ce que ton code fait. Il n'y aucune différence. Quand je fais ce que tu écris, il y a toujours cette bande noire qui correspond en fait à la barre de notif. Il n'est tout simplement pas possible de mettre plein écran mon appli. si elle n'a pas été déclarée comme telle dans son Manifest. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Ulrich Posté(e) 14 avril 2010 Share Posté(e) 14 avril 2010 Ce n'est pas ce qui se passe sur certaines apps lorsqu'on passe du mode portrait à paysage ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cr0vax Posté(e) 15 avril 2010 Auteur Share Posté(e) 15 avril 2010 normalement non, à moins qu'elles passent en plein écran en même temps 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.