2014-01-20 200 views
-1

在我的應用程序中嘗試使用setText更改TextView文本。 如果呼叫在onCreate方法使其運作得很好,但如果我叫另一種方法來做到這一點,崩潰給了我一個NullPointerExceptionAndroid setText在onCreate方法調用時崩潰應用程序

這裏是工作的代碼

package staub.olivier.aros.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 


public class MainActivity extends Activity { 

    public TextView ca00; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    final TextView ca00 = (TextView) findViewById(R.id.case00); 
    ca00.setText("stuff"); 
} 

我想要做的就是有,將改變我的文字時,我把它叫做所以我嘗試這個方法:

package staub.olivier.aros.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 


public class MainActivity extends Activity { 

    public TextView ca00; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    final TextView ca00 = (TextView) findViewById(R.id.case00); 
    updateText(); 
} 

    public updateText() { 
      ca00.setText("stuff"); 

    } 
    } 

,該怎麼辦錯了或者我如何管理做我想要什麼?

感謝您的時間和答案!

+1

粘貼錯誤日誌。 –

+0

你爲什麼最終決定**? – SoulRayder

+0

@Gautham我看到沒有問題,如果它是關於'final'關鍵字。谷歌也建議。我的個人代碼風格也儘可能包含「final」關鍵字。 –

回答

3

您的問題是變量的作用域。在onCreate()方法中,你實際上定義了一個新的局部變量,而不是使用class屬性。

您需要在您的onCreate()

final TextView ca00 = (TextView) findViewById(R.id.case00); 

改變這一行更改爲:

ca00 = (TextView) findViewById(R.id.case00); 

這將解決您的NPE。

+0

非常有用! – user3214327

+0

如果它解決了您的問題,您是否想將其標記爲接受的答案? –

1
package staub.olivier.aros.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 


public class MainActivity extends Activity { 

    public TextView ca00; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    ca00 = (TextView) findViewById(R.id.case00); 
    updateText(); 
} 

    public updateText() { 
      ca00.setText("stuff"); 

    } 
    } 
+0

雖然您提供的代碼是正確的,但您應該真正解釋爲什麼需要進行這些更改。除非他理解爲什麼需要這些改變,否則OP很可能再次犯同樣的錯誤。給一個男人一條魚... –

0

全局CA00是永遠不會被初始化,因此空指針異常你遇到

1

你在你的代碼中創建的TextView CA00兩次,而不是全局聲明它和直接的onCreate(用它)

package staub.olivier.aros.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 


public class MainActivity extends Activity { 

    public TextView ca00; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    ca00 = (TextView) findViewById(R.id.case00); // Change here 
    updateText(); 
} 

    public updateText() { 
      ca00.setText("stuff"); 

    } 
    } 
0

這是關於範圍在你的代碼的問題。在onCreate方法,你聲明的變量ca00

final TextView ca00 = (TextView) findViewById(R.id.case00); 

因此,設置爲ca00任何只影響一個變量在方法,而不是一個在類範圍內。您應該更改爲:

this.ca00 = (TextView) findViewById(R.id.case00); 
// this keyword is not mandatory, but I recommend it.