IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Création d'un composant graphique à partir d'un existant


Sujet :

Android

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut Création d'un composant graphique à partir d'un existant
    Bonjour,
    je suis un peu confus car je travaille sur la création d'un composant Android qui hériterait du composant webview.

    Mon objectif est de lui ajouter certaines nouveautés.

    Pour cela, j'ai créé un projet type "library" android dans lequel j'ai un layout composé d'un relativelayout contenant : un webview, une progressBar et un button.
    filemanagerwebview.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" />
     
        <ProgressBar
            android:id="@+id/dlProgressBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
     
        <ImageButton
            android:id="@+id/closebutton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/empty"
            android:src="@android:drawable/ic_delete" />
     
    </RelativeLayout>
    J'ai ensuite commencé une classe "FileManagerWebView" qui hérite de webview.

    L'objectif est le suivant :
    A partir d'un autre projet android, en important cette librairie, on puisse utiliser des instances de ma classe FileManagerWebView comme étant un objet WebView en plus des nouveautés que j'y ai ajoutés.

    Ainsi, coté application graphique, il faudrait utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <package.de.library.FileManagerWebView  android="@+id/myfilewebview" />
    dans le layout de l'activité, et le charger avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileManagerWebView fmwv = (FileManagerWebView) findViewById(R.id.myfilewebview);
    Seulement lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fmwv.loadUrl("http://www.developpez.net");
    La page n'est pas chargée.
    Bien entendu, la permission internet est utilisée

    Je pense que ce qui me bloque, c'est l'association de l'objet graphique webView coté library, à ma classe FileManagerWebView.
    J'ai pensé faire quelque chose comme cela dans le constructeur du FileManagerWebView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LayoutInflater.from(context).inflate(R.layout.filemanagerwebview , this, true);
    Je sens qu'un détail idiot m'échappe, mais il m'est nécessaire d'avoir un oeil externe.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut
    Bonjour et bonne année.
    Je suis toujours "bloqué" sur mon probleme.

    Actuellement j'ai une solution qui marche mais qui ne s'utilise pas comme je le voudrais :

    Dans l’initialisation de mon FileManagerWebView (qui hérite de WebView), j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LayoutInflater.from(context).inflate(R.layout.filwebview, this, true);
    im = (ImageButton) findViewById(R.id.closebutton);
    pbChargement = (ProgressBar) findViewById(R.id.dlProgressBar);
    wv = (WebView) findViewById(R.id.webView);
    Dans l'activité ayant ce composant, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FileManagerWebView fw = new FileManagerWebView(this);
    fw.wv.loadUrl("http://www.developpez.net"); 
    this.addContentView(fw, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
    				ViewGroup.LayoutParams.FILL_PARENT));
    en ayant retiré du layout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <package.de.library.FileManagerWebView  android="@+id/myfilewebview" />
    C'est idiot comme probleme, mais je suis obligé de faire : fw.wv pour acceder au webview qui est à l'écran.
    J'aimerais pouvoir faire fw.loadUrl("google.fr");
    au lieu de fw.wv.loadUrl("google.fr");
    Seulement je ne peux pas associer le webview du layout, à mon objet FileManagerWebView de facon directe, puisque je lui associe le layout entier.

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne comprends pas trop ou se situe le problème...

    Si je fais une classe dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    package my.application.library;
     
    class TotoWebView extends WebView
    {
         ...
    }
    et que dans le code je l'utilise avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <my.application.library.TotoWebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" />
     
         ...
    </RelativeLayout>
    Depuis le code, je peux y accéder comme n'importe quelle web-view...

    On pourrait voir le code complet (les deux classes de View / Activity + le XML de layout) ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut
    Bonjour et merci.
    En effet, je suis partit du mauvais sens.

    Il faut :
    - Créer la classe héritant du webview, ne passer associer de layout mais créer dynamiquement les composants additionnels.
    Extrait de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class TotoWebView extends WebView {
    	ProgressBar progressbar;
    	ImageButton imagebutton;
    	public Context c;
     
    	public TotoWebView(Context context) {
    		super(context);
    		// TODO Auto-generated constructor stub
    		init(context);
    	}
     
    	private void init(Context context){
    		this.c = context;
    		progressbar = new ProgressBar(context);
    		imagebutton = new ImageButton(context);
    		this.addView(imagebutton );
    		this.addView(progressbar );
    	}
    }
    C'est le seul élement que contient la library.

    Le projet contenant une activité doit :
    - Avoir un layout qui définit un TotoWebView
    - gerer l'instance de cet objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        <com.dev.net.TotoWebView 
            android:id="@+id/toto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MainActivity extends Activity {
    	TotoWebView t;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
     
    		//TotoWebView t = (TotoWebView) findViewById(R.id.toto);
    		 t = new TotoWebView(this);
    		 t.loadUrl("http://www.developpez.net");
    		 setContentView(t);
    	}
    }
    Il reste un tout petit problème :
    Comment positionner mes composants secondaires sur ma TotoWebView.
    j'ai un ImageButton et une ProgressBar.
    Le webview va prendre tout l'écran. J'aimerais placer le bouton en haut à droite de l'écran, et placer la progressBar au centre.

    J'ai pensé faire dans la classe TotoWebView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    		lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
    		lp.addRule(RelativeLayout.CENTER_VERTICAL);
    		this.addView(this.progressbar, lp);
     
    		lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    		lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    		lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
     
    		this.addView(this.imagebutton, lp);
    Mais cela ne semble pas etre prit en compte. Une suggestion ?

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pourquoi ne pas utiliser un fichier layout pour la view, et utiliser l'inflater pour créer les enfants ? Ce sera bien plus facile à changer que d'aller triturer le code.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut
    Oui, merci questionn idiote a laquelle j'avais moi meme répondu dans mon premier post. ^^

    Merci pour l'aide fournie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [IDE] Création d'un composant graphique
    Par Pascale38 dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/03/2014, 13h41
  2. Réponses: 3
    Dernier message: 01/03/2014, 08h20
  3. [Débutant] Création d'une composante graphique à partir d'un pushbutton
    Par NR1987 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 24/10/2010, 20h49
  4. Problème de création de série pour graphique à partir de variables
    Par isma616 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/08/2010, 17h18
  5. Comment accèder aux composants graphique à partir d'un autre thread ?
    Par PerpetualSnow dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/03/2007, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo