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 :

Erreur dans le code que je ne comprends pas


Sujet :

Android

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Erreur dans le code que je ne comprends pas
    Bonsoir !
    J'ai 15 ans et j'essaye de programmer mon appli android.
    Je pioche ici et sur votre site concurrent (pour ne pas le nommer) pour m'aider

    Seulement, quand j'ai des problèmes , je suis bien obligé de les régler tout seul, ou de rechercher comment les régler, or là je bloque mais vraiment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick = (Button)findViewById(R.id.generate); {
    Le message d'erreur pour cette ligne est :
    Multiple markers at this line
    - Return type for the method is missing
    - Syntax error, insert ";" to complete FieldDeclaration
    - Syntax error on token "touchAndClick", VariableDeclaratorId expected after
    this token
    - Method breakpoint:TouchPlanets [entry] - findViewById()
    - Syntax error on token ".", ... expected
    - Syntax error on token ";", delete this token
    Donc voilà, y avait d'autres messages d'erreur, mais je les réglais, or là quand je tente de faire un truc ça en rajoute 15 autres partout dans le code

    Merci d'avance à ceux qui prendront le temps de m'aider

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Salut,

    Tu as oublié l'élémentaire!

    Commence par supprimer ton ";". Jamais de ";" avant une accolade. Ensuite il faut nommer ton "touchAndClick" de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick nom = (Button)findViewById(R.id.generate) {
    Supprime aussi l'argument avant "findViewByID", les arguments se mettent toujours après et en l'occurrence je ne pense pas que cet argument soit utile...

    Tu devrais avoir quelque chose qui ressemble à ça normalement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick nom = findViewById(R.id.generate) {
    Mais je pense que tu devrais plutôt utiliser un EventListener.

    Je précise que je ne connais pas l'API Android et que je ne connais pas non plus le fonctionnement du tactile mais je pense que cette réponse pourra déjà t'aider...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par dé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
    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
     
    package :ccool:;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnKeyListener;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
     
        public class :ccool: extends Activity {
        	  // On cherchera à détecter les touchers et les clics sur ce bouton
        	  private Button touchAndClick = null;
        	  private final String defaut = "Vous devez cliquer sur le bouton Générer.";
     
        	  Button generate = null;
        	  TextView result = null;
     
     
        	  @Override
        	  public void onCreate(Bundle savedInstanceState) {
        	    super.onCreate(savedInstanceState);
        	    setContentView(R.layout.touch_and_click);
     
     
     
        	    touchAndClick nom = findViewById(R.id.generate) ;
     
        	    OnClickListener touchAndClickListener;
    			touchAndClick.setOnClickListener(touchAndClickListener);
        }
        	    	private OnClickListener touchAndClickListener = new View.OnClickListener.onClick(View)
        	    	;
        	    	public void onClick(View v) {
        	    	result.setText("Vos ressources : " + String.valueOf(generate));
     
        	    }}
    Les c'est les trucs que je veux pas montrer
    Voilà mon code avec ta modification (et deux trois modifs d'autres parts au passage)


    Alors les erreurs :
    touchAndClick cannot be resolved to a type
    Pour le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick nom = findViewById(R.id.generate) ;
    Ainsi que :

    Multiple markers at this line
    - View cannot be resolved to a variable
    - View.OnClickListener.onClick cannot be resolved
    Pour le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private OnClickListener touchAndClickListener = new View.OnClickListener.onClick(View)
        	    	;
    Alors je vais décrire ce que je veux faire ce sera plus simple :
    Quand l'utilisateur clique sur le bouton "Générer" je veux qu'il y ait un chiffre qui s'ajoute

    Par exemple : Il a un score de 200. En cliquant sur "Générer", il ajoute 1 point il a donc 201 points.

    Alors je sais que c'est beaucoup demandé mais ça fait longtemps que j'ai envie de faire une appli

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Houlà, il te manque de sérieuses base en java avant de te mettre à l'android. T'es occupé de tout mélangé.
    Pour le compilateur, ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick nom = findViewById(R.id.generate) ;
    Ca veux dire "créer un variable, appelée nom, de type touchAndClick et lui attribuer la valeur de retour de la méthode findViewById. Sauf que touchAndClick, ce n'est pas un type mais le nom d'un autre variable, ça ne peux pas marcher.

    Soit tu écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick = findViewById(R.id.generate) ;
    Pour stocker dans la variable touchAndClick
    Soit tu écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button nom = findViewById(R.id.generate) ;
    pour créer la variable nom.


    Ensuite:

    private OnClickListener touchAndClickListener = new View.OnClickListener.onClick(View)

    n'a ni queue ni tête: Il cherche là la classe onClick, déclarée dans la class OnClickListener déclarée dans la classe de la variable View.

    View n'existe pas, en tout cas ce n'est pas une variable
    onClick, c'est une méthode, pas une class.
    View.OnClickListener n'existe pas.


    Sérieusement, ne le prends pas mal, mais prend un bouquin sur java et apprends les bases. Ca prend une semain, mais tu arrivera à faire la distinction entre classe / instance / méthode / champs et variable, ce que tu es actuellement incapable de faire. Ce n'est pas en jetant du code au petit bonheur la chance que tu créera quelque chose.

  5. #5
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Salut,

    Il te manque effectivement quelques notions de POO. Je ne saurais que te conseiller les excellents tuto sur Java disponible ici.

    Bonne journée.
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  6. #6
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Bonjour,

    C'est bien de commencer tot

    La base d'Android est le JAVA. Comme le disent les messages précédents, commences par apprendre les bases du JAVA. Ensuite, il faut débuter Android pas à pas. En effet, même si cette technologie ce base sur la JAVA, la façon de penser est légèrement différente mais loin d'être compliquer je te rassure.
    Il te faut savoir qu'un programme Android est diviser en 2 grandes parties:
    - Les ressources en XML,
    - Et l'intelligence de l'application, les sources, en JAVA.
    Ensuite ces grandes parties sont divisés en sous parties mais je ne vais pas rentrer dans les détails.

    Donc la classe que tu nous montres représente la partie intelligence.

    Cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setContentView(R.layout.touch_and_click);
    signifie que ta classe qui est une activité de ton application, fait référence à une ressources nommés touch_and_click.xml.

    Par la suite, on trouve la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touchAndClick = (Button) findViewById(R.id.generate) ;
    Ce qui veut dire que quelques part dans ton fichier xml tu as:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button android:id="@+id/generate"
    Il nous faudrait ton code xml pour corriger.

    Voici ton code JAVA corrigé. Attention, j'ai ajouté des commentaires car certaines choses sont étranges....
    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
     
    package :ccool:;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnKeyListener;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
     
    public class :ccool: extends Activity {
    	  // On cherchera à détecter les touchers et les clics sur ce bouton
    	  private Button touchAndClick = null;
    	  private final String defaut = "Vous devez cliquer sur le bouton Générer.";
     
    	  // A quoi sert ce bouton?
    	  Button generate = null;
    	  TextView result = null;
     
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.touch_and_click);
     
    		// On relie le bouton au fichier xml
    		touchAndClick = (Button) findViewById(R.id.generate);
     
    		// On relie le TextView au xml (attention ceci veut dire qu'il y a un id appelé result)
    		result = (TextView) findViewById(R.id.result);
     
    		// On déclare l'événement sur le clic su bouton
    		touchAndClick.setOnClickListener(new OnClickListener ()
    		{
    			public void click (View v)
    			{
    				// On affiche quelque chose dans le TextView
    				// generate est un bouton? Que veux tu afficher exactement?????
    				result.setText("Vos ressources : " + String.valueOf(generate));
    			}
    		});
    	}
    }

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 149
    Points : 126
    Points
    126
    Par défaut
    Si tu veux facilement ajouter 1 ou retirer 1 à la valeur d'une variable tu n'as qu'a faire comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    variable++; //Pour ajouter 1
    variable--; //Pour retirer 1

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Wow autant de réponses en si peu de temps ça fait très plaisir !
    Bah ça change des autres communautés du web "élitistes" qui envoient chier tous ceux qui débutent comme moi

    Bah merci beaucoup écoutez.
    Donc je vais tout vous expliquer un peu plus clairement :
    J'ai 15 ans. Depuis quelques années je m'intéresse à la programmation, mais je consacre mon temps au hardware plus qu'à la prog : Je ne sais "coder" qu'en html et css (quoi que ce sont des balises donc pas trop dur) et un peu en c (je m'étais arrêté en sachant coder de tête sans aide une calculette mais pas en fenêtre)

    Et depuis quelques jours je souhaite me mettre à programmer sous Android :
    -Je n'y connais rien en java (pas un troll je vous explique ma situation
    -Je n'y connais rien en XML

    Donc j'apprendrai le java mais c'est vrai que j'ai pas énormément de temps en fait.

    Alors je vais vous donner mes codes sources en l'état actuel :

    activity_touch_planets.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
    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
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".TouchPlanets" >
     
        // Ici je demande le prénom
        <TextView
            android:id="@+id/textView2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/questionprenom"
            android:layout_marginTop="38dp"
            android:gravity="center"
            android:text="Quel est votre prénom ? : "
            android:textColor="#01D758"
            android:textStyle="bold" />
    // Ici c'est "touch planets" affiché 
        <TextView
            android:id="@+id/texttouchplanets"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/texttouchplanets"
            android:layout_alignParentTop="true"
            android:text="TouchPlanets"
            android:textColor="#003366"
            android:textSize="14sp" />
    //Ici je demande le pseudo de la personne
        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/prenom"
            android:layout_below="@+id/prenom"
            android:layout_marginTop="90dp"
            android:gravity="center"
            android:text="Quel serait votre pseudo ? : "
            android:textColor="#01D758"
            android:textStyle="bold" />
    //Ici la personne inscrit son pseudo
        <EditText
            android:id="@+id/pseudo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView1"
            android:layout_below="@+id/textView1"
            android:layout_marginTop="75dp"
            android:ems="10"
            android:hint="Ecrivez votre pseudo ici ..."
            android:inputType="textPersonName" >
     
            <requestFocus />
        </EditText>
    //Ici la personne écrit son prénom
        <EditText
            android:id="@+id/prenom"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView2"
            android:layout_below="@+id/textView2"
            android:layout_marginTop="57dp"
            android:ems="10"
            android:hint="Ecrivez votre prénom ici ..."
            android:inputType="textPersonName" />
        //Ici c'est le bouton suivant
        <Button
            android:id="@+id/boutonsuivant"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="Suivant" />
     
     
     
    </RelativeLayout>
    TouchPlanets.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
    package tsyme.touchplanets;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnKeyListener;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
     
        public class TouchPlanets extends Activity {
        	  // On cherchera à détecter les touchers et les clics sur ce bouton
        	  private Button touchAndClick = null;
        	  private final String defaut = "Vous devez cliquer sur le bouton Générer.";
     
        	  Button generate = null;
        	  TextView result = null;
     
     
        	  @Override
        	  public void onCreate(Bundle savedInstanceState) {
        	    super.onCreate(savedInstanceState);
        	    setContentView(R.layout.touch_and_click);
     
     
     
        	    touchAndClick nom = findViewById(R.id.generate) ;
     
        	    OnClickListener touchAndClickListener;
    			touchAndClick.setOnClickListener(touchAndClickListener);
        }
        	    	private OnClickListener touchAndClickListener = new View.OnClickListener.onClick(View)
        	    	;
        	    	public void onClick(View v) {
        	    	result.setText("Vos ressources : " + String.valueOf(generate));
     
        	    }}
    touch_and_click.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
    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
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".TouchPlanets" >
     
         <Button
             android:id="@+id/generate"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentTop="true"
             android:layout_centerHorizontal="true"
             android:layout_marginTop="169dp"
             android:text="GENERER" />
     
         <TextView
             android:id="@+id/textView1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentLeft="true"
             android:layout_alignParentTop="true"
             android:layout_marginLeft="21dp"
             android:layout_marginTop="16dp"
             android:text="Bienvenue sur Touch Planets ! Veuillez commencer par cliquer sur le bouton ci-dessous  " />
     
         <Button
             android:id="@+id/boutonsuivant"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_alignParentRight="true"
             android:text="Suivant" />
     
         <TextView
             android:id="@+id/textView2"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_above="@+id/boutonsuivant"
             android:layout_alignParentLeft="true"
             android:layout_marginLeft="14dp"
             android:text="Une fois cela fait, veuillez cliquer sur le bouton Suivant." />
     
         <Chronometer
             android:id="@+id/chronometer1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_alignParentLeft="true"
             android:text="Temps passé" />
     
        </RelativeLayout>
    Donc voilà mes différents codes. Tout a été réalisé sans c/c juste pioché sur des sites par-ci par-là avec quelques notions de base simplement.

    Je souhaiterais faire une appli pour commencer avec juste un bouton et en cliquant sur ce bouton ça rajoute des points dans un score affiché.

    Voilà je pense avoir tout dit sur ma situation, sur ce avec beaucoup de courage je vais tenter de me plonger dans le java.
    Merci encore pour votre aide et votre soutien c'est très gentil de votre part

Discussions similaires

  1. Erreur dans mon programme que je n'arrive pas à corriger
    Par alex7443 dans le forum Débuter
    Réponses: 3
    Dernier message: 25/03/2009, 14h46
  2. Réponses: 2
    Dernier message: 18/05/2007, 12h34
  3. code que je ne comprend pas
    Par gloglo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/01/2007, 18h11
  4. [VBA E]erreur incompatibilité de type que je ne comprend pas
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2006, 14h14
  5. Réponses: 5
    Dernier message: 14/05/2006, 22h41

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