Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Comment écrire son programme proprement

    14 janvier 2013 à 20:14:58

    Bonjour, je travaille depuis un moment sur un projet android, et j'ai du mal à trouver des tutoriels sur comment écrire correctement un programme.

    On m'a dit que pour qu'un programme soit lisible, il faut qu'il y ait une classe/activité par fichier. J'ai donc essayé de décomposer mon programme, d'un côté la boussole et de l'autre le gps. Le programe fonctionne, j'obtiens ma position, ma vitesse.

    Par contre, je ne vois pas comment je peux faire pour récupérer ici l'orientation de ma boussole. Je pensais au début à instancier un objet de la classe Boussole du genre  et de le placer dans le onCreate() de la classe Gps:

    SensorEventListener bos;

    bos=new Boussole();

    Mais cela n'amène à rien ce qui paraît logique... Je suis bloqué sur quelque chose de bête, si une âme charitable passe par la, merci d'avance!

    package com.example.version2;
    
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.hardware.Sensor;
    import android.hardware.SensorManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.speech.tts.TextToSpeech;
    import android.speech.tts.TextToSpeech.OnInitListener;
    import android.view.MotionEvent;
    import android.widget.TextView;
    import android.hardware.*;
    
    
    public class Gps extends Activity {
       //Declaration de toutes les variables
    	private SensorManager gestionCapteurs;
    	private Sensor orientation;
        
        //Declaration des vues
    	private TextView mTxtViewlong;
    	private TextView mTxtViewlat;
    	private TextView mTxtViewvit; 
    	private TextView mTxtViewcap;
    	private TextView mTxtViewdis;
    	private TextView mTxtViewbou;
    
    	private TextToSpeech tts=null;
    	LocationListener pos;
    	SensorEventListener bos;
    	
    	private static final String DEBUG_TAG = "buoyfinder";
    	
    	//Lecture des parametres
    	//private TextToSpeech tts = null;
    	
    	private static final int CODE_DE_MON_ACTIVITE = 1;
       
       //Appellee quand le programme est cree
        @Override
        public void onCreate(Bundle savedInstanceState)  {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_gps);
    
            mTxtViewlat = (TextView) findViewById(R.id.latitude);
            mTxtViewlong = (TextView) findViewById(R.id.longitude);
            mTxtViewvit = (TextView) findViewById(R.id.vitesse);
            mTxtViewcap = (TextView) findViewById(R.id.cap);
            mTxtViewdis = (TextView) findViewById(R.id.distance);
            mTxtViewbou = (TextView) findViewById(R.id.boussole);
    
    		Log.v(DEBUG_TAG, "lancement onCreate");	
    		
            //Utilisation  de la class LocationManager pour le gps
            LocationManager localisations = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            localisations.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, new ChangementPosition()); //Si le temps =5000(ms) ou si la distance varie de 5m alors ça fonctionne
    	    
    	    gestionCapteurs =  (SensorManager) getSystemService(Context.SENSOR_SERVICE);     
    	    orientation = gestionCapteurs.getDefaultSensor(Sensor.TYPE_ORIENTATION);
            
    
            
        	//OnInitListener Creation
        	OnInitListener onInitListener = new OnInitListener() {
        		@Override
        		public void onInit(int status) {
        			//Toast.makeText(getApplicationContext(), (Integer.valueOf(status)).toString(), Toast.LENGTH_SHORT).show();
        		}
        	};
        	
            // tts creation
        	tts = new TextToSpeech(this, onInitListener);
        } //end of onCreate
    
       
        
        class ChangementPosition implements LocationListener {
        	
            public void onLocationChanged(Location position) {
            	//boucle de test
        		Location l1 = new Location("");
        		l1.setLatitude(position.getLatitude());
        		l1.setLongitude(position.getLongitude());
        		
        		Location l2= new Location("");
        		l2.setLatitude(48.3597);
        		l2.setLongitude(-4.5705);
        		int distance = (int)l1.distanceTo(l2);
         	    mTxtViewdis.setText("distance : "+distance);	
         	    
         	    tts.speak("La distance entre ma maison et le technopole est de : " + distance + "metres", TextToSpeech.QUEUE_FLUSH, null);
    
        	
               if (position!=null) {
            	   mTxtViewlat.setText("Latitude : "+position.getLatitude());
            	   mTxtViewlong.setText("Longitude : "+position.getLongitude());  
                   mTxtViewvit.setText("vitesse : "+position.getSpeed());  
                   mTxtViewcap.setText("cap : "+position.getBearing());
                     
               }
               else mTxtViewlat.setText("Position  non déterminée ");
               
            }
            public void onStatusChanged(String fournisseur, int statut, Bundle extras) {  }
            public void onProviderEnabled(String fournisseur) {  }
            public void onProviderDisabled(String fournisseur) {  } 
        }
    }




    package com.example.version2;
    
    
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.*;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class Boussole extends Activity implements SensorEventListener {
    	   private SensorManager gestionCapteurs;
    	   private Sensor orientation;
    	   private TextView mTxtViewbou;
    
    	   
    	   public void onSensorChanged(SensorEvent evt) {
    	      if (evt.sensor.getType() == Sensor.TYPE_ORIENTATION) {
    	         String cap = "";
    	         float x = evt.values[0];
    	         if (x<11.25 || x>=348.75) cap ="Nord";
    	         else if (x>11.25 && x<33.75) cap ="Nord-Nord-Est";
    	         else if (x>33.75 && x<56.25) cap ="Nord-Est";
    	         else if (x>56.25 && x<78.75) cap ="Est-Nord-Est";
    	         else if (x>78.75 && x<101.25) cap ="Est";
    	         else if (x>101.25 && x<123.75) cap ="Est-Sud-Est";
    	         else if (x>123.75 && x<146.25) cap ="Sud-Est";
    	         else if (x>146.25 && x<168.75) cap ="Sud-Sud-Est";
    	         else if (x>168.75 && x<191.25) cap ="Sud";
    	         else if (x>191.25 && x<213.75) cap ="Sud-Sud-Ouest";
    	         else if (x>213.75 && x<236.25) cap ="Sud-Ouest";
    	         else if (x>236.25 && x<258.75) cap ="Ouest-Sud-Ouest";
    	         else if (x>258.75 && x<281.25) cap ="Ouest";
    	         else if (x>281.25 && x<303.75) cap ="Ouest-Nord-Ouest";
    	         else if (x>303.75 && x<326.25) cap ="Nord-Ouest";
    	         else if (x>326.25 && x<348.75) cap ="Nord-Nord-Ouest";
    	         mTxtViewbou.setText("x:"+x+ cap);
    	      }
    	   }
    
    	   public void onAccuracyChanged(Sensor capteur, int precision) {   }
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2013 à 10:49:05

      Bonjour,

      Pourquoi ne pas créer une méthode récupérant tes données GPS que tu peux appeler dans ta classe principale ?

      • Partager sur Facebook
      • Partager sur Twitter
        22 janvier 2013 à 22:10:36

        Je te conseille de lire le tutorial sur la poo en JAVA. Android sans avoir un niveau convenable en Java c'est du suicide.

        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2013 à 20:44:56

          +1 pour mon VDD

          Je ne sais pas qui t'a dit qu'il devait y avoir une activité par fichier (ça dépend aussi ce que tu veux dire exactement par fichier), mais il faut savoir qu'une activité est une page destiné à être affiché dans ton application Android, soit en tant que telle soit dans un autre activité, en tant qu'activité intégré. Mais peu importe, ça reste une page. Tu peux très bien écrire un programme Java normal, dans ce cas il n'y a pas d'activité donc comment tu feras ? :D

          Il ne faut donc surtout pas créer une activité par objet !!! C'est même tout l'inverse de ce qu'il faut faire, puisqu'en général on essaye de séparer au maximum la partie logique de l'application de la partie graphique.

          Dans ton cas, je verrais bien un objet Boussole qui permet simplement de récupérer les valeurs des capteurs et modifier le cap en conséquence. Ensuite si besoin, une activité qui affiche ces données. Mais honnêtement tu n'as pas besoin d'une page entière juste pour ça, tu peux très bien afficher le cap en tant que simple texte (TextView).

          Ensuite j'ai envie de dire que pour faire un programme propre, ça dépend uniquement de toi. Il n'y a pas de solution miracle, et le nombre de fichiers ne rendra pas ton code plus lisible et ton programme mieux conçu si tu es mauvais programmeur (je ne dis pas ça spécialement pour toi, c'est pareil pour tout le monde).

          De plus, il y a (presque) toujours plusieurs façons d'arriver à un résultat, surtout en programmation. C'est aussi pour cette raison qu'il n'y a pas de tutoriel sur "comment faire un programme propre". Par contre il existe des manières de structurer son code courantes qu'on appelle des patrons de conception, ou design pattern. Je te conseille de chercher sur le pattern MVC.

          • Partager sur Facebook
          • Partager sur Twitter
          ⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
            25 janvier 2013 à 23:05:48

            Au final j'ai pris le temps de lire des choses par ci par la qui m'ont éclairés^^. J'ai donc écrit le programme de cette façon ainsi qu'un main qui n'est pas fourni, il est un peu long.

            package com.example.version4;
            
            public class Boussole 
            {
            	private float x;
            	private String cap;
            
            	public String getOrientation(float x) {
            		if (x<11.25 || x>=348.75) cap ="Nord";
                    else if (x>11.25 && x<33.75) cap ="Nord-Nord-Est";
                    else if (x>33.75 && x<56.25) cap ="Nord-Est";
                    else if (x>56.25 && x<78.75) cap ="Est-Nord-Est";
                    else if (x>78.75 && x<101.25) cap ="Est";
                    else if (x>101.25 && x<123.75) cap ="Est-Sud-Est";
                    else if (x>123.75 && x<146.25) cap ="Sud-Est";
                    else if (x>146.25 && x<168.75) cap ="Sud-Sud-Est";
                    else if (x>168.75 && x<191.25) cap ="Sud";
                    else if (x>191.25 && x<213.75) cap ="Sud-Sud-Ouest";
                    else if (x>213.75 && x<236.25) cap ="Sud-Ouest";
                    else if (x>236.25 && x<258.75) cap ="Ouest-Sud-Ouest";
                    else if (x>258.75 && x<281.25) cap ="Ouest";
                    else if (x>281.25 && x<303.75) cap ="Ouest-Nord-Ouest";
                    else if (x>303.75 && x<326.25) cap ="Nord-Ouest";
                    else if (x>326.25 && x<348.75) cap ="Nord-Nord-Ouest";
            		return cap;
            	}
            	
            	public float getCap(){
            		return x;
            	}
            }
            package com.example.version4;
            
            import android.location.Location;
            import android.os.Bundle;
            //import android.speech.tts.TextToSpeech;
            import android.widget.TextView;
            
            public class ChangementPosition {
            	
            	private TextView mTxtViewlong;
            	private TextView mTxtViewlat;
            	private TextView mTxtViewvit; 
            	private TextView mTxtViewcap;
            	private TextView mTxtViewdis;
            	private TextView mTxtViewbou;
            	private double lat;
            	
            	public float onPlaceChanged(Location position) {
                	//boucle de test
            		Location l1 = new Location("");
            		l1.setLatitude(position.getLatitude());
            		l1.setLongitude(position.getLongitude());
            		
            		Location l2= new Location("");
            		l2.setLatitude(48.3597);
            		l2.setLongitude(-4.5705);
            		int distance = (int)l1.distanceTo(l2);
             	    //mTxtViewdis.setText("distance : "+distance);	
             	    
            
            	
                   if (position!=null) {
                	   
                	   //mTxtViewlat.setText("Latitude : "+position.getLatitude());
                	   //mTxtViewlong.setText("Longitude : "+position.getLongitude());  
                       //mTxtViewvit.setText("vitesse : "+position.getSpeed());  
                       //mTxtViewcap.setText("cap : "+position.getBearing());
                         
                   }
                   else mTxtViewlat.setText("Position  non déterminée ");
                   return distance;
                   
                }
            
            	
            	
            }
            

             Et Minde, ce que j'entendais surtout par programme propre, c'est les règles de programmation pour android. Je vais jeter un coup d'oeil au pattern MVC, merci du conseil en tout cas.



            • Partager sur Facebook
            • Partager sur Twitter

            [Android] Comment écrire son programme proprement

            × 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