2010-06-06 6 views
1

Avant de me lancer, je suis très nouveau sur Android et je viens d'apprendre le Java le mois dernier. J'ai frappé des bosses en essayant de développer ma première application simple. La plupart de ces obstacles ont été sautés grâce à des tutoriels aléatoires en ligne. MON CODE EST TRÈS MESSÉ. Tous les conseils sont appréciés.Comment changer les variables de différentes classes?

La question ci-dessus est assez large, mais c'est ce que je veux faire: C'est essentiellement un calculateur de teneur en alcool dans le sang/gardien de boissons-traqueur. Structure de base: http://i.imgur.com/JGuh7.jpg

Les boutons en bas ne sont que des boutons réguliers, pas ImageButtons (eu des problèmes avec cela) Voici quelques exemples de code d'un:

<Button android:id="@+id/Button01" 
        android:layout_width="wrap_content" 
        android:layout_marginRight="5dp" 
        android:background="@drawable/addbeer"/> 

Les boutons et TextView sont tous dans main.xml .

I ont des variables définies dans une classe appelée Global.java:

package com.dantoth.drinkingbuddy; 

importation android.app.Activity;

public class mondial étend l'activité {

public static double StandardDrinks = 0; 
public static double BeerOunces = 12; 
public static double BeerPercentAlcohol = .05; 
public static double BeerDrink = BeerOunces * BeerPercentAlcohol; 
public static double BeerDrinkFinal = BeerDrink * 1.6666666; 
public static double ShotOunces = 1.5; 
public static double ShotPercentAlcohol = .4; 
public static double ShotDrink = ShotOunces * ShotPercentAlcohol; 
public static double ShotDrinkFinal = ShotDrink * 1.6666666; 
public static double WineOunces = 5; 
public static double WinePercentAlcohol = .12; 
public static double WineDrink = WineOunces * WinePercentAlcohol; 
public static double WineDrinkFinal = WineDrink * 1.6666666; 
public static double OtherOunces; 
public static double OtherPercentAlcohol; 
public static double OtherDrink = OtherOunces * (OtherPercentAlcohol * .01); 
public static double OtherDrinkFinal = OtherDrink * 1.6666666; 
public static double GenderConstant = 7.5; //9 for female 
public static double Weight = 180; 
public static double TimeDrinking = 60; 
public static double Hours = TimeDrinking/60; 
public static double Bac = ((StandardDrinks/2) * (GenderConstant/Weight)) - (0.017 * Hours); 

}

La dernière variable est la partie importante. Il calcule votre taux d'alcoolémie en fonction des facteurs impliqués. Lorsque j'appuie sur le bouton ajouter de la bière (Button01), je l'ajoute 1 à StandardDrinks, simulant une bière. Les autres variables de la formule Bac ont des valeurs qui leur sont assignées dans Global.java.

Le code qui rend le bouton de bière faire des choses est dans ma classe régulière, drinkingbuddy.java:

public class DrinkingBuddy extends Activity { 
/** Called when the activity is first created. */ 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button button = (Button) findViewById(R.id.Button01); 
    button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Global.StandardDrinks = Global.StandardDrinks + Global.BeerDrinkFinal; 
      Toast.makeText(DrinkingBuddy.this, "Mmmm... Beer", Toast.LENGTH_SHORT).show(); 

     } 
     }); 

Par ma perception, StandardDrinks devrait maintenant avoir une valeur de 1. Toutefois, lorsque je clique sur le Calculer Bouton BAC (Button05) il sort simplement la variable Bac comme si StandardDrinks était encore réglé sur 0. Voici le code pour le bouton Calculate BAC (Button05):

Bouton button4 = (Bouton) findViewById (R.id.Button05) button4.setOnClickListener (nouveau {

  TextView texty; 

      texty = (TextView) findViewById(R.id.texty1); 

      texty.setText("Your BAC is " + Global.Bac); 

     } 
     }); 

