2012-01-20 56 views
0

我想在用戶單擊圖像(可能很容易是一個按鈕)後更改textView的文本。我不斷得到一個關閉力量和nullpointerexception。我試圖編寫它爲Android 2.3.3NullPointerException當嘗試更改textview的文本點擊

該代碼是基於谷歌上找到的很多例子。

public class TestImagesActivity extends Activity { 
    private android.view.View.OnClickListener mCorkyListener = new android.view.View.OnClickListener() { 
    public void onClick(View v) { 
      final TextView txt = (TextView) findViewById(R.id.svariable); 
      txt.setText("new text"); // this line throws an exception 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ImageView image = (ImageView) findViewById(R.id.test_image); 
    image.setOnClickListener(mCorkyListener); 
} 

我main.xml中看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android.id="@+id/svariable" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <ImageView 
    android:id="@+id/test_image" 
    android:src="@drawable/test" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 
+1

你嘗試過加入Anroid的:的onclick到ImageView的?然後調用該函數而不是使用偵聽器。也許是一種考驗。 – VicVu

回答

1

您在XML有一個小問題,這樣的:

android.id="@+id/svariable" 

應該是:

android:id="@+id/svariable" 
2

在您的XML中,您使用的是android.id而不是android:id for svariable。

0

在XML android.id只是改變android:id

0

加載類的活動時創建的變量mCorkyListener,被稱爲onCreate方法之前。正如您所知,在您致電setContentView(layout)之前,您無法誇大任何意見,其中layout是您的意見的父視圖。所以你的TextView裏面的偵聽器創建代碼將始終爲空。你應該在setContentView之後創建監聽器。希望這可以幫助。

+0

我想(但我不確定)它會按照他的方式工作。因爲在onCreate調用setContentView之後,onClick()將不會被調用。我不相信它會嘗試評估onClick()內部的內容,直到圖像被實際按下。 – FoamyGuy

+0

這是正確的:) – Kingamajick

+0

是的,但它是實現監聽器的一種毫無意義的方式 - 就像容易讓「Activity」實現監聽器本身,然後使用this這樣設置監聽器一樣。也更優雅。 – Squonk

0

我認爲值得注意的是findViewById()在設備資源方面是一個相當昂貴的方法調用。

您應該從您的onCreate方法中調用此調用的TextView引用,接下來是您用於獲取imageView引用的相同調用。這樣每次按下按鈕時都不會被調用。

0

你的問題是一個錯字。

android.id="@+id/svariable"應該 android:id="@+id/svariable"

相關問題