2017-04-24 53 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