如何更改不同类中的变量?

时间:2010-06-06 02:55:00

标签: java android variables button global-variables

在我深入研究之前,我对Android很新,我上个月刚开始学习Java。在尝试开发我的第一个简单的应用程序时,我遇到了麻烦。由于在线随机教程,大多数障碍都被跳了出来。我的代码非常有用。任何提示都表示赞赏。

上面的问题相当广泛,但这就是我想要做的事情:它本质上是一个血液酒精含量计算器/饮料管理员跟踪器。基本布局:http://i.imgur.com/JGuh7.jpg

底部的按钮只是常规按钮,而不是ImageButtons(有问题)以下是一个示例代码:

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

公共类全局扩展活动{

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)时,我将它添加到StandardDrinks,模拟喝一杯啤酒。 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.但是,当我单击Calculate BAC按钮(Button05)时,它仅输出变量Bac,就好像StandardDrinks仍然设置为0.以下是Calculate的代码BAC按钮(Button05):

按钮button4 =(按钮)findViewById(R.id.Button05);         button4.setOnClickListener(new OnClickListener(){             @覆盖             public void onClick(查看v){

            TextView texty;

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

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

        }
        });

它将以下内容输出到文本视图:“您的BAC是-0.017”。如果StandardDrinks仍为0,则这是Bac值,因此显然在类之间进行通信存在一些问题。任何人都可以帮助我吗?

公式的其他元素(体重,饮酒时间和酒精%等)是变量,因为我最终会允许用户在设置中更改这些值。

我听说水冷却器全局变量不是很好的编程风格,但这是我最接近它的工作方式。任何其他方式都非常受欢迎!

2 个答案:

答案 0 :(得分:1)

关于编码风格和结构可能会有很长的响应,但我会跳过这一点并继续讨论前期问题。

仅仅因为更新变量的值并不意味着更新了该变量所发生的任何计算。在此上下文中,更改StandardDrinks的值不会导致Bac自动重新计算。具体来说,分配类静态成员变量值的代码在类设置期间运行一次,尽管我实际上并不确切知道dalvik VM何时执行此操作。每次StandardDrinks更改值时,您需要重新计算Bac

答案 1 :(得分:1)

您的计划中存在一些逻辑错误。

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

        }
        });
  

我的代码非常有用。

确实非常混乱。我很难删除所有不必要的公共和静态声明。这个document可能有助于编写java代码时遵循的约定。

根据该文件引用

  

变量应该在哪里初始化   他们被宣布,他们应该   在最小的范围内宣布   可能的。

希望它有助于朝着正确的方向发展。