0

This is my first time using Java and I am having a hard time calling function from a different class.

The problem I am having is with calling CmToMConversion() function from Conversion class. The program runs well but when I click on checkbox the program crashes but when I place CmToMConversion() function in the same class then the program runs. How to solve this issue. Also what is the way around if I make this function private in conversion class.

If possible answer with the code so it's easier for me to understand.

MainActivity.java

package com.example.zaid.conv;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;

public class MainActivity extends AppCompatActivity {

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

private void initialization()
{
    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(ButttonListener);
    onButtonClick();
}

private void onButtonClick()
{
    Conversion mToCm = new Conversion();
    onCheckbox();
    EditText inputMiles = (EditText) findViewById(R.id.miles);
    TextView convertedMiles = (TextView) findViewById(R.id.milesOutput);
    String miles = mToCm.MilesToCmConversion(inputMiles.getText().toString());
    convertedMiles.setText(miles + " cm");

    Conversion inToCm = new Conversion();
    EditText inputInches = (EditText) findViewById(R.id.inches);
    TextView convertedInches = (TextView) findViewById(R.id.inchesOutput);
    String inches = inToCm.InchesToCmConversion(inputInches.getText().toString());
    convertedInches.setText(inches + " cm");

    Conversion fToCm = new Conversion();
    EditText inputFeet = (EditText) findViewById(R.id.feet);
    TextView convertedFeet = (TextView) findViewById(R.id.feetOutput);
    String feet = fToCm.FeetToCmConversion(inputFeet.getText().toString());
    convertedFeet.setText(feet + " cm");
}

private void onCheckbox()
{
    CheckBox check = (CheckBox) findViewById(R.id.checkBox);
    check.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View change)
        {
            Conversion CmToM = new Conversion();
            boolean check = ((CheckBox) change).isChecked();
            if (check)
                CmToM.CmToMConversion();
            else
                onButtonClick();
        }
    });
}

private OnClickListener ButttonListener = new OnClickListener()
{
    public void onClick(View clickEvent)
    {
        onButtonClick();
    }
};
}

Conversion.java

package com.example.zaid.conv;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View;

public class Conversion extends Activity {

//    @Override
//    protected void onCreate(Bundle savedInstanceState)
//    {
//        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
//    }
//Handling Checkbox//
public void CmToMConversion()
{

    EditText inputMiles = (EditText) findViewById(R.id.miles);
    TextView convertedMiles = (TextView) findViewById(R.id.milesOutput);
    String miles = MilesToMConversion(inputMiles.getText().toString());
    convertedMiles.setText(miles + " m");

    EditText inputInches = (EditText) findViewById(R.id.inches);
    TextView convertedInches = (TextView) findViewById(R.id.inchesOutput);
    String inches = InchesToMConversion(inputInches.getText().toString());
    convertedInches.setText(inches + " m");

    EditText inputFeet = (EditText) findViewById(R.id.feet);
    TextView convertedFeet = (TextView) findViewById(R.id.feetOutput);
    String feet = FeetToMConversion(inputFeet.getText().toString());
    convertedFeet.setText(feet + " m");
}

//Conversion To Cm//
public String MilesToCmConversion(String milesToCm)
{
    try
    {
        double mil = Double.parseDouble(milesToCm);
        double cm = mil * 160934.4;
        return String.format("%3.1f", cm);
    }
    catch (NumberFormatException exception)
    {
        return "0";
    }
}

public String InchesToCmConversion(String inchToCm)
{
    try
    {
        double inch = Double.parseDouble(inchToCm);
        double cm = inch * 2.54;
        return String.format("%3.1f", cm);
    }
    catch (NumberFormatException exception)
    {
        return "0";
    }
}

public String FeetToCmConversion(String ftToCm)
{
    try
    {
        double ft = Double.parseDouble(ftToCm);
        double cm = ft * 30.48;
        return String.format("%3.1f", cm);
    }
    catch (NumberFormatException exception)
    {
        return "0";
    }
}

public String MilesToMConversion(String milToCm)
{
    try
    {
        double mil = Double.parseDouble(milToCm);
        double m = (mil * 160934.4) / 100;
        return String.format("%3.1f", m);
    }
    catch (NumberFormatException exception)
    {
        return "0";
    }
}

//Conversion To Meter//
private String InchesToMConversion(String inchToM)
{
    try
    {
        double inch = Double.parseDouble(inchToM);
        double m = (inch * 2.54) / 100;
        return String.format("%3.1f", m);
    }
    catch (NumberFormatException exception)
    {
        return "0";
    }
}



private String FeetToMConversion(String ftTom)
{
    try
    {
        double ft = Double.parseDouble(ftTom);
        double m = (ft * 30.48) / 100;
        return String.format("%3.1f", m);
    }
    catch (NumberFormatException exception)
    {
        return "0";
    }
}

}

