0

Here is the some code from main.xml as i have used android:OnClick

<Button
    android:id="@+id/button6"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="0dp" 
    android:layout_weight="0.166"    
    android:text="6"
    android:onClick="ProcessInput"
    android:layout_height="match_parent"
    android:gravity="fill" />

Here is the code of main.java with process input method

public void ProcessInput(View v)
{
    Button btn = (Button) v;
    String text = btn.getText().toString();
    String currentInput = inputText.getText().toString();
    int currentInputLen = currentInput.length();
    String evalResult = null;
    double userInputValue = Double.NaN;
    if(btn.getText()=="del")
    {
        if(resetInput)
            return;

        int endIndex = currentInputLen - 1;
        if(endIndex<1)
        {
            inputText.setText("0");
        }
        else
        {
            inputText.setText(currentInput.subSequence(0, endIndex));
        }
    }
    else if(btn.getText()=="±")
    {
        if (currentInputLen > 0 && currentInput != "0") 
        {
            // Already has (-) sign. Remove that sign
            if (currentInput.charAt(0) == '-') 
            {
                inputText.setText(currentInput.subSequence(1,
                        currentInputLen));
            }
            // Prepend (-) sign
            else 
            {
                inputText.setText("-" + currentInput.toString());
            }
        }
    }
    else if(btn.getText()==".")
    {
        if (hasFinalResult || resetInput) {
            inputText.setText("0" + mDecimalSeparator);
            hasFinalResult = false;
            resetInput = false;
        } else if (currentInput.contains("."))
            return;
        else
            inputText.append(mDecimalSeparator);
    }
    else if(btn.getText()=="+"||btn.getText()=="-"||btn.getText()=="/"||btn.getText()=="x")
    {
        if (resetInput) {
            mInputStack.pop();
            mOperationStack.pop();
        } else {
            if (currentInput.charAt(0) == '-') {
                mInputStack.add("(" + currentInput + ")");
            } else {
                mInputStack.add(currentInput);
            }
            mOperationStack.add(currentInput);
        }

        mInputStack.add(text);
        mOperationStack.add(text);

        dumpInputStack();
        evalResult = evaluateResult(false);
        if (evalResult != null)
            inputText.setText(evalResult);

        resetInput = true;
    }
    else if(btn.getText()=="1"||btn.getText()=="2"||btn.getText()=="3"||btn.getText()=="4"||btn.getText()=="5"||btn.getText()=="6"||btn.getText()=="7"||btn.getText()=="8"||btn.getText()=="9"||btn.getText()=="0")
    {
                inputText.append(text);
                resetInput = false;
    }
}

Here is complete main.java code if it is needed

package com.example.calculator;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Iterator;
import java.util.Stack;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

private TextView inputText,resultText;
double firstNumber=0,secondNumber=0,result=0;
int firstOperand=0,TotalOperator=0;
Stack<String> mInputStack;
Stack<String> mOperationStack;
TextView mStackText;
boolean resetInput = false;
boolean hasFinalResult = false;

String mDecimalSeparator;
double memoryValue = Double.NaN;

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

    DecimalFormat currencyFormatter = (DecimalFormat) NumberFormat.getInstance();
    char decimalSeparator = currencyFormatter.getDecimalFormatSymbols().getDecimalSeparator();
    mDecimalSeparator = Character.toString(decimalSeparator);

    setContentView(R.layout.main);
    mInputStack = new Stack<String>();
    mOperationStack = new Stack<String>();

    inputText = (TextView) findViewById(R.id.InputText);
    inputText.setText("0");
    resultText = (TextView) findViewById(R.id.ResultText);
    resultText.setText("");

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void ProcessInput(View v)
{
    Button btn = (Button) v;
    String text = btn.getText().toString();
    String currentInput = inputText.getText().toString();
    int currentInputLen = currentInput.length();
    String evalResult = null;
    double userInputValue = Double.NaN;
    if(btn.getText()=="del")
    {
        if(resetInput)
            return;

        int endIndex = currentInputLen - 1;
        if(endIndex<1)
        {
            inputText.setText("0");
        }
        else
        {
            inputText.setText(currentInput.subSequence(0, endIndex));
        }
    }
    else if(btn.getText()=="±")
    {
        if (currentInputLen > 0 && currentInput != "0") 
        {
            // Already has (-) sign. Remove that sign
            if (currentInput.charAt(0) == '-') 
            {
                inputText.setText(currentInput.subSequence(1,
                        currentInputLen));
            }
            // Prepend (-) sign
            else 
            {
                inputText.setText("-" + currentInput.toString());
            }
        }
    }
    else if(btn.getText()==".")
    {
        if (hasFinalResult || resetInput) {
            inputText.setText("0" + mDecimalSeparator);
            hasFinalResult = false;
            resetInput = false;
        } else if (currentInput.contains("."))
            return;
        else
            inputText.append(mDecimalSeparator);
    }
    else if(btn.getText()=="+"||btn.getText()=="-"||btn.getText()=="/"||btn.getText()=="x")
    {
        if (resetInput) {
            mInputStack.pop();
            mOperationStack.pop();
        } else {
            if (currentInput.charAt(0) == '-') {
                mInputStack.add("(" + currentInput + ")");
            } else {
                mInputStack.add(currentInput);
            }
            mOperationStack.add(currentInput);
        }

        mInputStack.add(text);
        mOperationStack.add(text);

        dumpInputStack();
        evalResult = evaluateResult(false);
        if (evalResult != null)
            inputText.setText(evalResult);

        resetInput = true;
    }
    else if(btn.getText()=="1"||btn.getText()=="2"||btn.getText()=="3"||btn.getText()=="4"||btn.getText()=="5"||btn.getText()=="6"||btn.getText()=="7"||btn.getText()=="8"||btn.getText()=="9"||btn.getText()=="0")
    {
                inputText.append(text);
                resetInput = false;
    }
}

