2013-07-30 46 views
1

所以,我的朋友讓我在android工作室今天弄亂android編程。我開始製作初學者應用程序,並取得了一些好成績。但現在我正試圖獲得一個按鈕來更改textview的值。做一個文本視圖的按鈕更改值

下面是按鈕的代碼和TextView的

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add one" 
     android:id="@+id/button3" 
     android:layout_alignBottom="@+id/button2" 
     android:layout_alignRight="@+id/textView" 
     android:layout_toRightOf="@+id/button" 
     android:onClick="addone"/> 

<TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="" 
     android:id="@+id/counter" 
     android:textSize="40dp" 
     android:layout_alignTop="@+id/button3" 
     android:layout_centerHorizontal="true"/> 

這裏是試圖改變文本視圖的值的代碼。

public void addone(){ 

    numtest+=1; 
    TextView t = (TextView) findViewById(R.id.counter); 
    t.setText(numtest); 

} 

程序編譯並打開,但每當我按下按鈕時它崩潰。我相信我已經縮小了這條線的罪魁禍首,但我不知道爲什麼它不工作

TextView t = (TextView) findViewById(R.id.counter); 

任何想法?

+0

請務必檢查它可以幫助你知道哪兒來錯誤的logcat的。 –

回答

9

超載的方法是你的問題。這是微妙的,甚至是一個經驗豐富的程序員都可能犯的錯誤。我以前自己做過。

您正在致電TextView.setText(Integer)。這將嘗試加載一個資源ID爲numtest的字符串,該字符串不存在。

試試這個:

public void addone(View v){ 
    numtest+=1; 
    TextView t = (TextView) findViewById(R.id.counter); 
    t.setText(numtest+""); 
} 

這將調用TextView.setText(CharSequence)代替,這是你真正想要做的事。

另外,如Osmium USA所示,您的方法簽名不正確。按下回調方法的按鈕必須接受一個視圖,並且必須是公共的。

+0

+1好的解釋,但我認爲你應該指出方法簽名中的錯誤,以及 – codeMagic

+0

@codeMagic固定。只是輸入其他用戶所做的事情,感覺不對。我覺得我的捕獲更重要,不過......我們很快會看到真正的答案在這裏。打賭我的:)編譯器無法捕捉到意外的重載方法調用。 –

+1

他們都同樣重要,因爲兩者都是必要的。只要你在第一時間發現了一些你沒有注意到的事情時給予信任,就不要感到難過。不,它不能捕捉它,但它會在運行時捕獲,所以仍然非常重要 – codeMagic

6

當您給佈局元素一個執行的函數時,它會查找接受View的名稱(因此,如果您在XML中爲多個元素指定了相同的單擊行爲,那麼您知道點擊了什麼)。

所以addone()必須addone(View v)

From the Button Docs

爲了這個工作,方法必須公開並接受查看作爲其唯一的參數

William Morrison的也有好點。你應該把這個數字字符串無論是他做了什麼,或使用Integer類:

t.setText(Integer(numtest).toString()); 

t.setText(numtest+""); 
+0

我認爲這不是問題,但是感謝您收集方法簽名定義。如果不適合你,我會錯過的。 –

+0

@WilliamMorrison這不是唯一的問題,但它不會找到沒有正確簽名的方法 – codeMagic

+1

+1問題的好解釋。您可能只想在文檔中包含鏈接以供將來參考,以便人們知道在哪裏尋找這些東西 – codeMagic

0

這應該工作:

public void addone(View view){ 
    switch(view.getId()) 
    { 
     case R.id.button3: 
      numtest+=1; 
      TextView t = (TextView) findViewById(R.id.counter); 
      t.setText(Integer.toString(numtest)); 
     break; 
    } 
}