1

我有我在「主」 XML文件中聲明的自定義視圖的方法,接受空指針異常:從類對象

<com.app.DrawView 
    android:id="@+id/my_view" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" /> 
在我活動的onCreate方法

然後:

setContentView(R.layout.main); 

所有作品罰款顯示自定義視圖。但我需要做的是將值傳遞給自定義視圖。所以,我試圖使自定義視圖類的一個實例:

DrawView drawView = (DrawView) findViewById(R.id.my_view); 

然後,在drawView函數類,我創建了一個方法:

public void setUserData(boolean data){ 
     useEraser = data; 
} 

現在,我的問題是什麼,我總是收到NullPointerExeption當試圖訪問該方法的drawView函數對象我的活動範圍內,像這樣:

boolean value = true; 
drawView.setUserData(value); 

錯誤指向「drawView.setUserData(值)」行。我究竟做錯了什麼?我知道我一定犯了一個簡單的錯誤,但是它讓我瘋狂地試圖找到它。任何幫助或建議都會很棒!

編輯:我接受了一個正常工作的答案,但是,我仍然想知道爲什麼我的原始解決方案不起作用。所以,我發現,儘管我在這個問題正確的排序,它的事實,我把

DrawView drawView = (DrawView)findViewById(R.id.my_view); 

setContentView(R.layout.main); 

之前,我知道這是一個簡單的錯誤,我眺望!感謝大家感謝的答案。我希望這證明對任何面臨類似問題的人都有用。

+0

在我看來像drawView爲null。你調試了findViewById嗎? – RNJ

+1

也許你偶然導入了錯誤的R,所以你得到了android.R而不是你的.package.R? – span

+0

drawView返回null,因此必須是我收到空指針異常的原因。只是我不太清楚爲什麼它返回null – chRyNaN

回答

1

,如果你想創建新的嘗試這個,

把一個LinearLayout中在你的XML作爲持有人

<LinearLayout 
     android:id="@+id/ln1" 
     android:layout_width="wrap_content" 
     android:layout_height="300dp" > 

    </LinearLayout> 

,並在下面

LinearLayout ln = (LinearLayout)findViewById(R.id.ln1); 
     com.example.mixed.DrawView dw2 = new DrawView(getApplicationContext()); 
     dw2.setUserData(false); 
     ln.addView(dw2); 

OnCreate中使用它的工作原理有沒問題,如果你把它放在你的佈局xml中。

enter image description here

+0

在我的類DrawView中,我已經放入了兩個構造函數:public DrawView(Context context,AttributeSet attrs),公共DrawView(上下文上下文)。我應該只使用一個嗎?會使用兩個有所作爲? – chRyNaN

+0

我不這麼認爲。你能在佈局編輯器上看到你的自定義視圖嗎? – Talha

+0

你可以把所有的代碼放在DrawView類 – Talha

-2

你不 「接收」 從方法調用異常。一個方法可能會拋出一個異常,您可能會在try-catch塊中捕獲該異常。在這種情況下,catch塊會捕獲異常。否則,它會發生在方法內部。由於調用者拋出異常,錯誤不在您的方法中。

在這種情況下:

boolean value = true; 
drawView.setUserData(value); 

它可以爲null的唯一事情是drawView函數。因此,findViewById返回null,或者您將drawView設置爲null。你可以通過在這裏放置一個斷點來證明這一點:

DrawView drawView = (DrawView) findViewById(R.id.my_view); 

並檢查drawView的值。

從您提供的信息,我不明白爲什麼會這樣,但這是您必須做的檢查。

順便提一下,您應該始終在自定義視圖中提供所有3個視圖構造函數原型。您缺少:

public DrawView(Context context, AttributeSet attrs, int defaultStyle){ 
super(context, attrs, defaultStyle); 

如果默認小部件樣式被覆蓋,則使用此構造函數。

+0

是的,我知道異常是如何工作的,應該更仔細地考慮我如何解釋我的問題。但好消息是你仍然明白我的意思。我很欣賞這個建議! – chRyNaN

+0

不客氣。因爲你清楚地知道你在做什麼,所以我對此很好奇。如果您確實發現問題,請回到解決方案。啊,我剛剛看到你接受的答案。只是要清楚,是不是你的自定義視圖放入視圖組中? – Simon

+0

說實話,我不太確定爲什麼我的原始代碼不起作用。我通過XML將我的自定義視圖放在視圖組(相對佈局)中。但是,當使用'findViewById'創建DrawView類對象的實例時,該對象將爲空。但是當我使用新的DrawView(getApplicationContext())實例化對象時(按照Talhakosen的解決方案),對象將被正確實例化。 – chRyNaN