Jump to content

Changer la taille d'une (web)View en cours de route


cr0vax

Recommended Posts

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 ?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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!

Edited by Profete162
Link to comment
Share on other sites

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 :

activity_lifecycle.png

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.

Link to comment
Share on other sites

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

...

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...