Как мне изменить переменные из разных классов? - PullRequest
1 голос
/ 06 июня 2010

Прежде чем углубиться в это, я очень плохо знаком с Android, и я только начал изучать Java в прошлом месяце. Я столкнулся с трудностями, пытаясь разработать свое первое простое приложение. Большинство из этих препятствий были преодолены благодаря случайным онлайн-учебникам. МОЙ КОД ОЧЕНЬ МЕССИ. Любые советы приветствуются.

Вышеупомянутый вопрос довольно широк, но я хочу сделать следующее: по сути, это калькулятор содержания алкоголя в крови / отслеживатель напитков. Базовая раскладка: http://i.imgur.com/JGuh7.jpg

Кнопки внизу - это обычные кнопки, а не кнопки ImageButton (с этим были проблемы). Вот пример кода:

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

Все кнопки и TextView находятся в main.xml.

У меня есть переменные, определенные в классе Global.java:

package com.dantoth.drinkingbuddy;

import android.app.Activity;

открытый класс Global extends Activity {

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);

}

Последняя переменная является важной частью. Он рассчитывает ваш BAC на основе вовлеченных факторов.

Когда я нажимаю кнопку добавления пива (Button01), я добавляю 1 к стандартным напиткам, имитируя выпивку одного пива. Другим переменным в формуле Bac присвоены значения в Global.java.

Код, который заставляет пивные кнопки делать что-то, находится в моем обычном классе, drinkbuddy.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();

        }
        });

По моему мнению, StandardDrinks теперь должно иметь значение 1. Однако, когда я нажимаю кнопку «Рассчитать BAC» (Button05), она просто выводит переменную Bac, как будто StandardDrinks все еще имеет значение 0. Вот код для вычисления Кнопка BAC (Button05):

Кнопка button4 = (Кнопка) findViewById (R.id.Button05); button4.setOnClickListener (new OnClickListener () { @Override public void onClick (View v) {

            TextView texty;

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

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

        }
        });

В текстовое представление выводится следующее: «Ваш BAC -0.017». Это значение Bac, если StandardDrinks был по-прежнему равен 0, поэтому очевидно, что существует некоторая проблема связи между классами. Кто-нибудь может мне помочь ??

Другие элементы формулы (вес, время, потраченное на употребление алкоголя,% алкоголя и т. Д.) Являются переменными, поскольку в конечном итоге я позволю пользователю изменять эти значения в настройках.

Я слышал от кулера о воде, что глобальные переменные не являются хорошим стилем программирования, но это самое близкое к тому, чтобы заставить его работать. Любые другие способы сделать это очень приветствуются!

Ответы [ 2 ]

1 голос
/ 06 июня 2010

В вашей программе есть некоторые логические ошибки.

public static double Bac = ((StandardDrinks / 2) * (GenderConstant / Weight)) - (0.017 * Hours);

Эта переменная Bac будет инициализирована значением формулы. Дальнейшие изменения в переменных, используемых в формуле для расчета BAC, не отразятся на этом, если вы явно не сделаете это. Я бы порекомендовал иметь функцию для обновления BAC следующим образом

Вы можете сделать все вышеперечисленное в одном упражнении.

       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 );

        }
        });

МОЙ КОД ОЧЕНЬ МЕССИ.

Очень грязно. Мне было трудно удалить все ненужные публичные и статичные объявления. Этот документ может помочь в соглашениях, которым необходимо следовать при написании кода Java.

Согласно цитате из этого документа

Переменные должны быть инициализированы где они объявлены, и они должны быть заявлено в наименьшем объеме возможно.

Надеюсь, это поможет немного в правильном направлении.

1 голос
/ 06 июня 2010

Может быть очень длинный ответ относительно стиля и структуры кодирования, но я пропущу это и остановлюсь на предварительных проблемах.

То, что вы обновляете значение переменной, не означает, чтовычисления, которые когда-либо имели место с этой переменной, обновляются.В этом контексте изменение значения StandardDrinks не приводит к автоматическому пересчету Bac.В частности, код для присвоения значения статическим переменным-членам класса запускается один раз во время настройки класса, хотя на самом деле я не знаю точно, когда это делает виртуальная машина dalvik.Точка - это каждый раз, когда StandardDrinks меняет значение, которое нужно пересчитать Bac.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...