几天前我问了这个问题,但我刚刚意识到我包含了错误的 logcat 错误,现在包含了正确的 logcat ...
我正在编写一个允许用户输入值的应用程序,它们将用于在图表上绘图。在过去的几天里,我一直被困在一个特定的问题上,似乎无法克服它。用户将输入 2 个值,并从这 3 个值中计算并传递给内部类以绘制在图表上。这些值是 TextView 形式的。我知道大多数代码在我一直在测试它时都可以正常工作,而且我很确定该错误与 TextView 值有关。下面是用于计算和绘制图表的代码。
package com.example.ballanimation;
import java.math.BigDecimal;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class calculations extends Activity {
EditText firstVal, secondVal;
TextView resultA, resultB, resultC;
Button button3;
BigDecimal firstNum, secNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.calculations_page);
button3 = (Button) findViewById(R.id.button3);
firstVal = (EditText) findViewById(R.id.editTXT1);
secondVal = (EditText) findViewById(R.id.editTXT2);
resultA = (TextView) findViewById(R.id.result1);
resultB = (TextView) findViewById(R.id.result2);
resultC = (TextView) findViewById(R.id.result3);
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
firstNum = new BigDecimal(firstVal.getText().toString());
secNum = new BigDecimal(secondVal.getText().toString());
resultA.setText(firstNum.add(secNum).toString());
resultB.setText(firstNum.subtract(secNum).toString());
resultC.setText(firstNum.multiply(secNum).toString());
}
});
}
class TestA1 extends View{
public TestA1(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void onDraw(Canvas canvas){
super.onDraw(canvas);
String TestA = resultA.getText().toString();
String TestB = resultB.getText().toString();
String TestC = resultC.getText().toString();
int A = Integer.parseInt(TestA);
int B = Integer.parseInt(TestB);
int C = Integer.parseInt(TestC);
Paint red = new Paint();
red.setColor(Color.RED);
red.setStyle(Paint.Style.STROKE);
Paint black = new Paint();
black.setColor(Color.BLACK);
black.setStyle(Paint.Style.STROKE);
canvas.drawCircle(A, B, C, black);
canvas.drawCircle(canvas.getWidth()*1/2, canvas.getHeight()*3/8, canvas.getWidth()*475/1000, black);
canvas.drawCircle(canvas.getWidth()*5/8, canvas.getWidth()*5/8, canvas.getWidth()*349/1000, black);
canvas.drawCircle(canvas.getWidth()*6/8, canvas.getWidth()*5/8, canvas.getWidth()*228/1000, black);
canvas.drawCircle(canvas.getWidth()*7/8, canvas.getWidth()*5/8, canvas.getWidth()*103/1000, black);
canvas.drawLine((canvas.getWidth()-canvas.getWidth()) + 10, (canvas.getHeight()*3)/8, canvas.getWidth() - 10, (canvas.getHeight()*3)/8, black);
float a, b, c, d, e, f, g, h, i, j, k, l;
a = 90; //degrees
b = 90;
c = 90;
d = 50;
e = 90;
f = 134;
g = -90;
h = -90;
i = -90;
j = -50;
k = -90;
l = -134;
RectF arc0 = new RectF();
RectF arc1 = new RectF();
RectF arc2 = new RectF();
RectF arc3 = new RectF();
RectF arc4 = new RectF();
RectF arc5 = new RectF();
/*left The X coordinate of the left side of the rectangle
top The Y coordinate of the top of the rectangle
right The X coordinate of the right side of the rectangle
bottom The Y coordinate of the bottom of the rectangle */
arc0.set(canvas.getWidth()*1/2, canvas.getHeight()*-139/700, canvas.getWidth()*100/69, canvas.getHeight()*3/8);
arc1.set(canvas.getWidth()*-6/112, canvas.getHeight()*-80/100, canvas.getWidth()*195/100, canvas.getHeight()*72/192);
arc2.set(canvas.getWidth()*7/10, canvas.getHeight()*70/700, canvas.getWidth()*125/100, canvas.getHeight()*3/8);
arc3.set(canvas.getWidth()/2, canvas.getHeight()*3/8, canvas.getWidth()*100/69, canvas.getHeight()*91/96);
arc4.set(canvas.getWidth()*-8/112, canvas.getHeight()*3/8, canvas.getWidth()*195/100, canvas.getHeight()*150/100);
arc5.set(canvas.getWidth()*7/10, canvas.getHeight()*3/8, canvas.getWidth()*125/100, canvas.getHeight()*65/100);
/*oval The bounds of oval used to define the shape and size of the arc
startAngle Starting angle (in degrees) where the arc begins
sweepAngle Sweep angle (in degrees) measured clockwise
useCenter If true, include the center of the oval in the arc, and close it if it is being stroked. This will draw a wedge
paint The paint used to draw the arc */
canvas.drawArc(arc0, a, b, false, red);
canvas.drawArc(arc1, c, d, false, red);
canvas.drawArc(arc2, e, f, false, red);
canvas.drawArc(arc3, g, h, false, red);
canvas.drawArc(arc4, i, j, false, red);
canvas.drawArc(arc5, k, l, false, red);
}
}
}
我得到的 Logcat 错误是:
01-08 11:54:05.436: D/dalvikvm(714): GC_FOR_ALLOC freed 42K, 3% free 8053K/8259K, paused 66ms, total 69ms
01-08 11:54:05.436: I/dalvikvm-heap(714): Grow heap (frag case) to 8.305MB for 412064-byte allocation
01-08 11:54:05.596: D/dalvikvm(714): GC_FOR_ALLOC freed 1K, 3% free 8455K/8711K, paused 55ms, total 55ms
01-08 11:54:05.647: D/dalvikvm(714): GC_FOR_ALLOC freed 0K, 3% free 8455K/8711K, paused 48ms, total 48ms
01-08 11:54:05.666: I/dalvikvm-heap(714): Grow heap (frag case) to 9.189MB for 928216-byte allocation
01-08 11:54:05.836: D/dalvikvm(714): GC_CONCURRENT freed 0K, 4% free 9361K/9671K, paused 98ms+9ms, total 173ms
01-08 11:54:05.836: D/dalvikvm(714): WAIT_FOR_CONCURRENT_GC blocked 3ms
01-08 11:54:06.186: D/gralloc_goldfish(714): Emulator without GPU emulation detected.
01-08 11:54:07.856: I/Choreographer(714): Skipped 79 frames! The application may be doing too much work on its main thread.
01-08 11:54:25.786: D/AndroidRuntime(714): Shutting down VM
01-08 11:54:25.816: W/dalvikvm(714): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
01-08 11:54:25.866: E/AndroidRuntime(714): FATAL EXCEPTION: main
01-08 11:54:25.866: E/AndroidRuntime(714): java.lang.NullPointerException
01-08 11:54:25.866: E/AndroidRuntime(714): at com.example.ballanimation.calculations$TestA1.onDraw(calculations.java:83)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.View.draw(View.java:13458)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.View.draw(View.java:13342)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.View.draw(View.java:13461)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.widget.FrameLayout.draw(FrameLayout.java:467)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.View.draw(View.java:13342)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.View.draw(View.java:13340)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.View.draw(View.java:13461)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.widget.FrameLayout.draw(FrameLayout.java:467)
01-08 11:54:25.866: E/AndroidRuntime(714): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2183)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2256)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2151)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2019)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1830)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.Choreographer.doCallbacks(Choreographer.java:555)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.Choreographer.doFrame(Choreographer.java:525)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.os.Handler.handleCallback(Handler.java:615)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.os.Handler.dispatchMessage(Handler.java:92)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.os.Looper.loop(Looper.java:137)
01-08 11:54:25.866: E/AndroidRuntime(714): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-08 11:54:25.866: E/AndroidRuntime(714): at java.lang.reflect.Method.invokeNative(Native Method)
01-08 11:54:25.866: E/AndroidRuntime(714): at java.lang.reflect.Method.invoke(Method.java:511)
01-08 11:54:25.866: E/AndroidRuntime(714): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-08 11:54:25.866: E/AndroidRuntime(714): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-08 11:54:25.866: E/AndroidRuntime(714): at dalvik.system.NativeStart.main(Native Method)
01-08 11:54:28.535: I/Process(714): Sending signal. PID: 714 SIG: 9
我很确定错误包含在该行中:
String TestA = resultA.getText().toString();
String TestB = resultB.getText().toString();
String TestC = resultC.getText().toString();
我传递 TextView 值的方式一定有问题,但我看不出问题出在哪里。
任何帮助将不胜感激。