
MainActivity.java:
public class MainActivity extends Activity {GrIDVIEw mKeypadGrID;KeyAdapter mKeypadAdapter;private TextVIEw userinputText;private boolean resetinput;private boolean hasFinalResult;private String mDecimalSeperator;private Stack<String> minputStack;private Stack<String> mOperationStack;private double memoryValue;private TextVIEw mStackText;private TextVIEw memoryStatText;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); userinputText= (TextVIEw) findVIEwByID(R.ID.txtinput); mStackText=(TextVIEw)findVIEwByID(R.ID.txtStack); memoryStatText=(TextVIEw)findVIEwByID(R.ID.txtMemory); mKeypadGrID = (GrIDVIEw)findVIEwByID(R.ID.Grdbuttons); mKeypadAdapter = new KeyAdapter(this); mKeypadGrID.setAdapter(mKeypadAdapter); mKeypadAdapter.setonbuttonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { button btn = (button) v; Keypadbutton keypadbutton = (Keypadbutton) btn.getTag(); ProcessKeypadinput(keypadbutton); }}); mKeypadGrID.setonItemClickListener(new OnItemClickListener() { public voID onItemClick(AdapterVIEw<?> parent,VIEw v,int position,long ID) { } });} public voID ProcessKeypadinput(Keypadbutton keypadbutton) { String text = keypadbutton.getText().toString(); String currentinput = userinputText.getText().toString(); int currentinputLen = currentinput.length(); String evalResult = null; double userinputValue = Double.NaN; switch (keypadbutton) { case BACKSPACE: if (resetinput) return; int endindex = currentinputLen - 1; if (endindex < 1) { userinputText.setText("0"); } else { userinputText.setText(currentinput.subSequence(0,endindex)); } break; case SIGN: if (currentinputLen > 0 && currentinput != "0") { if (currentinput.charat(0) == '-') { userinputText.setText(currentinput.subSequence(1,currentinputLen)); } else { userinputText.setText("-" + currentinput.toString()); } } break; case CE: userinputText.setText("0"); break; case C: userinputText.setText("0"); clearStacks(); break; case DECIMAL_SEP: if (hasFinalResult || resetinput) { userinputText.setText("0" + mDecimalSeperator); hasFinalResult = false; resetinput = false; } else if (currentinput.contains(".")) return; else userinputText.append(mDecimalSeperator); break; case div: case PLUS: case MINUS: case MulTIPLY: if (resetinput) { minputStack.pop(); mOperationStack.pop(); } else { if (currentinputLen >0) { if (currentinput.charat(0) == '-') { } else { if(currentinput!=null) minputStack.add(currentinput); } mOperationStack.add(currentinput); } } if(text!=null){ minputStack.add(text); //132nd line mOperationStack.add(text); } dumpinputStack(); evalResult = evaluateResult(false); if (evalResult != null) userinputText.setText(evalResult); resetinput = true; break; case CALculaTE: if (mOperationStack.size() == 0) break; mOperationStack.add(currentinput); evalResult = evaluateResult(true); if (evalResult != null) { clearStacks(); userinputText.setText(evalResult); resetinput = false; hasFinalResult = true; } break; case M_ADD: userinputValue = tryParseUserinput(); if (Double.isNaN(userinputValue)) return; if (Double.isNaN(memoryValue)) memoryValue = 0; memoryValue += userinputValue; displayMemoryStat(); hasFinalResult = true; break; case M_REMOVE: userinputValue = tryParseUserinput(); if (Double.isNaN(userinputValue)) return; if (Double.isNaN(memoryValue)) memoryValue = 0; memoryValue -= userinputValue; displayMemoryStat(); hasFinalResult = true; break; case MC: memoryValue = Double.NaN; displayMemoryStat(); break; case MR: if (Double.isNaN(memoryValue)) return; userinputText.setText(doubletoString(memoryValue)); displayMemoryStat(); break; case MS: userinputValue = tryParseUserinput(); if (Double.isNaN(userinputValue)) return; memoryValue = userinputValue; displayMemoryStat(); hasFinalResult = true; break; default: if (Character.isDigit(text.charat(0))) { if (currentinput.equals("0") || resetinput || hasFinalResult) { userinputText.setText(text); resetinput = false; hasFinalResult = false; } else { userinputText.append(text); resetinput = false; } } break; } } public voID clearStacks() { minputStack.clear(); mOperationStack.clear(); mStackText.setText(""); } public 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()); } public String evaluateResult(boolean requestedByUser) { if ((!requestedByUser && mOperationStack.size() != 4) || (requestedByUser && mOperationStack.size() != 3)) return null; String left = (String) mOperationStack.get(0); String operator = (String) mOperationStack.get(1); String right = (String) mOperationStack.get(2); String tmp = null; if (!requestedByUser) tmp = (String) mOperationStack.get(3); double leftVal = Double.parseDouble(left.toString()); double rightVal = Double.parseDouble(right.toString()); double result = Double.NaN; if (operator.equals(Keypadbutton.div.getText())) { result = leftVal / rightVal; } else if (operator.equals(Keypadbutton.MulTIPLY.getText())) { result = leftVal * rightVal; } else if (operator.equals(Keypadbutton.PLUS.getText())) { result = leftVal + rightVal; } else if (operator.equals(Keypadbutton.MINUS.getText())) { result = leftVal - rightVal; } String resultStr = doubletoString(result); if (resultStr == null) return null; mOperationStack.clear(); if (!requestedByUser) { mOperationStack.add(resultStr); mOperationStack.add(tmp); } return resultStr; } public 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); } public double tryParseUserinput() { String inputStr = userinputText.getText().toString(); double result = Double.NaN; try { result = Double.parseDouble(inputStr); } catch (NumberFormatException nfe) {} return result; } public voID displayMemoryStat() { if (Double.isNaN(memoryValue)) { memoryStatText.setText(""); } else { memoryStatText.setText("M = " + doubletoString(memoryValue)); } } } activity_main.xml中:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:orIEntation="vertical" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent"> <TextVIEw androID:ID="@+ID/txtStack" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:textSize="15sp" androID:gravity="right" androID:layout_margintop = "3sp" androID:layout_marginleft = "5sp" androID:layout_marginRight = "5sp"/> <TextVIEw androID:ID="@+ID/txtinput" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:textSize="25sp" androID:gravity="right" androID:layout_marginleft = "5sp" androID:layout_marginRight = "5sp"/> <TextVIEw androID:ID="@+ID/txtMemory" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:textSize="15sp" androID:gravity="left" androID:layout_marginleft = "5sp" androID:layout_marginRight = "5sp"/><GrIDVIEw androID:ID="@+ID/Grdbuttons" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:columnWIDth="90dp" androID:numColumns="5" androID:verticalSpacing="10dp" androID:horizontalSpacing="10dp" androID:stretchMode="columnWIDth" androID:gravity="center"/></linearLayout>
输出:
堆栈跟踪:
E/AndroIDRuntime(1492): FATAL EXCEPTION: main E/AndroIDRuntime(1492): Process: com.calculator,PID: 1492 E/AndroIDRuntime(1492): java.lang.NullPointerException E/AndroIDRuntime(1492): at com.calculator.MainActivity.ProcessKeypadinput(MainActivity.java:132) E/AndroIDRuntime(1492): at com.calculator.MainActivity.onClick(MainActivity.java:50) E/AndroIDRuntime(1492): at androID.vIEw.VIEw.performClick(VIEw.java:4438) E/AndroIDRuntime(1492): at androID.vIEw.VIEw$PerformClick.run(VIEw.java:18422) E/AndroIDRuntime(1492): at androID.os.Handler.handleCallback(Handler.java:733) E/AndroIDRuntime(1492): at androID.os.Handler.dispatchMessage(Handler.java:95) E/AndroIDRuntime(1492): at androID.os.Looper.loop(Looper.java:136) E/AndroIDRuntime(1492): at androID.app.ActivityThread.main(ActivityThread.java:5017) E/AndroIDRuntime(1492): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroIDRuntime(1492): at java.lang.reflect.Method.invoke(Method.java:515) E/AndroIDRuntime(1492): at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) E/AndroIDRuntime(1492): at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:595) E/AndroIDRuntime(1492): at dalvik.system.NativeStart.main(Native Method)
>我不知道如何修复NullPointer异常错误.
>问题在于按下
(加号),– (减号),*(mul),/(div),MC,MR,C,=(等于)和逗号按钮Logcat错误发生.其他按钮如0,1,2,3到9其罚款.
>欢迎您的回答.
>谢谢
userinputText= (TextVIEw) findVIEwByID(R.ID.txtinput);
对于其他布局组件也是如此,否则getText()没有标识
当你这样做时,请不要在代码中为所有组件使用相同的TextVIEw ……
userinputText= (TextVIEw) findVIEwByID(R.ID.txtinput); userinputText=(TextVIEw)findVIEwByID(R.ID.txtStack);userinputText=(TextVIEw)findVIEwByID(R.ID.txtMemory);
是不正确的.
对堆栈和内存使用不同的TextVIEw ….就像stackinputText,memoryinputText
总结以上是内存溢出为你收集整理的在Android中触摸计算器全部内容,希望文章能够帮你解决在Android中触摸计算器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)