【问题标题】:I need the same variable in multiple views, but it's not working我需要在多个视图中使用相同的变量,但它不起作用
【发布时间】:2012-11-04 08:11:03
【问题描述】:

我正在尝试创建一个计算行星重量的应用程序。在第一个视图中,用户输入他们的体重,它有一个输入按钮,在第二个视图中是一个单选按钮列表和选择按钮。我想让它们的重量乘以地球的力量。为此,我需要activity_main.xml 和planets.xml 的权重变量。起初我只在行星上使用它,但现在它也在 main 中,if else 语句出错了。

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/askwtTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="17dp"
    android:layout_marginTop="19dp"
    android:text="@string/askwt" />

<EditText
    android:id="@+id/inputwtEditText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/askwtTextView"
    android:layout_below="@+id/askwtTextView"
    android:layout_marginTop="26dp"
    android:ems="10"
    android:inputType="numberDecimal" />

<Button
    android:id="@+id/enterButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/inputwtEditText"
    android:layout_below="@+id/inputwtEditText"
    android:layout_marginTop="38dp"
    android:onClick="buttonclick"
    android:text="@string/enter" />

</RelativeLayout>

planets.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/planetTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/planet" />

<TextView
    android:id="@+id/textViewform2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

<RadioGroup
    android:id="@+id/radioGroup1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RadioButton
        android:id="@+id/mercuryRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/mercury" />

    <RadioButton
        android:id="@+id/venusRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/venus" />

    <RadioButton
        android:id="@+id/earthRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/earth" />

    <RadioButton
        android:id="@+id/marsRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/mars" />

    <RadioButton
        android:id="@+id/jupiterRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/jupiter" />

    <RadioButton
        android:id="@+id/saturnRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/saturn" />

    <RadioButton
        android:id="@+id/uranusRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/uranus" />

    <RadioButton
        android:id="@+id/neptuneRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/neptune" />

    <RadioButton
        android:id="@+id/plutoRadio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/pluto" />
</RadioGroup>


<Button
    android:id="@+id/selectButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="buttonclick2"
    android:text="@string/select" />

<TextView
    android:id="@+id/textViewform2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />

</LinearLayout>

JAVA:

package com.deitel.planetaryweight;

import android.os.Bundle;
import android.app.Activity;
import android.widget.*;
import android.view.View;
import android.view.Menu;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.EditText;
import android.widget.TextView;
import java.text.DecimalFormat;

public class MainActivity extends Activity {

//Global variable
double weight;
private Button enter;  // creates a button 


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    enter = (Button) findViewById(R.id.enterButton);

    //Start with first screen
    setContentView(R.layout.activity_main);
}

//buttonclick for form 1
public void buttonclick(View view){



    //creates an editext and assigns the resource id of the xml edittext.
    EditText wtentry = (EditText)findViewById(R.id.inputwtEditText);

    //Receives the input from the edittext, converts it to a double (number).
    weight = Double.parseDouble(wtentry.getText().toString());


      //switch views to screen 2
       setContentView(R.layout.planets);

       //change the value of the textview on screen 2 to the calculation value
       TextView t2 = (TextView)findViewById(R.id.textViewform2);
       t2.setText(Double.toString(weight));

        }

        //buttonclick for form 2!
        public void buttonclick2(View view){
            setContentView(R.layout.planets);

            RadioButton mercury = (RadioButton) findViewById(R.id.mercuryRadio);
            RadioButton venus = (RadioButton) findViewById(R.id.venusRadio);
            RadioButton earth = (RadioButton) findViewById(R.id.earthRadio);            
            RadioButton mars = (RadioButton) findViewById(R.id.marsRadio);
            RadioButton jupiter = (RadioButton) findViewById(R.id.jupiterRadio);
            RadioButton saturn = (RadioButton) findViewById(R.id.saturnRadio);
            RadioButton uranus = (RadioButton) findViewById(R.id.uranusRadio);
            RadioButton neptune = (RadioButton) findViewById(R.id.neptuneRadio);
            RadioButton pluto = (RadioButton) findViewById(R.id.plutoRadio);

            //Makes a variable for the entered amount
            Double mercurypf;
            Double venuspf;
            Double earthpf;
            Double marspf;
            Double jupiterpf;
            Double saturnpf;
            Double uranuspf;
            Double neptunepf;
            Double plutopf;
            Double weight;

            // constants
            final double mercuryforce = 0.38; 
            final double venusforce = 0.91; 
            final double earthforce = 1.00; 
            final double marsforce = 0.38; 
            final double jupiterforce = 2.34; 
            final double saturnforce = 1.06; 
            final double uranusforce = .92;
            final double neptuneforce = 1.19;
            final double plutoforce = 0.06;



            // Code used to determine which planet RadioButton is checked:

            if(mercury.isChecked())
            {
                mercurypf = mercuryforce * weight;
            }
            else
            {
                mercurypf = 0.00;
            }


            if(venus.isChecked())
            {
                venuspf = venusforce * weight;
            }
            else
            {
                venuspf = 0.00;

            }
            if(earth.isChecked())
            {
                earthpf = earthforce * weight;
            }
            else
            {
                earthpf = 0.00;
            }
            if(mars.isChecked())
            {
                marspf = marsforce * weight;
            }
            else
            {
                marspf = 0.00;
            }
            if(jupiter.isChecked())
            {
                jupiterpf =jupiterforce * weight;
            }
            else
            {
                jupiterpf = 0.00;
            }
            if(saturn.isChecked())
            {
                saturnpf = saturnforce * weight;
            }
            else
            {
                saturnpf = 0.00;
            }

            if(uranus.isChecked())
            {
                uranuspf = uranusforce * weight;
            }
            else
            {
                uranuspf = 0.00;
            }

            if(neptune.isChecked())
            {
                neptunepf = neptuneforce * weight;
            }
            else
            {
                neptunepf = 0.00;
            }

            if(pluto.isChecked())
            {
                plutopf = plutoforce * weight;
            }
            else
            {
                plutopf = 0.00;
            }

        }
    }