private void dumpInputStack() {
    Iterator<String> it = mInputStack.iterator();
    StringBuilder sb = new StringBuilder();

    while (it.hasNext()) {
        CharSequence iValue = it.next();
        sb.append(iValue);

    }

    mStackText.setText(sb.toString());
}

private String evaluateResult(boolean requestedByUser) {
    if ((!requestedByUser && mOperationStack.size() != 4)
            || (requestedByUser && mOperationStack.size() != 3))
        return null;

    String left = mOperationStack.get(0);
    String operator = mOperationStack.get(1);
    String right = mOperationStack.get(2);
    String tmp = null;
    if (!requestedByUser)
        tmp = mOperationStack.get(3);

    double leftVal = Double.parseDouble(left.toString());
    double rightVal = Double.parseDouble(right.toString());
    double result = Double.NaN;

    if (operator.equals("/")) {
        result = leftVal / rightVal;
    } else if (operator.equals("x")) {
        result = leftVal * rightVal;

    } else if (operator.equals("+")) {
        result = leftVal + rightVal;
    } else if (operator.equals("-")) {
        result = leftVal - rightVal;

    }

    String resultStr = doubleToString(result);
    if (resultStr == null)
        return null;

    mOperationStack.clear();
    if (!requestedByUser) {
        mOperationStack.add(resultStr);
        mOperationStack.add(tmp);
    }

    return resultStr;
}

private String doubleToString(double value) {
    if (Double.isNaN(value))
        return null;

    long longVal = (long) value;
    if (longVal == value)
        return Long.toString(longVal);
    else
        return Double.toString(value);

}

}

I can't figure out whats wrong i tried to change btn.getText()=="1" to btn.getText()=='1' but that was also error. What should i do?

iKnowNothing
  • 175
  • 11

1 Answers1

0

When you compare Strings in Java, use the String.equals() method in lieu of ==, which compares Object references.

Mike M.
  • 38,532
  • 8
  • 99
  • 95
  • I changed it but now btn.getText().equals("+") crashes my application whenever i press +,-,/ or x. – iKnowNothing Mar 09 '14 at 04:48
  • What's the error you're getting? – Mike M. Mar 09 '14 at 04:52
  • Just as a side note, @Programmingcat, since you're already getting the Button's text in the String text, you should use this for your equals() instead of calling the getText() method repeatedly. – Mike M. Mar 09 '14 at 05:09
  • 03-09 11:10:10.227: E/AndroidRuntime(4285): java.lang.IllegalStateException: Could not execute method of the activity 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.view.View$1.onClick(View.java:3607) 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.view.View.performClick(View.java:4212) – iKnowNothing Mar 09 '14 at 05:43
  • 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.view.View$PerformClick.run(View.java:17476) 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.os.Handler.handleCallback(Handler.java:800) 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.os.Handler.dispatchMessage(Handler.java:100) – iKnowNothing Mar 09 '14 at 05:43
  • 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.os.Looper.loop(Looper.java:194) 03-09 11:10:10.227: E/AndroidRuntime(4285): at android.app.ActivityThread.main(ActivityThread.java:5371) 03-09 11:10:10.227: E/AndroidRuntime(4285): at java.lang.reflect.Method.invokeNative(Native Method) 03-09 11:10:10.227: E/AndroidRuntime(4285): at java.lang.reflect.Method.invoke(Method.java:525) – iKnowNothing Mar 09 '14 at 05:45
  • 03-09 11:10:10.227: E/AndroidRuntime(4285): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 03-09 11:10:10.227: E/AndroidRuntime(4285): Caused by: java.lang.reflect.InvocationTargetException 03-09 11:10:10.227: E/AndroidRuntime(4285): Caused by: java.lang.NullPointerException 03-09 11:10:10.227: E/AndroidRuntime(4285): at com.example.calculator.MainActivity.dumpInputStack(MainActivity.java:157) 03-09 11:10:10.227: E/AndroidRuntime(4285): at com.example.calculator.MainActivity.ProcessInput(MainActivity.java:124) – iKnowNothing Mar 09 '14 at 05:48
  • I'm guessing it's because mStackText is null, i.e., you didn't assign it a TextView reference. If that's not it, you'll have to open a new question; too much to dig through in comments. – Mike M. Mar 09 '14 at 05:51