2017-04-24 54 views
0

我是一個真正的新手在Java中,特別是這個對象定向編程,所以我會很感激任何輸入。重新使用部分代碼

我已經做了功能,改變了每個評級欄的選擇顏色,並且因爲有很少其他評級欄,我想重用此功能,我試圖在方法中插入整個代碼與每個對象和資源ID的名稱作爲參數,但我顯然不知道我在做什麼,因爲我得到名稱變量的錯誤已被定義在範圍和findViewById是非靜態方法,並從一個靜態上下文。

//rating bar 
static void starLight(String name, int resId) { 
    RatingBar name = (RatingBar) findViewById(resId); 
    name.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
     @Override 
     public void onRatingChanged(RatingBar ratingBar, float 
       rating, boolean fromUser) { 
      int whole = Math.round(rating); 

      Drawable progress = ratingBar.getProgressDrawable(); 
      if (whole == 1) { 
       DrawableCompat.setTint(progress, 
        ResourcesCompat.getColor(getResources(), R.color.colorGreen, null)); 
      } 
      if (whole == 2) { 
       DrawableCompat.setTint(progress, 
        ResourcesCompat.getColor(getResources(), R.color.colorOrange, null)); 
      } 
      if (whole == 3) { 
       DrawableCompat.setTint(progress, 
        ResourcesCompat.getColor(getResources(), R.color.colorRed, null)); 
      } 
     } 
    }); 
} 

如果你可以擺脫一些光線或指向正確的方向,我會非常感激。

+1

你有一個'String name'並試圖聲明一個'RatingBar name' - 所以'name'是指哪一個? – UnholySheep

+0

@UnholySheep糾正我因爲我可能是錯的。如果我的佈局文件中有很少的評級欄,並且希望將自定義的監聽器添加到它們中的每一個,那麼我是否不必爲每個通過findViewById鏈接的對象創建不同的名稱?並將聽衆設置爲每個人?所以我想如果我通過不同的名稱和正確的id作爲參數,我將能夠初始化它們中的每一個。 – aya9

+0

正如Michael在他的回答中指出的,您沒有使用'String name'參數,因此您可以將其刪除 - 但是您不能有兩個具有相同名稱的變量(在相同範圍內) – UnholySheep

回答

1

爲什麼不傳入特定的RatingBar而不是Resource ID?然後,您可以將方法簽名保留爲靜態。正如其他人指出的那樣,不需要String name參數。像這樣:

static int green = ResourcesCompat.getColor(getResources(), R.color.colorGreen, null)); 


static void starLight(RatingBar ratingBar) { 

Drawable progress = ratingBar.getProgressDrawable(); 
     if (whole == 1) { 
      DrawableCompat.setTint(progress, green); 
...} 
+0

幾乎工作。 getResources仍然會引發錯誤。 – aya9

+0

好的,將你的顏色定義爲方法外的整數(類級變量),並在方法中使用這些變量。 – mondakuwar

+0

謝謝@mondakuwar工作。我已經將這些顏色作爲方法的最終int參數傳遞,並且現在可以工作。點擊了我的腦袋,但它仍然感覺真的很壓倒。你確實幫助過我,我對此感到非常感激。 – aya9

1

看來你只需要改變函數簽名並刪除字符串參數:

static void starLight(/*String name,*/ int resId) { 

我不知道你打算使用它,但它好像你不實際使用它適合任何事情。

你得到編譯器錯誤的原因是因爲你有兩個名爲'name'的變量:一個作爲參數,一個作爲方法體內的局部變量。


作爲一個方面說明,您的當前版本重複了很多代碼。您可以重構這個:

Drawable progress = ratingBar.getProgressDrawable(); 
if (whole == 1) { 
    DrawableCompat.setTint(progress, 
     ResourcesCompat.getColor(getResources(), R.color.colorGreen, null)); 
} 
if (whole == 2) { 
    DrawableCompat.setTint(progress, 
     ResourcesCompat.getColor(getResources(), R.color.colorOrange, null)); 
} 
// etc. 

喜歡的東西

Drawable progress = ratingBar.getProgressDrawable(); 
int colour; 
switch (whole) 
{ 
    case 1: 
     colour = R.color.colorGreen; 
     break; 
    case 2: 
     colour = R.color.colorOrange; 
     break; 
    case 3: 
     colour = R.color.colorRed; 
     break; 
    default: 
     colour = //something. Or throw an exception maybe? 
} 
DrawableCompat.setTint(progress, ResourcesCompat.getColor(getResources(), colour, null)); 

有趣的是,這也最終會被比你現在已經有了什麼長,但我認爲它更容易看到發生了什麼事情因爲信息的密度較小。另外,如果您改變設置色調的方式,現在只需要在一個地方完成。

+0

謝謝@Michael。你的代碼看起來更整潔。對象和類對我來說仍然很困惑。我用mysql和javascript做了一些php,但是學習java和麪向對象的編程是另一回事。我現在進行了很多訓練,但仍然發現這一切都過於複雜和尷尬,但我相信一旦掌握了它,我就會更喜歡它。 – aya9

+0

@ aya9沒問題。這都是實踐。 – Michael