【问题讨论】:

    标签: java android variables views


    【解决方案1】:

    一种方法是:

    创建一个名为 say Constants 的新类,并将该变量声明为静态变量。现在您可以从所有活动中访问此变量。

    public class Constants {
         public static double weight;
    }
    

    从您的所有活动中访问它

    Constants.weight = 2.5;

    【讨论】:

      【解决方案2】:
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);            
          setContentView(R.layout.activity_main);
      
          enter = (Button) findViewById(R.id.enterButton);
      }
      

      您应该在找到任何视图之前设置内容视图。

      此外,您不需要对定义变量的方式进行任何更改,因为 weight 是 MainActivity 类中的私有变量,并且您正在同一活动中转换视图。该变量在您更改视图之前存储了 editText 的值,因此即使您更改了 contentView,它也不会丢失同一类中的值。据我所知,问题在于您没有正确设置enter 按钮(我上面建议的更改应该有效)。

      【讨论】:

        【解决方案3】:

        除此之外,您还需要解决一些结构和设计问题。查看文档以获取有关在活动之间来回传递信息的信息。 setContentView() 不应在 Activity 中多次调用,除非您有充分的理由这样做。

        public class MainActivity extends Activity {
            /* You should get used to declaring everything with the correct visibility.  Good practice is to make everything private and use public mutator methods */
            //Global variable
            private double weight;
            private Button enter;  // creates a button 
        
            // Views
            private EditText wtEntry;
            private TextView txtForm2;
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                //Start with first screen
                setContentView(R.layout.activity_main);
        
                enter = (Button) findViewById(R.id.enterButton);
        
                //creates an editext and assigns the resource id of the xml edittext.
                wtEntry = (EditText)findViewById(R.id.inputwtEditText);
                txtForm2 = (TextView)findViewById(R.id.textViewform2);
            }
            // Button clicks shouldn't do anything but perform clicky actions. Leave field initialization, view creation, etc to the Activity.
            //buttonclick for form 1
            public void buttonclick(View view){
                //Receives the input from the edittext, converts it to a double (number).
                weight = Double.parseDouble(wtEntry.getText().toString());
        
                //change the value of the textview on screen 2 to the calculation value
               t2.setText(Double.toString(weight));
        
               // If you want a new layout, it's best to start a new activity.
               // It looks like you want to get information back, so use startActivityForResult().
               // setContentView(R.layout.planets);
               Intent dataIntent = new Intent(this, PlanetChooser.class);
               dataIntent.putExtra("com.yourpackage.identifier.DATA_WEIGHT", weight);
               startActivityForResult(dataIntent, Activity.RESULT_OK);
            }
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
        
                // Check that the resultCode is the same as we started the activity with
                if(resultCode == Activity.RESULT_OK){
                    // get the double from the Intent, using the same string name (package prefixed)
                    // or a default value if it didn't get set.
                    double resultWeight = data.getDoubleExtra("com.yourpackage.identifier.RESULT_WEIGHT", 0.0);
        
                    // Now do something with resultWeight
                }
            }
        }
        // PlanetChooser.class
        public class PlanetChooser extends Activity {
            // constants, usually denoted by uppercase and declared static and final
            public static final double MERCURYFORCE = 0.38; 
            public static final double VENUSFORCE = 0.91; 
            public static final double EARTHFORCE = 1.00; 
            public static final double MARSFORCE = 0.38; 
            public static final double JUPITERFORCE = 2.34; 
            public static final double SATURNFORCE = 1.06; 
            public static final double URANUSFORCE = 0.92;
            public static final double NEPTUNEFORCE = 1.19;
            public static final double PLUTOFORCE = 0.06;
        
            private RadioButton mercury, venus, earth, mars, jupiter, saturn, uranus, neptune, pluto;
        
            // No need to use the Double object as opposed to the primitive unless you have good reason
            private double mercurypf, venuspf, earthpf, marspf, jupiterpf, saturnpf, uranuspf, neptunepf, plutopf, weight;
        
            // One variable will suffice, it seems.
            private double resultForce;
        
            public void onCreate(Bundle s){
                super.onCreate(s);
                setContentView(R.layout.planets);
        
                mercury = (RadioButton) findViewById(R.id.mercuryRadio);
                venus = (RadioButton) findViewById(R.id.venusRadio);
                earth = (RadioButton) findViewById(R.id.earthRadio);            
                mars = (RadioButton) findViewById(R.id.marsRadio);
                jupiter = (RadioButton) findViewById(R.id.jupiterRadio);
                saturn = (RadioButton) findViewById(R.id.saturnRadio);
                uranus = (RadioButton) findViewById(R.id.uranusRadio);
                neptune = (RadioButton) findViewById(R.id.neptuneRadio);
                pluto = (RadioButton) findViewById(R.id.plutoRadio);
            }
            public void buttonclick2(View view){
                /*
                It looks to me here you're looking to see which box is checked, and set a value based on 
                that planet.  Since instance variables (in this case mercurypf, jupiterpf, etc) are initialized
                to the default value (0), there's no need to set them manually.
                */
        
                // Code used to determine which planet RadioButton is checked:
                if(mercury.isChecked())    {
                    resultForce = MERCURYFORCE * weight;
                }
                if(venus.isChecked()){
                    resultForce = VENUSFORCE * weight;
                }
                if(earth.isChecked()){
                    resultForce = EARTHFORCE * weight;
                }
                if(mars.isChecked()){
                    resultForce = MARSFORCE * weight;
                }
                if(jupiter.isChecked()){
                    resultForce =JUPITERFORCE * weight;
                }
                if(saturn.isChecked()){
                    resultForce = SATURNFORCE * weight;
                }
                if(uranus.isChecked()){
                    resultForce = URANUSFORCE * weight;
                }
                if(neptune.isChecked()){
                    resultForce = NEPTUNEFORCE * weight;
                }
                if(pluto.isChecked()){
                    resultForce = PLUTOFORCE * weight;
                }
                // Create a new data Intent to pass back to the calling activity, set the result code, 
                // and manually finish() this activity.
                Intent dataIntent = new Intent(this);
                dataIntent.putDoubleExtra("com.yourpackage.identifier.RESULT_DATA", resultForce);
                setResult(Activity.RESULT_OK, dataIntent);
                finish();
            }
        }
        

        【讨论】:

          【解决方案4】:

          使用应用程序或静态变量全局保存值。看例子

          创建一个扩展 Application 的新类。

          public class Globals extends Application{
            private int data=200;
          
            public int getData(){
            return this.data;
          }
          
           public void setData(int d){
            this.data=d;
           }
          

          }

          Second:
          
          Add the class to the AndroidManifest file as an attribute of <application> tag:
          
           <application android:name=".Globals" />
          
          Then you can access your global data from any Activity by calling getApplication()
          
          Globals g = (Globals)getApplication();
          int data=g.getData();
          

          静态变量示例

          class Global{
              public static int global=1;
          }
          
          in your activity simply use it with its class name
          
           int a;
           a=Global.global;
          

          【讨论】:

          • 好的,我会尝试你们每个人提供的三个选项。谢谢!!
          猜你喜欢
          • 2021-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多