2012-09-17 24 views
0

我正在製作Android應用程序,其中,在啓動過程中,我禁用了媒體播放器的暫停按鈕。點擊OK按鈕(並開始播放音樂)後,我想啓用暫停按鈕。從功能內啓用Android應用程序按鈕

此代碼工作正常,除了最後一行(我沒有刪除一些不相關的行)。這給了我一個運行時錯誤(NullPointerException)。

我用MainActivity.this來訪問按鈕。我究竟做錯了什麼?

謝謝你的幫助!

public class MainActivity extends Activity { 

    // initialise variables 
    TextView textOut; 
    MediaPlayer mediaPlayer; 
    Button buttonPauze; 
    Button ok; 

    // ******************************************************* 
    // set Layout - on create 
    // ******************************************************* 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textOut = (TextView) findViewById(R.id.textView1); 


     // ******************************************************* 
     // set the play, generate and pauze buttons 
     // ******************************************************* 
     Button buttonPauze = (Button) findViewById(R.id.buttonPauze); 
     Button ok = (Button) findViewById(R.id.buttonStart); 

     buttonPauze.setOnClickListener(buttonPauseOnClickListener); 
    buttonPauze.setEnabled(false); 
    ok.setEnabled(true); 

    // ******************************************************* 
    // on click generate 
    // ******************************************************* 
    ok.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      MainActivity.this.buttonPauze.setEnabled(true); 

回答

2

替換:

Button buttonPauze = (Button) findViewById(R.id.buttonPauze); 

有:

buttonPauze = (Button) findViewById(R.id.buttonPauze); 

基本上,你有2 buttonPauze的,一個本地變量和其他的類字段。通過刪除Button,您在本地使用類字段buttonPauze併爲其分配適當的對象。


ok一樣的東西!

+0

您可能要解釋爲什麼這是正確的答案。 –

+0

@JamesBlack我只是做:) –

+0

哦,我的,當然!當我把它們作爲全局變量時,這個錯誤就出現了。感謝您指出!新視圖總是有幫助! – dorien

0

在行

Button buttonPauze = (Button) findViewById(R.id.buttonPauze); 

你定義和分配到一個局部變量,而不是實例變量。因此,當你在該行

MainActivity.this.buttonPauze.setEnabled(true); 

buttonPauze引用實例變量尚未設置,它仍然null。要解決,只要切換到

buttonPauze = (Button) findViewById(R.id.buttonPauze); 
2

NPE是因爲你在onCreate()分配按鈕參考局部變量,然後嘗試進入全球其中一個未初始化。與此

buttonPauze = (Button) findViewById(R.id.buttonPauze); 

Button buttonPauze = (Button) findViewById(R.id.buttonPauze); 

爲了避免錯誤這樣你可以適應常見的做法,前綴類全局變量,像

Button mButton; 

不要使用MainActivity.this.語法:替換此。當你訪問同一個類的變量時,它是毫無意義的。只是

buttonPauze.setEnabled(true); 

足夠(順便說一句:這是「暫停」)。

+0

謝謝!我嘗試過使用MainActivity.this,因爲它沒有工作。感謝pauSe提示。混亂來自荷蘭:-) – dorien

0

因爲您正在創建具有相同名稱的全局變量的局部變量,所以它給出了問題。

//不會產生局部變量

buttonPauze = (Button) findViewById(R.id.buttonPauze); 
    ok = (Button) findViewById(R.id.buttonStart); 
0

不要定義buttonPause兩次..

相關問題