Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Récupération et transformation EditText

Transformation de la valeur d'un EditText en entier.

Sujet résolu
    6 avril 2012 à 0:21:23

    Bonjour,

    Mon application dispose de deux activités. L'activité principale qui s'affiche lorsqu'on ouvre l'appli qui comporte un EditText et un Bouton. Et une seconde activité qui s'affiche lorsqu'on clique sur le bouton.

    La seconde activité à besoin du contenu de l'EditText de la première pour fonctionner.
    J'ai donc récupéré son contenu, mais lorsque je clique sur le bouton pour passer à la seconde activité l'appli cesse de fonctionner.

    je pense que le problème est dans ma classe "bouncingBallView" a cause de cette ligne qui serre à transformer la valeur rentré dans l'EditText en entier :
    int nobBis = Integer.valueOf((text2.getText()).toString());
    

    mais je ne suis pas sure, je met le reste de mon code au cas ou :


    Layout de l'activité principale (le deuxième bouton on s'en fiche) :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bouncing Balls"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <EditText
            android:id="@+id/TextNumberBalls"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="Number of balls"
            android:inputType="numberDecimal" />
    
        <Button
            android:id="@+id/bouton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Start !" />
    
        <Button
            android:id="@+id/bouton2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Start 2 !" />
    	
    </LinearLayout>
    


    Activité principale :
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    
    public class AppliActivity extends Activity implements OnClickListener
    {
    	Button monBouton = null;
    	Button monBouton2 = null;
    	
            @Override 
    	public void onCreate(Bundle savedInstanceState) {
    	 
    		super.onCreate(savedInstanceState);
    		
     
    		setContentView(R.layout.main);
    		Button monBouton = (Button)findViewById(R.id.bouton);
    		Button monBouton2 = (Button)findViewById(R.id.bouton2);
    		monBouton2.setOnClickListener(this);
    		monBouton.setOnClickListener(this);
    		
    		
    		 
    	}
    public void onClick (View v)
    {
    	switch(v.getId())
        {
            
            case R.id.bouton:
            	//Toast.makeText(this,"Start", Toast.LENGTH_SHORT).show();
        		Intent monIntent = new Intent(this,ActiviteDeux.class);
        		
        		startActivity(monIntent);
    	break;
    		
            
    	case R.id.bouton2:
    		//Toast.makeText(this,"Start 2", Toast.LENGTH_SHORT).show();
    		Intent monIntent2 = new Intent(this,ActiviteTrois.class);
    		
    		startActivity(monIntent2);
    	break;
    	
        }
    		
    }
    }
    


    le clique sur le bouton nous emmène vers l'activité deux :
    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    
    public class ActiviteDeux extends Activity {
    	   
    	   @Override
    	   public void onCreate(Bundle savedInstanceState) {
    	      super.onCreate(savedInstanceState);
    	      View bouncingBallView = new BouncingBallView(this); 
    	      requestWindowFeature(Window.FEATURE_NO_TITLE);
    	      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    	      super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    	      setContentView(bouncingBallView);
    	   }
    	   
    	   
    	}
    


    Et dans l'activité deux, il y a la classe "bouncingBallView" :

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.view.View;
    import android.widget.EditText;
       
    public class BouncingBallView extends View {
       private int xMin = 0;        // This view's bounds
       private int xMax;
       private int yMin = 0;
       private int yMax;
       EditText TextNumberBalls = (EditText) findViewById(R.id.TextNumberBalls);
       EditText text2 = TextNumberBalls;
       //String nob = "500";
       //private float nobBis = 0;
       int nobBis = Integer.valueOf((text2.getText()).toString());
       private int numberBalls = nobBis;
       //private int numberBalls = 10;
       private float ballRadius = 5; // Ball's radius
       private float[] ballX = new float[numberBalls]; // Ball's center (x,y)
       private float[] ballY = new float[numberBalls];
       private float[] ballSpeedX = new float[numberBalls]; 
                        ...
    

    (je n'ai pas mis la classe bouncingBallView en entier car elle est longue et je pense que ce n'ait pas nécessaire pour résoudre mon problème.)

    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      6 avril 2012 à 9:31:48

      Bonjour,

      Pour forcer la saisie de chiffres dans un champ texte, utilise l'attribut android:inputMethod = "number" dans ton XML.

      De plus, tu ne peux pas accéder à ton TextEdit tant que tu n'as pas fait de setContentView(). C'est pour ça que ton appli crashe.

      A la place, passe le contenu de ton champ texte dans l'Intent qui lance ta deuxième Activity grâce à la méthode putExtra() (ragarde la doc pour la signature de la méthode).
      Ensuite, tu récupères cette valeur dans le onCreate() de ton Activity et tu la passes dans le constructeur de ta BouncingBallView .
      • Partager sur Facebook
      • Partager sur Twitter
        6 avril 2012 à 13:07:12

        Merci, tu à déjà résolu un problème.
        Mais maintenant, l'application cesse de fonctionner dès le lancement, c'est a cause de l'attribut android:inputMethod = "number", je l'ai enlevé et l'appli se lance.
        Mais la méthode :
        int nobBis = Integer.valueOf((text2.getText()).toString());
        

        pour transformer l'EditText en entier fait toujours plantée l'appli lorsque je veux lancer l'activité deux.
        Sinon, putExtra() et getIntExtra() fonctionnent bien, mon seul problème reste donc la transformation de l'EditText qui fait planter l'appli.
        • Partager sur Facebook
        • Partager sur Twitter
          6 avril 2012 à 13:53:50

          Je me suis trompé, c'est android:inputType = "number" qu'il faut utiliser.

          Et pour parser ta chaine, c'est avec le code suivant:
          int nobBis = Integer.parseInt(text2.getText().toString());
          

          Car parseInt() renvoie un int alors que valueOf() renvoie un Integer.

          Edit: C'est normal que ça plante si tu parse une chaine non numérique. Par exemple, si j'écris Fumble, ça va crasher. Peut être un test au préalable au moyen d'une RegExp ne serait pas superflu...
          Comme ça, tu fais la vérif dans ta première Activity et tu ne lances la secondes que si tout est OK.

          int nobBis = -1;
          Pattern pattern = Pattern.compile("[0-9]+");
          String myString = text2.getText().toString().trim();
          Matcher matcher = pattern.matcher(myString);
          if(matcher.matches()) {
              noBis = Integer.parseInt(myString);
              Intent myIntent = new Intent(this,ActiviteDeux.class);
              myIntent.putExtra("myName", noBis);
              startActivity(monIntent);
          } else {
              // On affiche un message d'erreur.
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            6 avril 2012 à 18:10:07

            Merci beaucoup Fumble c'est bon ça marche avec :
            int nobBis = Integer.parseInt(text2.getText().toString());
            


            J'ai aussi géré les exceptions suivantes :
            • - Si l'EditText est vide
            • - Si le nombre entré n'est pas un entier
            • - Si le nombre entré est trop grand


            Voila le code qui fonctionne :
            public void onClick (View v)
            {
            	switch(v.getId())
                {
                    
                    case R.id.bouton:
                		Intent monIntent = new Intent(this,ActiviteDeux.class);
                		EditText TextNumberBalls = (EditText) findViewById(R.id.TextNumberBalls);
                		String nob = TextNumberBalls.getText().toString();
                		try {
            	    		if(nob != null && nob.length() > 0){
            	        	    int nobBis = Integer.parseInt(nob);
            	            	    int numberBalls = nobBis;
            	            	    if (numberBalls <= 10000){
            	            		monIntent.putExtra("numberBalls",numberBalls);
            	            		startActivity(monIntent);
            	            	    }
            	            	    else{Toast.makeText(this,"Enter an Integer less or equal to 10,000!", Toast.LENGTH_SHORT).show();}
            	    		    }
            	    		else {Toast.makeText(this,"Enter a number of balls!", Toast.LENGTH_SHORT).show();}
                			}
                		catch (Exception e) {
                			Toast.makeText(this,"Enter an Integer less or equal to 10,000!", Toast.LENGTH_SHORT).show();
                		}		
            	break;
                                               ...
            
            • Partager sur Facebook
            • Partager sur Twitter
              6 avril 2012 à 18:39:15

              Cool ! :)

              Un conseil quand tu testes si une String est vide. Utilise la fonction trim() avant de comparer. Elle permet de supprimer les espaces avant et après la chaine saisie.

              Par exemple " test" deviendra "test" et "Hello world " deviendra "Hello world".

              Donc:
              if(str.trim().length() > 0) {
                  // Blabla...
              }
              

              Tu peux également faire:
              if(!str.trim().equals("")) {
                  // Blabla...
              }
              
              • Partager sur Facebook
              • Partager sur Twitter
                6 avril 2012 à 19:22:15

                Je n'ai pas besoin de géré les espaces avant et après car avec android:inputType="numberDecimal" le clavier qui apparait pour la saisie des chiffres ne permet pas de faire des espaces. Ce clavier permet d'écrire des chiffres et un point. Et les zéros en début de chaine ne sont pas pris en compte si j'écris "000010" il comprend "10".

                Voila la classe BouncingBallView au complet si ça interresse quelqu'un.
                Elle affiche des balles de position et de vitesse aléatoire qui rebondissent contre les bords de l'écrant et affiche le nombre de frame par seconde (FPS). Le nombre de balles est choisie avant dans l'EditText qui me posait problème.

                import android.content.Context;
                import android.graphics.Canvas;
                import android.graphics.Color;
                import android.graphics.Paint;
                import android.graphics.RectF;
                import android.view.View;
                   
                public class BouncingBallView extends View {
                   private int xMin = 0;        // This view's bounds
                   private int xMax;
                   private int yMin = 0;
                   private int yMax;
                   private int numberBallsMax = 10000;
                   private int numberBalls;
                   private float ballRadius = 5;
                   private float[] ballX = new float[numberBallsMax]; // Ball's center (x,y)
                   private float[] ballY = new float[numberBallsMax];
                   private float[] ballSpeedX = new float[numberBallsMax];  // Ball's speed (x,y)
                   private float[] ballSpeedY = new float[numberBallsMax];
                   private RectF ballBounds;      // Needed for Canvas.drawOval
                   private Paint paint;
                   private Paint  fpsPaint=new Paint();
                   private long now;
                   private int framesCount=0;
                   private int framesCountAvg=0;
                   private long framesTimer=0; 
                   private int[] tabPaint = new int[numberBallsMax];
                   private int tabColor[] = {Color.BLUE, Color.CYAN, Color.GREEN, Color.MAGENTA, Color.RED/*, Color.WHITE*/, Color.YELLOW};
                   
                
                   // Constructor
                   public BouncingBallView(Context context, int numberOfBalls) {
                      super(context);
                      ballBounds = new RectF();
                      paint = new Paint();
                      fpsPaint.setTextSize(50);
                      fpsPaint.setAntiAlias(true);
                      numberBalls = numberOfBalls;
                      for(int i = 0 ; i < numberBalls ; i++){
                    	  ballX[i] = ballRadius + (int) (Math.random() * 480);
                    	  ballY[i] = ballRadius + (int) (Math.random() * 800);
                    	  do{
                    		  ballSpeedX[i] = (int) (Math.random() * -10 + 5);
                    		  ballSpeedY[i] = (int) (Math.random() * -10 + 5);
                    	  }while(ballSpeedX[i] == 0 || ballSpeedY[i] == 0);
                       }
                      for(int i = 0 ; i < numberBalls ; i++){
                    	  tabPaint[i] = tabColor[(int) (Math.random() * (tabColor.length))];
                      }
                      /*this.setFocusable(true);
                      this.requestFocus();
                      this.setFocusableInTouchMode(true);*/
                      
                   }
                   
                    
                   @Override
                   protected void onDraw(Canvas canvas) {
                	   
                	   // Draw the balls
                	   paint.setAntiAlias(true);
                	   for(int i = 0; i < numberBalls ; i++){
                		   paint.setColor(tabPaint[i]);
                		   ballBounds.set(ballX[i]-ballRadius, ballY[i]-ballRadius, ballX[i]+ballRadius, ballY[i]+ballRadius);
                		   canvas.drawOval(ballBounds, paint);
                	   }
                	// Measure and display FPS
                	   now = System.currentTimeMillis(); 
                	   canvas.drawText("FPS : "+framesCountAvg, 0, 50, fpsPaint);
                	   framesCount++;
                       if(now-framesTimer>1000){
                               framesTimer=now;
                               framesCountAvg=framesCount;
                               framesCount=0;
                       } 
                       
                        
                         if( framesCountAvg>50)
                        	 fpsPaint.setColor(Color.GREEN);
                           
                           
                         if (framesCountAvg>29 && framesCountAvg<49) 
                        	 fpsPaint.setColor(Color.YELLOW);
                           
                           
                         if (framesCountAvg<30)
                        	 fpsPaint.setColor(Color.RED);
                                        
                       
                       
                	   update();
                	   invalidate();  // Force a re-draw  
                   }
                   
                
                   
                   // Detect collision and update the position of the ball.
                   private void update() {
                	      // Get new (x,y) position
                	   for(int i = 0; i < numberBalls ; i++){
                	      ballX[i] += ballSpeedX[i];
                	      ballY[i] += ballSpeedY[i];
                	      // Detect collision and react
                	      if (ballX[i] + ballRadius > xMax) {
                	         ballSpeedX[i] = -ballSpeedX[i];
                	         ballX[i] = xMax-ballRadius;
                	      } else if (ballX[i] - ballRadius < xMin) {
                	         ballSpeedX[i] = -ballSpeedX[i];
                	         ballX[i] = xMin+ballRadius;
                	      }
                	      if (ballY[i] + ballRadius > yMax) {
                	         ballSpeedY[i] = -ballSpeedY[i];
                	         ballY[i] = yMax - ballRadius;
                	      } else if (ballY[i] - ballRadius < yMin) {
                	         ballSpeedY[i] = -ballSpeedY[i];
                	         ballY[i] = yMin + ballRadius;
                	      }
                	      
                	     }
                	     
                	   }
                   
                   // Called back when the view is first created or its size changes.
                   @Override
                   public void onSizeChanged(int w, int h, int oldW, int oldH) {
                      // Set the movement bounds for the ball
                      xMax = w-1;
                      yMax = h-1;
                   }
                }
                
                • Partager sur Facebook
                • Partager sur Twitter
                  6 avril 2012 à 21:25:00

                  C'était juste une remarque d'ordre générale, pas forcément liée au bout de code que tu as posté.

                  En tout cas, bonne chance pour le développement de ton appli !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Android] Récupération et transformation EditText

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown