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 :

Aide / Orientation programmation JAVA ou KOTLIN


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur gestion de projet
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Par défaut Aide / Orientation programmation JAVA ou KOTLIN
    Bonsoir,

    je viens vers vous pour différents problèmes que je n'arrive pas à résoudre sur le développement d'une application via Android studio afin de digitaliser mon travail

    En gros l'application c'est :
    - sur différents supports Android à partir de l'API 21 (téléphone et tablette),
    - plusieurs utilisateurs avec des données partagées qui se complètent,
    - un travail hors ligne sauf pour se synchroniser les infos,
    - 5 modules avec des enregistrements des données en mémoire interne dans des fichiers texte ou csv :
    1. Rapports photos / légende
    2. Formulaire avec cases à cocher ou champs de texte
    3. Un outil pour dessiner sur un fichier pdf ou une photo
    4. Un navigateur
    5. Un Affichage d'avancement de tâche - Des tâches Parent (juste un affichage et je peux afficher ses enfants) et Enfant (des cases à cocher et des champs de texte)

    J'ai deux soucis majeurs que je n'arrive pas à solutionner...
    Le premier :
    - Je veux Brancher via un câble mon terminal à un PC et qu'il se synchronise avec un emplacement noté en dur dans l'application exemple : C://USER/DESKTOP/APPLI ou dans un futur lointain https://...
    - Donc lors de l'ouverture de l'application et de l'appui sur le bouton de synchro : les fichiers .txt ou .csv se synchronisent avec ceux dans l'emplacement en dur (la règle de base c'est que si conflit entre une donnée modifiée par deux utilisateurs, c'est le dernier enregistrement qui compte),
    - Je peux afficher dans l'application ce qui est "nouveau",
    J'ai trouvé sur le net des idées, mais le fonctionnement ne correspond pas à ce que j'ai besoin, la plupart du temps on récupère les infos via un serveur web... avez vous des idées pour faire ce que je cherche ?

    Le second est dans la partie avancement des tâches :
    - les tâches affichées proviennent d'un fichier .csv, qui est bien formaté avec entre autre des numéros uniques de ligne et une hiérarchie de 1 à 6 suivant les tâches (1 le niveau le plus haut, 6 le plus bas (Exemple Tâche n°10 NIV1, n°11 NIV2, N°13 NIV3, N°14 NIV1, N°15 NIV1, N°16 NIV2),
    - je dois donc avoir les tâches dans l'ordre des numéros uniques, si la tâche est PARENT (donc avec ENFANT), elle a un affichage genre "Nom" "Statut" et lors du clic dessus elle développe ses enfants (cela peut être une autre vue si c'est plus simple),
    - et dans l'affichage d'une tâche ENFANT j'ai : "Nom" " Statut" des cases à cocher et un champ texte,
    - lors d'un affichage je peux avoir des tâches PARENTS et ENFANTS, suivant la place de l'affichage,
    - défilement en scrolling vertical,
    - dans cet affichage complet je vais aussi essayer d'avoir un champ filtre / recherche / aller à (je le précise si cela limite les possibilités),
    Je suis donc en train de faire un expandable view avec des cardview pour les enfants, est-ce la bonne voie ou bien je suis déjà dans un futur problème ? Je n'ai rien trouvé de ressemblant à ce que je veux faire...


    Je suis débutant, j'ai fais beaucoup de tutoriels sur les différents sites et donc j'apprends en refaisant et en assemblant les différentes infos que je collecte, cependant n'ayant pas de grandes connaissances je me retrouve vite coincés par des problèmes au fur et à mesure que j'avance... donc si je peux gagner du temps en ayant des conseils avisés ça sera toujours un gain de mal de tête !

    Merci de me lire

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Salut,

    Pour ton premier problème, je ne le savais pas, mais apparemment, on peut récupérer des fichiers de son ordi depuis son téléphone. Il suffit de passer par une adresse IP (https://stackoverflow.com/questions/...from-pc-folder).
    Pour ce qui est de savoir qui est le plus récent, il suffit juste de rajouter un champ Date à tes données, ou bien de récupérer la date de création de ton fichier, et de faire la comparaison avec tes données déjà enregistrées. C'est très très courant comme pratique, avec un timestamp.

    Pour le second problème, il faut parfois revoir sa façon d'imaginer les écrans. Designer pour une tablette ou un téléphone n'est déjà pas la même chose. Ce que tu recherches ressemble un peu à ca : https://android-arsenal.com/details/1/7886. Tu trouveras d'autres librairies bien utiles sur le même site : https://android-arsenal.com.
    Faire une long liste, extensible, avec des enfants ayant eux même des checkboxes et un champ de texte, cela signifie que quasiment tout l'écran est pris si tu étant un parent avec 3 enfants. L'utilisateur (ou toi) risque de s'y perdre dans les clics, les scrolls... Après, je ne connais pas ton besoin exact, donc c'est surtout la pratique (et le bon sens ) qui te diront ce qui est bien ou pas. Peut-être qu'afficher simplement la liste des parents, et par un clic tu affiches les enfants sur un autre écran peut paraître plus ergonomique.
    Quoiqu'il en soit, comme pour tout projet mobile ou web, je te conseille de tout dessiner sur une feuille ou un logiciel de design pour te faire un premier avis.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur gestion de projet
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Par défaut
    Bonsoir,

    super pour mon premier problème ! Je ne pensais pas qu'on pouvait lier le PC et le device avec l'adresse IP mais ça me convient bien, je vais tester !

    J'ai fait cela sous Powerpoint en faisant mon CDC !
    Et oui je pense que le mieux sera d'afficher un niveau puis lors d'un clic sur un parent j'ouvre une autre vue avec les enfants dedans !
    Mais techniquement j'ai l'impression que je vais galérer car je me retrouve donc avec des multiples recycleurview qui ont deux types d'affichages : parents et enfants car je vais avoir :
    Ligne 1 - PARENT NIVEAU 1
    Ligne 2 - PARENT NIVEAU 2
    Ligne 3 - ENFANT NIVEAU 3
    Ligne 4 - ENFANT NIVEAU 3
    Ligne 5 - PARENT NIVEAU 1
    Ligne 6 - ENFANT NIVEAU 2
    Ligne 7 - ENFANT NIVEAU 1

    Et donc sur ma première page je dois afficher Ligne 1 / 5 et 7 : Grand parent, Parent et Enfant.
    Dans mon fichier de base j'ai ce NIVEAU de noté donc si je compare je sais dire si c'est un Parent ou Enfant avec la ligne d'en dessous (si Niveau Ligne N+1<= Niveau Ligne N alors Ligne N = Enfant) et donc de choisir mon affichage, enfin je pense...

    Et pour la vue de l'enfant c'est donc un Cardview qu'il faut utiliser ? ou autre chose ?

    Merci en tout cas d'avoir pris du temps pour m'aider

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Je n'avais pas vu ca, avec des enfants qui sont aussi des parents.
    Si la liste des parents n'est pas très grande comme ici, il n'est pas utile de prendre une expandable list. Je mettrais plutôt les parents comme titre de section, et les enfants pour le contenu. Par contre, pour le cas des grands parents/parent/enfant, je vois moins. Mais comme ca ressemble à une structure de rapport, avec titre de paragraphe/contenu et/ou titre de paragraphe/sous-titre/contenu, tu peux p'tet envisager un affichage de ce type, où tu enlève le séparateur pour que tout semble lié. Pour ton cas particulier, il n'y a que la pratique qui te dira si c'est bon, compréhensible à l'utilisation, ou pas.

    Et pour les enfants, cardview ou non, c'est toi qui vois. Les cardview, c'est juste pour mettre un peu de séparation avec des ombres.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur gestion de projet
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Par défaut
    Me voilà de retour après avoir bossé sur le sujet :
    1 - Chargement du fichier, la méthode par IP ne fonctionne pas... j'arrive donc à charger un fichier d'un http, et sinon actuellement, j'ai basculé vers la lecture d'un csv qui est stocké dans les ressources de l'application pour pouvoir avancer !

    2 - Problème n°1 encore existant : lors de la lecture du csv j'ai des erreurs de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((line = br.readline()) != null) { arrayindexoutofboundsexception: length=9; index=9}
    , lors de modifications du fichier ou de rechargement, je passe à un problème en colonne 12 ou 10 ou 3, je ne trouve pas le point commun car un coup ça bloque plus loin ou pas... mon fichier csv contiendra 20 colonnes maximum mais vite 2000 lignes. Est-ce du à une limitation de capacité de calcul ?...

    3 - J'ai avancé pour mettre mes données dans un recycler view mais j'ai deux (un résolut à 16h34 ) blocages :
    A - Des colonnes correspondent à des togglebutton mais comment faire pour que suivant la lecture des cellules correspondantes le recycler affiche ON / OFF ? et comment le définir ?
    B - Trim() ne fonctionne pas, je n'arrive pas à trouver comment bien l'utiliser afin de supprimer les espaces avant et après mes chaines de caractères...

    MainActivity.java :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    package com.example.lirecsv;
     
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
     
    import android.os.Bundle;
    import android.widget.ProgressBar;
    import android.widget.TextView;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.List;
     
     
    public class MainActivity extends AppCompatActivity {
        RecyclerView recyclerView;
        com.example.lirecsv.Adapter adapter;
        ProgressBar progressBar;
        TextView wait;
        List<String> numerolignetache,nomressourcetache,etagetache,tache,debuttache,fintache,dureetache,remarquestache,niveautache,modificateurtache,datemodiftache,raisonmodiftache,avancement25,avancement50,avancement75,avancement100,avancementrecap;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); //Appel du Layout
     
            recyclerView = findViewById(R.id.recyclerView);
            progressBar = findViewById(R.id.progressBar);
            wait = findViewById(R.id.wait);
     
            // Read the raw csv file
            InputStream is = getResources().openRawResource(R.raw.data);
     
            // Reads text from character-input stream, buffering characters for efficient reading
            BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
     
            // Initialization
            String line = "";
            numerolignetache = new ArrayList<>(); // Colonne A 0
            nomressourcetache = new ArrayList<>(); // Colonne B 1
            etagetache = new ArrayList<>(); // Colonne C 2
            tache = new ArrayList<>(); // Colonne D 3
            debuttache = new ArrayList<>(); // Colonne E 4
            fintache = new ArrayList<>(); // Colonne F 5
            dureetache = new ArrayList<>(); // Colonne G 6
            remarquestache = new ArrayList<>(); // Colonne H 7
            niveautache = new ArrayList<>(); // Colonne I 8
            avancementrecap = new ArrayList<>(); // Colonne Q 16
     
            //
            try {
                //
                while ((line = br.readLine()) != null) {
                    // Définition du séparateur des colonnes du .CSV & TRIM ne fonctionne pas
                    String[] cols = line.trim().split(";");
                    // Test
                    numerolignetache.add(cols[0]);
                    nomressourcetache.add(cols[1]);
                    etagetache.add(cols[2]);
                    tache.add(cols[3]);
                    debuttache.add(cols[4]);
                    fintache.add(cols[5]);
                    dureetache.add(cols[6]);
                    remarquestache.add(cols[7]);
                    niveautache.add(cols[8]);
                    avancementrecap.add(cols[16]);
                }
     
            } catch (IOException e) {
                e.printStackTrace();
            }
            showData();
     
        }
        public void showData() {
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            adapter = new com.example.lirecsv.Adapter(this,tache,debuttache,fintache,dureetache,remarquestache);
            recyclerView.setAdapter(adapter);
        }
    }
    ADAPTER.java :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    package com.example.lirecsv;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.widget.ToggleButton;
    
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import java.util.List;
    
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    
        public List<String> taches,debuttache,fintache,dureetache,remarquestache,avancementrecap;
    
        private LayoutInflater inflater;
    
        public Adapter(Context context,List<String> taches,List<String> debuttache,List<String> fintache,List<String> dureetache,List<String> remarquestache){
            this.taches = taches;
            this.debuttache = debuttache;
            this.fintache = fintache;
            this.dureetache = dureetache;
            this.remarquestache = remarquestache;
            this.inflater = LayoutInflater.from(context); // MAJ de 16h34 :)
        }
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = inflater.inflate(R.layout.planningvue,parent,false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            //String title = titles.get(position);
            //holder.title.setText(title);
            String title = taches.get(position);
            holder.title.setText(title);
        }
    
        @Override
    
        public int getItemCount() {
            //return titles.size();
            return taches.size();
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView title,desc,desc2,desc3,desc4;
            ToggleButton toggleButton25,toggleButton50,toggleButton75,toggleButton100;
    
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.title);
                desc = itemView.findViewById(R.id.desc);
                desc2 = itemView.findViewById(R.id.desc2);
                desc3 = itemView.findViewById(R.id.desc3);
                desc4 = itemView.findViewById(R.id.desc4);
                //toggleButtonrecap = itemView.findViewById(R.id.toggleButtonrecap);
            }
        }
    }
    Main.XML
    Code XML : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
     
     
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginTop="1dp"
            android:layout_marginEnd="2dp"
            android:layout_marginBottom="1dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
     
        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/recyclerView"
            app:layout_constraintEnd_toEndOf="@+id/recyclerView"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/recyclerView" />
     
        <TextView
            android:id="@+id/wait"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="Please Wait"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/progressBar" />
     
     
    </androidx.constraintlayout.widget.ConstraintLayout>

    PLANNINGVUE.XML
    Code XML : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:backgroundTint="?attr/colorButtonNormal"
        android:padding="5dp">
     
        <androidx.cardview.widget.CardView
            android:layout_width="409dp"
            android:layout_height="wrap_content"
            android:padding="10dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
     
     
            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="5dp">
     
     
                <TextView
                    android:id="@+id/title"
                    android:layout_width="260dp"
                    android:layout_height="22dp"
                    android:layout_marginEnd="144dp"
                    android:text="Nom tâche"
                    android:textSize="18sp"
                    android:textStyle="bold"
                    app:layout_constraintBottom_toBottomOf="@+id/toggleButton25"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintVertical_bias="0.384" />
     
                <TextView
                    android:id="@+id/desc"
                    android:layout_width="90dp"
                    android:layout_height="20dp"
                    android:layout_marginTop="8dp"
                    android:text="Début"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/title"
                    app:layout_constraintVertical_bias="0.0" />
     
                <TextView
                    android:id="@+id/desc2"
                    android:layout_width="90dp"
                    android:layout_height="20dp"
                    android:layout_marginTop="8dp"
                    android:text="Fin"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toEndOf="@+id/desc"
                    app:layout_constraintTop_toBottomOf="@+id/title"
                    app:layout_constraintVertical_bias="0.285" />
     
                <TextView
                    android:id="@+id/desc3"
                    android:layout_width="50dp"
                    android:layout_height="20dp"
                    android:layout_marginTop="8dp"
                    android:text="Durée"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toEndOf="@+id/desc2"
                    app:layout_constraintTop_toBottomOf="@+id/title"
                    app:layout_constraintVertical_bias="0.285" />
     
                <TextView
                    android:id="@+id/desc4"
                    android:layout_width="160dp"
                    android:layout_height="20dp"
                    android:layout_marginTop="8dp"
                    android:text="Commentaires"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toEndOf="@+id/desc3"
                    app:layout_constraintTop_toBottomOf="@+id/title"
                    app:layout_constraintVertical_bias="0.285" />
     
                <ToggleButton
                    android:id="@+id/toggleButton25"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_marginBottom="1px"
                    android:layout_marginLeft="1px"
                    android:layout_marginTop="1px"
                    android:layout_marginRight="1px"
                    android:textSize="8sp"
                    tools:ignore="HardcodedText,SmallSp"
                    android:textStyle="bold"
                    android:text="25%"
                    app:layout_constraintEnd_toStartOf="@+id/toggleButton50"
                    app:layout_constraintTop_toTopOf="parent"
    />
     
                <ToggleButton
                    android:id="@+id/toggleButton50"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_marginBottom="1px"
                    android:layout_marginLeft="1px"
                    android:layout_marginTop="1px"
                    android:layout_marginRight="1px"
                    android:textSize="8sp"
                    tools:ignore="HardcodedText,SmallSp"
                    android:textStyle="bold"
                    android:text="50%"
                    app:layout_constraintEnd_toStartOf="@+id/toggleButton75"
                    app:layout_constraintTop_toTopOf="parent" />
     
                <ToggleButton
                    android:id="@+id/toggleButton75"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_marginBottom="1px"
                    android:layout_marginLeft="1px"
                    android:layout_marginTop="1px"
                    android:layout_marginRight="1px"
                    android:textSize="8sp"
                    tools:ignore="HardcodedText,SmallSp"
                    android:textStyle="bold"
                    android:text="75%"
                    app:layout_constraintEnd_toStartOf="@+id/toggleButton100"
                    app:layout_constraintTop_toTopOf="parent" />
     
                <ToggleButton
                    android:id="@+id/toggleButton100"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_marginBottom="1px"
                    android:layout_marginLeft="1px"
                    android:layout_marginTop="1px"
                    android:layout_marginRight="1px"
                    android:textSize="8sp"
                    tools:ignore="HardcodedText,SmallSp"
                    android:textStyle="bold"
                    android:text="100%"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
            </androidx.constraintlayout.widget.ConstraintLayout>
        </androidx.cardview.widget.CardView>
    </androidx.constraintlayout.widget.ConstraintLayout>


    4 - je vais ensuite avoir mes données dans le recycler, puis :
    A - première vue avec un tri suivant les niveaux
    B - Vue suivante, suivant une vérification des niveaux enfants jusqu'au prochain parent ?


    MAJ 16h34 : Nouveau sujet, chercher comment pouvoir cliquer sur les items du recycleurview pour les MAJ

    Bref c'est bien plus simple sur papier de façon logique qu'en application réelle, je pense que je n'ai pas déclaré correctement qqch, qqpart mais je cherche et modifie depuis hier matin sans résoudre mes problèmes...

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Tout d'abord, j'ai une bonne nouvelle pour toi, tu peux tout recommencer depuis le début. Tu remplis des listes qui correspondent à des colonnes de ta recyclerview, mais ca n'est pas du tout la bonne pratique. Normalement, chaque élément de la liste correspond à une ligne de ta recyclerview. Donc il faut que tu crées une classe objet (ex: Planning), qui contient les attributs numéro, début, fin...., et parser le csv te permet de remplir une liste de Planning. C'est cette liste que tu envoies dans l'adapter.

    2 - je pense qu'à 90% le problème vient du csv qui est erroné (un ; ou , en trop...). En gros, l'appli a bien réussi à récupérer les données jusqu'à ce que le formatage du csv ne corresponde pas à ce qu'elle attendait. Du coup, elle ne lit pas la suite.

    3A - je ne comprends pas trop le problème. Tu peux connaitre la position de la cellule dans l'adapter, soit dans onBindViewHolder (position est en paramètre), soit dans le holder (via l'appel de getAdapterPosition()).
    Et pour tes toggleboutons (ou idéalement switch), tu modifies leur "caractère" avec la méthode togglebutton.setChecked(boolean). Plus d'info ici :https://www.tutlane.com/tutorial/and...-with-examples
    Edit: Si tu suis mes consignes du début, ca sera plus simple.

    3B - Il faudrait mettre des log pour savoir à quoi ressembre ta "line", parce que je ne vois pas le problème

    4 - https://stackoverflow.com/questions/...erview-onclick, mais après modif.

    Dernière chose, dans la pratique, encore plus actuellement, on évite d'écrire du code fonctionnel dans une activité. Donc il est préférable de créer un fichier pour le parser qui renvoie directement la liste des Plannings. Ca ne change rien niveau performance, c'est juste une bonne pratique de dév, surtout en java, ou tout est modulable.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur gestion de projet
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Par défaut
    Bon après avoir essayé de tout modifier je bloque :

    MAINACTIVITY:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    package com.example.lirecsv;
     
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
     
    import android.os.Bundle;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.util.Log;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.List;
     
     
    public class MainActivity extends AppCompatActivity {
        RecyclerView recyclerView;
        com.example.lirecsv.Adapter adapter;
        ProgressBar progressBar;
        TextView wait;
        private List<DataPlanning> dataPlannings = new ArrayList<>();
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); //Appel du Layout
     
            recyclerView = findViewById(R.id.recyclerView);
            progressBar = findViewById(R.id.progressBar);
            wait = findViewById(R.id.wait);
     
            // Read the raw csv file
            InputStream is = getResources().openRawResource(R.raw.data);
     
            // Reads text from character-input stream, buffering characters for efficient reading
            BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
     
            // Initialization
            String line = "";
            //
            try {
                //
                while ((line = br.readLine()) != null) {
                    // Définition du séparateur des colonnes du .CSV & TRIM ne fonctionne pas
                    String[] cols = line.trim().split(";");
                    DataPlanning sample = new DataPlanning();
     
                    // Imputation
                    sample.setNumerolignetache(cols[0]);
                    sample.setNomressourcetache(cols[1]);
                    sample.setEtagetache(cols[2]);
                    sample.setTache(cols[3]);
                    sample.setDebuttache(cols[4]);
                    sample.setFintache(cols[5]);
                    sample.setDureetache(cols[6]);
                    sample.setRemarquestache(cols[7]);
                    sample.setNiveautache(cols[8]);
                    sample.setAvancementrecap(cols[16]);
     
                    // Ajout dans la classe
                    dataPlannings.add(sample);
                    // Log the object
                    Log.d("My Activity", "Just created: " + sample);
     
                }
     
            } catch (IOException e) {
                e.printStackTrace();
            }
     
            showData();
     
     
        }
        public void showData() {
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            adapter = new Adapter(this,dataPlannings);
            recyclerView.setAdapter(adapter);
        }
    }
    DATAPLANNING:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    package com.example.lirecsv;
     
       public class DataPlanning {
     
        private String numerolignetache;
        private String nomressourcetache;
        private String etagetache;
        private String tache;
        private String debuttache;
        private String fintache;
        private String dureetache;
        private String remarquestache;
        private String niveautache;
        private String modificateurtache;
        private String datemodiftache;
        private String raisonmodiftache;
        private String avancement25;
        private String avancement50;
        private String avancement75;
        private String avancement100;
        private String avancementrecap;
     
           //---------------------------------------------------------------------
        public String getNumerolignetache() {
            return numerolignetache;
        }
        public void setNumerolignetache(String numerolignetache) {
            this.numerolignetache = numerolignetache;
        }
        //---------------------------------------------------------------------
        public String getNomressourcetache() {
              return nomressourcetache;
        }
        public void setNomressourcetache(String nomressourcetache) {
            this.nomressourcetache = nomressourcetache;
        }
        //---------------------------------------------------------------------
        public String getEtagetache() {
           return etagetache;
        }
        public void setEtagetache(String etagetache) {
           this.etagetache = etagetache;
        }
        //---------------------------------------------------------------------
        public String getTache() {
           return tache;
        }
        public void setTache(String tache) {
          this.tache = tache;
        }
        //---------------------------------------------------------------------
        public String getDebuttache() {
          return debuttache;
        }
        public void setDebuttache(String debuttache) {
          this.debuttache = debuttache;
        }
        //---------------------------------------------------------------------
        public String getFintache() {
          return fintache;
        }
        public void setFintache(String fintache) {
          this.fintache = fintache;
        }
        //---------------------------------------------------------------------
        public String getDureetache() {
               return dureetache;
        }
        public void setDureetache(String dureetache) {
               this.dureetache = dureetache;
        }
        //---------------------------------------------------------------------
        public String getRemarquestache() {
               return remarquestache;
        }
        public void setRemarquestache(String remarquestache) {
               this.remarquestache = remarquestache;
        }
        //---------------------------------------------------------------------
        public String getNiveautache() {
               return niveautache;
        }
        public void setNiveautache(String niveautache) {
               this.niveautache = niveautache;
        }
        //---------------------------------------------------------------------
        public String getModificateurtache() {
               return modificateurtache;
        }
        public void setModificateurtache(String modificateurtache) {
               this.modificateurtache = modificateurtache;
        }
        //---------------------------------------------------------------------
        public String getDatemodiftache() {
               return datemodiftache;
        }
        public void setDatemodiftache(String datemodiftache) {
               this.datemodiftache = datemodiftache;
        }
        //---------------------------------------------------------------------
        public String getRaisonmodiftache() {
               return raisonmodiftache;
        }
        public void setRaisonmodiftache(String raisonmodiftache) {
               this.raisonmodiftache = raisonmodiftache;
        }
        //---------------------------------------------------------------------
        public String getAvancement25() {
           return avancement25;
        }
        public void setAvancement25(String avancement25) {
           this.avancement25 = avancement25;
        }
        //---------------------------------------------------------------------
        public String getAvancement50() {
           return avancement50;
        }
        public void setAvancement50(String avancement50) {
          this.avancement50 = avancement50;
        }
        //---------------------------------------------------------------------
        public String getAvancement75() {
          return avancement75;
        }
        public void setAvancement75(String avancement75) {
               this.avancement75 = avancement75;
        }
        //---------------------------------------------------------------------
        public String getAvancement100() {
               return avancement100;
        }
        public void setAvancement100(String avancement100) {
               this.avancement100 = avancement100;
        }
        //---------------------------------------------------------------------
        public String getAvancementrecap() {
               return avancementrecap;
        }
        public void setAvancementrecap(String avancementrecap) {
               this.avancementrecap = avancementrecap;
        }
     
     
           //---------------------------------------------------------------------
        @Override
        public String toString() {
            return "DataPlanning{" +
                    "0=" + numerolignetache +
                    ",1=" + nomressourcetache +
                    ",2=" + etagetache +
                    ",3=" + tache +
                    ",4=" + debuttache +
                    ",5=" + fintache +
                    ",6=" + dureetache +
                    ",7=" + remarquestache +
                    ",8=" + niveautache +
                    ",9=" + modificateurtache +
                    ",10=" + datemodiftache +
                    ",11=" + raisonmodiftache +
                    ",12=" + avancement25 +
                    ",13=" + avancement50 +
                    ",14=" + avancement75 +
                    ",15=" + avancement100 +
                    ",16=" + avancementrecap +
                    '}';
        }
    }
    ADAPTER:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package com.example.lirecsv;
     
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.ToggleButton;
     
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
     
        private LayoutInflater inflater;
        private List<DataPlanning> DataPlannings = new ArrayList<>();
     
        public Adapter(Context context, List<DataPlanning> dataPlannings){
            Log.d("data", "taches -> "+dataPlannings);
            this.DataPlannings = dataPlannings;
            this.inflater = LayoutInflater.from(context);
        }
     
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = inflater.inflate(R.layout.planningvue,parent,false);
            return new ViewHolder(view);
        }
     
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
           String title = String.valueOf(DataPlannings.get(position));
           holder.title.setText(title);
     
        }
     
        @Override
     
        public int getItemCount() {
            //return titles.size();
           return DataPlannings.size();
        }
     
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView title,desc,desc2,desc3,desc4;
            ToggleButton toggleButton25,toggleButton50,toggleButton75,toggleButton100;
     
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.title);
                desc = itemView.findViewById(R.id.desc);
                desc2 = itemView.findViewById(R.id.desc2);
                desc3 = itemView.findViewById(R.id.desc3);
                desc4 = itemView.findViewById(R.id.desc4);
                //toggleButtonrecap = itemView.findViewById(R.id.toggleButtonrecap);
            }
        }
    }
    RecyclerItemClickListener:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package com.example.lirecsv;
     
    import androidx.recyclerview.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    import android.content.Context;
     
    public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
        private OnItemClickListener mListener;
     
        public interface OnItemClickListener {
                public void onItemClick(View view, int position);
     
                public void onLongItemClick(View view, int position);
        }
     
        GestureDetector mGestureDetector;
     
        public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
            mListener = listener;
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }
     
                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                      if (child != null && mListener != null) {
                           mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                      }
                }
            });
        }
     
        @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
                View childView = view.findChildViewUnder(e.getX(), e.getY());
                if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
                    mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
                    return true;
                }
                return false;
        }
     
        @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
     
        @Override
        public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
    }
     
    RecyclerItemClickListener
    1 - J'ai crée la classe pour l'objet PlanningData mais je ne vois pas où ni comment gérer cet objet genre :
    - Afficher dans le recyclerview objet 1 à 10
    - Afficher objet avec paramètre : tâche visible et tous les autres invisibles - tous visible

    2 - TRIM : Donc Line correspond à la lecture de la ligne dans le csv sans avoir fait la décomposition suivant le ";", donc je me dis que cela fonctionne mais l'item qui nécessite trim est après la décomposition sauf que je n'arrive pas à trouver comment bien le placer...

    3 - Pourquoi un switch semble mieux, niveau code, manipulation ? L'affichage est moins sympa, je voulais lors du clic changer la couleur du fond...

    4 - J'ai ajouté ton lien sur le clic, est-ce que je serai capable de détecter la ligne du recycler donc l'objet avec le numéro fixe et l'item dans l'objet ?

    5 - J'ai essayé de décomposer mon main pour le rendre plus simple en n'ayant quasiment rien dedans qui appelle les fonctions utiles mais je galère un peu, je pense que je manque de compréhensions globales des liens possibles

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    1 - dans onBindViewHolder, tu as accès au ViewHolder dans lequel tu définis tes views enfants. Tu peux y lier tes données à la vue correspondante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
           DataPlanning dataPlanning = DataPlannings.get(position); //en java, les noms de variables commence par une minuscule normalement
           holder.title.setText(dataPlanning.getNumerolignetache()); //c'est un exemple
           holder.desc.setText(dataPlanning.getNomressourcetache());
     
        //pour les paramètres, tu définis tes conditions, ex :
        if (position == 2){
         holder.desc.setVisibility(View.INVISIBLE);
        }
        }
    2 - String[] cols = line.trim().split(";");
    ici, trim enlève les espaces avant et après de la ligne entière. Si tu veux le faire pour tous les éléments, il faudrait boucler dans ton tableau de String. Ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (s: cols){s.trim()}
    Mais comme tu boucles déjà pour remplir chaque dataPlanning, il te suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sample.setNumerolignetache(cols[0].trim()); //à reproduire pour chaque attribut
    3 - c'est juste un élément plus moderne, c'est juste visuel. Tout dépend de ton besoin.

    4 - tu n'as pas choisis le code le plus simple des exemples. Avec la première solution, tu as tout ce qu'il te faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private final OnClickListener mOnClickListener = new MyOnClickListener();
     
    @Override
    public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
        view.setOnClickListener(mOnClickListener);
        return new MyViewHolder(view);
    }
     
    @Override
    public void onClick(final View view) {
        int itemPosition = mRecyclerView.getChildLayoutPosition(view);//tu récupères la position dans la recyclerview, donc aussi dans ton DataPlannings
        DataPlanning dataPlanning = DataPlannings.get(itemPosition);//tu peux donc obtenir le dataPlanning sur lequel tu as cliqué
    }
    Perso, je préfère la solution proposée juste en dessus. Le onClick est alors intégrer dans le viewholder
    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
    ublic class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            TextView title,desc,desc2,desc3,desc4;
            ToggleButton toggleButton25,toggleButton50,toggleButton75,toggleButton100;
     
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                ...
                itemView.setOnClickListener(this);
            }
     
          @Override
          public void onClick(View view) {
                int itemPosition = getAdapterPosition();//tu récupères la position dans la recyclerview, donc aussi dans ton DataPlannings
                DataPlanning dataPlanning = DataPlannings.get(itemPosition);//tu peux donc obtenir le dataPlanning sur lequel tu as cliqué
          }
      }

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur gestion de projet
    Inscrit en
    Février 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur gestion de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2020
    Messages : 5
    Par défaut
    Bonsoir !

    Merci, j'ai tout modifié et tout marche correctement avec tes explications !

    Maintenant je vais passer à la suite :
    - M'occuper du comportement des boutons,
    - Implémenter ce qui se passe quand on clique,
    - Enregistrer les données des clics,
    - Voir comment faire mes affichages parent enfants lors du clic sur l'objet,
    - Exporter les données des clics vers mon csv.

    Je risque de passer un peu de temps avant de revenir demander conseil

Discussions similaires

  1. aide à la programmation Java sur Eclipse
    Par remyhnk dans le forum Eclipse
    Réponses: 2
    Dernier message: 24/07/2017, 14h29
  2. Aide en Programmation Java
    Par lilire dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 03/01/2014, 16h06
  3. Réponses: 1
    Dernier message: 27/01/2011, 13h13
  4. [Language] Aide sur mon premier programme Java?
    Par hash2zo dans le forum Langage
    Réponses: 15
    Dernier message: 27/09/2005, 19h26

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