2013-09-29 71 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