2013-09-29 70 views
-1

我正在使用自定义对话框在位图中添加文本。当我点击屏幕但创建第一个位图后我的应用程序崩溃时创建位图。 错误日志单击时未启动的活动

E/AndroidRuntime(619): FATAL EXCEPTION: main 
E/AndroidRuntime(619): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.svtutorial/com.example.svtutorial.NodeMenu}: java.lang.NullPointerException 
E/AndroidRuntime(619): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
E/AndroidRuntime(619): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
E/AndroidRuntime(619): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
09-30 02:06:38.892: E/AndroidRuntime(619): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
09-30 02:06:38.892: E/AndroidRuntime(619): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-30 02:06:38.892: E/AndroidRuntime(619): at android.os.Looper.loop(Looper.java:137) 
09-30 02:06:38.892: E/AndroidRuntime(619): at android.app.ActivityThread.main(ActivityThread.java:4424) 
09-30 02:06:38.892: E/AndroidRuntime(619): at java.lang.reflect.Method.invokeNative(Native Method) 
09-30 02:06:38.892: E/AndroidRuntime(619): at java.lang.reflect.Method.invoke(Method.java:511) 
09-30 02:06:38.892: E/AndroidRuntime(619): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-30 02:06:38.892: E/AndroidRuntime(619): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-30 02:06:38.892: E/AndroidRuntime(619): at dalvik.system.NativeStart.main(Native Method) 
09-30 02:06:38.892: E/AndroidRuntime(619): Caused by: java.lang.NullPointerException 
09-30 02:06:38.892: E/AndroidRuntime(619): at com.example.svtutorial.NodeMenu.onCreate(NodeMenu.java:26) 
09-30 02:06:38.892: E/AndroidRuntime(619): at android.app.Activity.performCreate(Activity.java:4465) 
09-30 02:06:38.892: E/AndroidRuntime(619): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
09-30 02:06:38.892: E/AndroidRuntime(619):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 

这是我的主类

package com.example.svtutorial; 
//imports 

public class SurfaceViewEx extends Activity implements OnTouchListener { 

DrawingView dv; 
Bitmap bitmap; 
Context context; 
SurfaceHolder holder; 
LinkedList<Node> nodes; 
float x, y; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cloud); 
    dv = new DrawingView(this); //Passing the context of this class 
    dv.setOnTouchListener(this); 
    x = y = 0; 
    setContentView(dv); 
    nodes = new LinkedList<Node>(); 
    //pointList = new ArrayList<MotionEvent.PointerCoords>(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
} 

public class DrawingView extends SurfaceView { 

    public DrawingView(Context context) { 
     super(context); 
     holder = getHolder();   
    } 
} 

@Override 
public boolean onTouch(View v, MotionEvent me) { 
    // TODO Auto-generated method stub 

     try { 
      Thread.sleep(20); 
     } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     switch(me.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_UP: 
       x = me.getX(); 
       y = me.getY(); 
       Canvas c = holder.lockCanvas(); 
       Node n = new Node(bitmap, c, x, y); 
       boolean collision = false; 
       if (!nodes.isEmpty()){ 
        for (Node no : nodes) { 
         collision = no.isHere(x, y); //Checks the touch on bitmap 
         if (collision){ 
         break; 
         } 
         } 
        } 
      if(!collision){ 
       nodes.add(n); 
       } 
      c.drawColor(Color.BLACK); 
      if (!nodes.isEmpty()){ 
        for (Node no : nodes) { 
         no.Draw(); 
         if(collision) { //I want to call dialog box here 
         Intent text = new Intent(getBaseContext(),NodeMenu.class); 
         startActivity(text); 
        finish(); 
         } 
          } 
       } 
        holder.unlockCanvasAndPost(c); 
       break; 
         } 
       return true; 
       } 
       } 

下面给出的代码是用于创建对话框,我想它在上面给出的类。

public class NodeMenu extends Activity{ 

Context context; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = this; 
    final Dialog dialog = new Dialog(context); 
    dialog.setContentView(R.layout.nodemenu); 
    dialog.setTitle(R.id.textHeader); 
    final EditText et = (EditText) findViewById(R.id.editText1); 
    final TextView tv = (TextView) findViewById(R.id.textView); 
    Button addTextBtn = (Button) findViewById(R.id.addText); 
    addTextBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      tv.setText(et.getText().toString()); 
     } 
    }); 
    dialog.show(); 
} 
} 

布局节点菜单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 
<ImageView 
    android:id="@+id/textHeader" 
    android:src="@drawable/addtext" 
    android:layout_width="match_parent" 
    android:layout_height="64dp" 
    android:scaleType="center" 
    android:background="#FFFFBB33" 
    android:contentDescription="@string/app_name" /> 

<EditText 
    android:id="@+id/username" 
    android:inputType="textEmailAddress" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="16dp" 
    android:layout_marginLeft="4dp" 
    android:layout_marginRight="4dp" 
    android:layout_marginBottom="4dp" 
    android:hint="@string/nodetext" /> 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

<Button 
    android:id="@+id/addText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Add Text" />" 

</LinearLayout> 
+2

你能发布你的错误日志吗? –

+0

我已经发布了错误..请检查它 – user2712305

回答

0

作为logcat的告诉你:显示java.lang.NullPointerException 2月9日至30日:06:38.892:

所致E/AndroidRuntime(619):at com.example.svtutorial.NodeMenu.onCreate(NodeMenu.java:26)

您的NodeMenu课程的第26行有NullPointerException

+0

给我这个问题的一些解决方案..我是新的android – user2712305

+0

第26行的代码是什么?你能粘贴这条线吗? –

+0

addTextBtn.setOnClickListener(新OnClickListener(){ – user2712305

0

问题出在NodeMenu的onCreate方法中。您可以更好地看到问题发生的线26。

这是我的想法。

  • 您创建自定义视图的方式 - SurfaceView的扩展名 - 无法在Android中使用。我建议阅读custom views以了解将视图正确链接到Android系统的真正必要条件。
  • 据我所知,你尝试自己做图纸。很多这些东西都可以通过已经属于Android的库来完成。经过测试和优化的智能人员(其中大多数人;-)。你应该先熟悉已经存在的可能性。我的感觉是,阅读关于Android的风格可能会给你带来更多。

比你真的确定你必须自己做图纸时,你可以再去看看上面的链接,阅读关于自定义图纸的第二章。

+0

上线26 addTextBtn.setOnClickListener代码(新OnClickListener(){ 和那些是什么库? – user2712305

+0

的第26行中的代码意味着,在作业布局中无法找到'R.id.addText'作为视图。您可以编辑您的问题和发布布局吗?自定义绘图周围的库可以在本指南中找到(http:// developer.android.com/training/custom-views/custom-drawing.html) – jboi

+0

我发布了布局..请检查 – user2712305