2015-07-22 46 views
1

我試圖創建一個用於編輯吉他標籤的應用程序。我有一組代表按鍵的按鈕,我希望能夠點擊按鈕打開一個警報對話框,將該按鈕的文本設置爲輸入的數字。Android編程 - 使用警報對話框以編程方式更改按鈕文本

下面的editFret函數由按鈕通過其onClick屬性調用。當我運行這個時,我可以按下一個按鈕,它會彈出對話框,我可以輸入數字。按下對話框中的確定後,該按鈕變爲空白。當我再次點擊該按鈕或任何其他按鈕時,該數字將顯示爲按鈕中的文本。它還會不斷更改之後點擊的任何按鈕中的文本,而不管最後一個輸入值是什麼。

我試着改變按鈕文本到一個點擊一個常量值,並沒有任何問題,所以我假設問題是與getFret函數,雖然我不可能看到它會是什麼,因爲它只是獲取一個字符串。

//Create string to store the fret number 
String fret; 

public void getFret(){ 
    //Create text input field 
    final EditText input = new EditText(this); 
    input.setInputType(InputType.TYPE_CLASS_NUMBER); 
    input.setFilters(new InputFilter[] {new InputFilter.LengthFilter(2)}); 

    new AlertDialog.Builder(this) 
      .setTitle("Edit fret") 
      .setMessage("Input fret number") 
      .setView(input) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        fret = input.getText().toString(); 
       } 
      }) 
      .setNegativeButton("Cancel",new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        //Do nothing 
       } 
      }).show(); 
} 

public void editFret(View view){ 
    Button button = (Button) view; 
    getFret(); 
    button.setText(fret); 
    button.invalidate(); //Don't know if this is necessary 
} 
+0

其他人發佈了正確的答案,但我也想補充說,你應該使用.setNegativeButton(「Cancel」,null),而不是設置一個onclick監聽器什麼也不做。更容易和高效。 – tash

回答

1

你需要你的setPositiveButton更改爲:

.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        fret = input.getText().toString(); 
        button.setText(fret); 
       } 
      }) 

和更改按鈕全球變量而不是本地的。

這裏的問題是當你調用editFret(視圖視圖)時,它也會調用getFret(),它將顯示對話框,然後調用button.setText(fret)而不用等待用戶按下OK或Cancel,需要在調用OnClickListener時設置文本。

+0

**'並將Button更改爲全局變量而不是本地** **是在您的活動中只需使用一次對象而不必在整個活動的生命週期中保留其值的時候的錯誤方法。 – Gavin

+0

我同意你的看法,但由於它是一個按鈕,我猜他也會想要添加onClickListener和其他東西。但這只是我自己的假設。 –

+0

這樣做。感謝您的解釋。我只需要按鈕是本地的,所以我將它移動到getFret函數中,並將它設置爲onClick函數,並且能夠完全刪除editFret函數。 – TR15

0

那麼當用戶點擊AlertDialog OK設定值。這裏是它如何

new AlertDialog.Builder(this) 
      .setTitle("Edit fret") 
      .setMessage("Input fret number") 
      .setView(input) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        fret = input.getText().toString(); 
        //TODO: HERE SET THE BUTTON VIEW AND TEXT TO IT 
        Button button = (Button) findViewById(R.id.button); // This line 
        button.setText(fret); // And this line 
       } 
      }) 
      .setNegativeButton("Cancel",new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        //Do nothing 
       } 
      }).show(); 

它會設置文本時,AlertDialog的確定會被點擊!

可能在您的方法中設置文本是冗餘方法。你應該更好地使用這種方法只是調用AlertDialog

public void editFret(View view){ 
    //Button button = (Button) view; 
    getFret(); 
    //button.setText(fret); 
    //button.invalidate(); //Don't know if this is necessary 
} 

希望工程或讓我知道,乾杯

相關問題