Lucreacia
Lucreacia

Reputation: 79

I need the same variable in multiple views, but it's not working

I'm trying to create an application that figures planetary weight. In the first view the user inputs their weight and it has an enter button, in the second view is a list of radio buttons and the select button. I want it to multiply their weight by the planet's force. To do this I needed the weight variable for both activity_main.xml and planets.xml. At first I had it in only planets, but now that it's in main as well, the if else statements are erroring.

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

        }
    }

Upvotes: 2

Views: 280

Answers (4)

Phix
Phix

Reputation: 9910

In addition to the rest, there's some structural and design issues you need to resolve. Take a look at the docs for information on passing information back and forth to and from Activities. setContentView() shouldn't be called more than once in an Activity unless you have a good reason to.

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

Upvotes: 1

varevarao
varevarao

Reputation: 2186

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);            
    setContentView(R.layout.activity_main);

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

You should be setting the content view BEFORE you find any view.

Further, you don't need any changes in the way you've defined your variables, given weight is a private variable in your MainActivity class, and you're shifting views in the same activity. The variable is storing the value of the editText BEFORE you change the view so it won't lose the value in the same class even if you change the contentView. As far as I can see, the problem is that you're not setting the enter button right (the change I've suggested above should work).

Upvotes: 2

Munish Kapoor
Munish Kapoor

Reputation: 3359

Use Application or static variable to save the value globally. see the example

Create a new class that extends 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();

Static Variable Example

class Global{
    public static int global=1;
}

in your activity simply use it with its class name

 int a;
 a=Global.global;

Upvotes: 1

PravinCG
PravinCG

Reputation: 7708

One way to do it is:

Create a new class called say Constants and declare this variable as static there. Now you can access this variable from all you activities.

public class Constants {
     public static double weight;
}

Access it from all your activities as

Constants.weight = 2.5;

Upvotes: 3

Related Questions