<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.zaid.conv.MainActivity">

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="numberSigned|numberDecimal"
    android:ems="10"
    android:id="@+id/miles"
    android:layout_below="@+id/textView"
    android:layout_alignLeft="@+id/inches"
    android:layout_alignStart="@+id/inches" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Miles"
    android:id="@+id/textView"
    android:textSize="24dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Inches"
    android:id="@+id/textView2"
    android:textSize="24dp"
    android:layout_below="@+id/miles"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="45dp" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="numberSigned|numberDecimal"
    android:ems="10"
    android:id="@+id/inches"
    android:layout_below="@+id/textView2"
    android:layout_alignLeft="@+id/feet"
    android:layout_alignStart="@+id/feet" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Feet"
    android:id="@+id/textView3"
    android:textSize="24dp"
    android:layout_marginTop="41dp"
    android:layout_below="@+id/inches"
    android:layout_centerHorizontal="true" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="numberSigned|numberDecimal"
    android:ems="10"
    android:id="@+id/feet"
    android:layout_below="@+id/textView3"
    android:layout_centerHorizontal="true" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Show Meters"
    android:id="@+id/checkBox"
    android:checked="false"
    android:layout_below="@+id/feet"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Convert"
    android:id="@+id/button"
    android:layout_below="@+id/checkBox"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="28dp" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/milesOutput"
    android:layout_below="@+id/button"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/inchesOutput"
    android:layout_below="@+id/milesOutput"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/feetOutput"
    android:layout_below="@+id/inchesOutput"
    android:layout_alignLeft="@+id/inchesOutput"
    android:layout_alignStart="@+id/inchesOutput" />

</RelativeLayout>
7
  • you should parsing data by set parameter in your CmToMConversion(int miles,int feet, int inches). and using intent if you want to go new activity Commented Sep 10, 2016 at 14:27
  • @Muklas, I am new to this so I fail to understand directly like this. Commented Sep 10, 2016 at 14:30
  • which kind of behavior you trying to achieve ? so far you can't create an activity instance in another one and expect it to work normally . Commented Sep 10, 2016 at 14:31
  • @PavneetSingh, I have experience in C# and I do think Java is a bit similar to Java so used it. I have explained at the top what behavior I expect. Please tell me how to fix this. Commented Sep 10, 2016 at 14:44
  • i would say both C# and java are cousins like other languages. To solve this first i need to know what you are tying to do as i asked before ? seems like you wanna start second activity when user press the checkbox ? Commented Sep 10, 2016 at 15:12

1 Answer 1

1

Okay so your Conversion class looks like it's just full of utility methods. Therefore, it should not be an Activity. Just change Conversion to a class with some static methods, remove the CmToMConversion() method, that should just be in your MainActivity. The MainActivity should handle manipulating its own views.

public class Conversion{

    // Removed the CmToMConversion method

    // Make methods static
    public static String MilesToCmConversion(String milesToCm){
        try{
            double mil = Double.parseDouble(milesToCm);
            double cm = mil * 160934.4;
            return String.format("%3.1f", cm);
        } catch (NumberFormatException exception){
            return "0";
        }
    }

    // Copy the rest of your methods into the class here
    // and make them static like above
}

Once you have done that, you won't need to initialize Conversion and can just call the static methods flat out with Conversion.MilesToCmConversion(whatever);. Here's a revised MainActivity:

import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
// import package.path.to.Conversion; 

public class MainActivity extends AppCompatActivity {

// Declare your instance variables here
private EditText inputMiles, inputInches, inputFeet;
private TextView convertedMiles, convertedInches, convertedFeet;

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

private void initialization()
{
    // Setup your instance variables here
    inputMiles = (EditText) findViewById(R.id.miles);
    inputInches = (EditText) findViewById(R.id.inches);
    inputFeet = (EditText) findViewById(R.id.feet);

    convertedMiles = (TextView) findViewById(R.id.milesOutput);
    convertedInches = (TextView) findViewById(R.id.inchesOutput);
    convertedFeet = (TextView) findViewById(R.id.feetOutput);

    // Just setup your CheckBox in your init method. You call
    // onButtonClick() which would immediately do this anyway
    // I'd also just setup an OnCheckedChangeListener like this
    CheckBox check = (CheckBox) findViewById(R.id.checkBox);
    check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked) CmToMConversion();
            else onButtonClick();     
        }
     });

    Button button = (Button) findViewById(R.id.button);
    // If you're only using the onClickListener for this one button
    // just setup the listener in line rather than making an instance
    // variable of it and referencing it
    button.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
             onButtonClick();
         }
     });
    onButtonClick();
}

private void onButtonClick()
{
    String miles = Conversion.MilesToCmConversion(inputMiles.getText().toString());
    convertedMiles.setText(miles + " cm");

    String inches = Conversion.InchesToCmConversion(inputInches.getText().toString());
    convertedInches.setText(inches + " cm");

    String feet = Conversion.FeetToCmConversion(inputFeet.getText().toString());
    convertedFeet.setText(feet + " cm");
}

// This method manipulates MainActivity's views, so it should be in MainActivity
private void CmToMConversion()
{
    String miles = Conversion.MilesToMConversion(inputMiles.getText().toString());
    convertedMiles.setText(miles + " m");

    String inches = Conversion.InchesToMConversion(inputInches.getText().toString());
    convertedInches.setText(inches + " m");

    String feet = Conversion.FeetToMConversion(inputFeet.getText().toString());
    convertedFeet.setText(feet + " m");
}
}
Sign up to request clarification or add additional context in comments.

15 Comments

Three things not working import package.path.to.Conversion; OnCheckedChangeListener, public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
You need to import the Conversion class. I don't know where you put it in your project. If it's in the same directory as MainActivity you don't need the import statement. That's why I commented it out.
Updated my answer for the onCheckedChangeListener it's from CompundButton so I added the import statement for that class and referenced it in the declaration of the listener
How about OnCheckedChangeListener, Compound Button and also @Override. It says Method does not override method from its superclass. For Oncheckedlisterner() and CompoundButton it says Cannot resolve symbol and
Did you add the import android.widget.CompoundButton; statement at the top of your class?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.