OnClickListener() { @Override public void onClick (Voir v) Il produit les éléments suivants à la vue du texte:. "Votre taux d'alcoolémie est -0,017" C'est le Bac valeur pour si StandardDrinks était encore 0, donc évidemment il ya un problème de communication entre les classes.Quelqu'un peut-il m'aider ??

Les autres éléments de la formule (poids, temps passé à boire, et l'alcool% et autres) sont des variables parce que je vais finalement permettre à l'utilisateur de changer ces valeurs dans les paramètres

J'ai entendu dire autour du refroidisseur d'eau que les variables globales ne sont pas un bon style de programmation, mais c'est le plus proche que je suis venu de le faire fonctionner. Toutes les autres façons de le faire sont très bien accueillies!

Répondre

1

Il existe des erreurs logiques dans votre programme. Cette variable Bac serait initialisée avec la valeur de la formule. Les changements ultérieurs dans les variables utilisées dans la formule pour calculer le taux d'alcoolémie ne s'y refléteront pas à moins que vous ne le fassiez explicitement. Je recommande d'avoir une fonction pour mettre à jour le BAC comme suit

Vous pouvez faire tout ce qui précède en une seule activité.

 public class DrinkingBuddy extends Activity { 
/** Called when the activity is first created. */ 

double StandardDrinks = 0; 
double BeerOunces = 12; 
double BeerPercentAlcohol = .05; 
double BeerDrink = BeerOunces * BeerPercentAlcohol; 
double BeerDrinkFinal = BeerDrink * 1.6666666; 
double ShotOunces = 1.5; 
double ShotPercentAlcohol = .4; 
double ShotDrink = ShotOunces * ShotPercentAlcohol; 
double ShotDrinkFinal = ShotDrink * 1.6666666; 
double WineOunces = 5; 
double WinePercentAlcohol = .12; 
double WineDrink = WineOunces * WinePercentAlcohol; 
double WineDrinkFinal = WineDrink * 1.6666666; 
double OtherOunces; 
double OtherPercentAlcohol; 
double OtherDrink = OtherOunces * (OtherPercentAlcohol * .01); 
double OtherDrinkFinal = OtherDrink * 1.6666666; 
double GenderConstant = 7.5; //9 for female 
double Weight = 180; 
double TimeDrinking = 60; 
double Hours = TimeDrinking/60; 
double Bac; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button button = (Button) findViewById(R.id.Button01); 
    button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      StandardDrinks = StandardDrinks + BeerDrinkFinal; 
      Toast.makeText(DrinkingBuddy.this, "Mmmm... Beer", Toast.LENGTH_SHORT).show(); 

     } 
     }); 

Button button4 = (Button) findViewById(R.id.Button05); 
button4.setOnClickListener(new OnClickListener() 
{ 
@Override 
public void onClick(View v) { 

      TextView texty; 
      Bac = ((StandardDrinks/2) * (GenderConstant/Weight)) - (0.017 * Hours); 
      texty = (TextView) findViewById(R.id.texty1); 
      texty.setText("Your BAC is " + Bac); 

     } 
     }); 

MON CODE EST très salissant.

Très salissant en effet. J'ai eu du mal à éliminer toutes les déclarations publiques et statiques inutiles. Cette document peut aider sur les conventions à suivre lors de l'écriture de code Java.

Selon ce document cité

Les variables doivent être initialisées où ils sont déclarés et ils devraient être déclarés dans la plus petite portée possible.

Espérons que cela aide un peu dans la bonne direction.

1

Il pourrait y avoir une très longue réponse en ce qui concerne le style de codage et la structure, mais je vais passer cela et garder les questions initiales.Ce n'est pas parce que vous mettez à jour la valeur d'une variable que tout calcul qui a déjà eu lieu avec cette variable est mis à jour. Dans ce contexte, la modification de la valeur de StandardDrinks ne provoque pas automatiquement le recalcul Bac. Plus précisément, le code pour assigner la valeur des variables membres statiques de la classe est exécuté une fois pendant l'installation de la classe bien que je ne sache pas exactement quand la VM dalvik le fait. Le point est chaque fois que StandardDrinks change la valeur dont vous avez besoin pour recalculer Bac.

+1

Le point 1 est erroné. Je pense que vous voulez dire que les variables définies comme «définitives» ne peuvent pas être modifiées. Déclarer 'statique' signifie qu'il y a une variable pour la classe, au lieu d'une pour l'instance. Le point 2 est correct. –

Questions connexes