2016-04-22 69 views
-4

我想一個onClickListener添加到一個按鈕,但登錄貓輸出錯誤的Android按鍵空指針

這裏是日誌貓

FATAL EXCEPTION: main 
                   Process: com.pk.a_loner, PID: 10539 
                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pk.a_loner/com.pk.a_loner.main.gui.Connect}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2814) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2879) 
                    at android.app.ActivityThread.access$900(ActivityThread.java:182) 
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1475) 
                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                    at android.os.Looper.loop(Looper.java:145) 
                    at android.app.ActivityThread.main(ActivityThread.java:6141) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
                    at com.pk.a_loner.main.gui.Connect.init(Connect.java:20) 
                    at com.pk.a_loner.main.gui.Connect.onCreate(Connect.java:53) 
                    at android.app.Activity.performCreate(Activity.java:6374) 
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2767) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2879)  
                    at android.app.ActivityThread.access$900(ActivityThread.java:182)  
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1475)  
                    at android.os.Handler.dispatchMessage(Handler.java:102)  
                    at android.os.Looper.loop(Looper.java:145)  
                    at android.app.ActivityThread.main(ActivityThread.java:6141)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at java.lang.reflect.Method.invoke(Method.java:372)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)  

下面的代碼,應該是罰款?

package com.pk.a_loner.main.gui; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 

import com.pk.a_loner.R; 
import com.pk.a_loner.main.networking.Broadcast; 
import com.pk.a_loner.main.networking.Listen; 

public class Connect extends AppCompatActivity { 

    private Button button_toggleBroadcast; 
    private Button button_listen; 

    private void init() { 
     this.button_toggleBroadcast = (Button) (findViewById(R.id.button)); 
     this.button_toggleBroadcast.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!Broadcast.isInBroadcast()) { 
        if (!Broadcast.isHasInit()) { 
         Broadcast.init(); 
        } 
        Broadcast.broadcast(); 
       } else { 
        Broadcast.halt(); 
       } 
      } 
     }); 
     this.button_listen = (Button) (findViewById(R.id.button2)); 
     this.button_listen.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!Listen.isInScan()) { 
        if (!Listen.isHasInit()) { 
         Listen.init(); 
        } 
        Listen.scan(); 
       } else { 
        Listen.halt(); 
       } 
      } 
     }); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v("hello world", "this is a hello"); 
     this.init(); 
     setContentView(R.layout.activity_launcher); 
    } 


} 

這裏是XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".main.gui.Connect"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Toggle broadcast" 
      android:id="@+id/button" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Listen 10 secs" 
      android:id="@+id/button2" /> 
    </LinearLayout> 
</RelativeLayout> 

我檢查了代碼,我做初始化按鈕之前,我添加了監聽,不能爲空?按鈕也在xml中聲明。

該應用程序當前在啓動時崩潰。

任何幫助表示感謝,非常感謝。

+3

調用'這個被誇大。 init();'setContentView(R.layout.activity_launcher);'後面的行。總是從Activity中設置佈局後訪問佈局中的視圖。目前,您在設置Activity的佈局之前正在訪問Button的Button,其中Button都存在。 –

+0

它的工作,謝謝。請問爲什麼我不能這樣做? –

+0

vivien_pk,看到我的評論已經解釋。讓我知道如果仍然有任何疑問 –

回答

2

使用此在您的onCreate()代替:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v("hello world", "this is a hello"); 
    setContentView(R.layout.activity_launcher); 
    this.init(); 
} 

您需要初始化您的意見後,你的佈局已經setContentView()

2

呼叫setContentView(R.layout.activity_launcher);init();

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v("hello world", "this is a hello"); 
     setContentView(R.layout.activity_launcher); 
     this.init(); 

    }