2011-12-04 46 views
2

因此,我正在为Eclipse 4.0编程一个简单的计算器,我正在尝试对我的代码进行流式处理,并尽可能简化代码。我试图清理的地方是我的findViewById()。因为我有按钮0-9实例我有一个看起来像这样的代码十条线长块:可以/我应该编辑R.java文件。如果是这样,怎么样?

b0 = (Button) findViewById(R.id.b0); 
b1 = (Button) findViewById(R.id.b1); 
... 
b9 = (Button) findViewById(R.id.b9); 

正如你所看到的这个东西只是乞求一个for循环。所以我想做的是做两个数组。在活动的一个实例变量数组它包含所有的数字键盘按钮实例变量:

private Button[] numberPad = {b0,b1,b2,b3,b4,b5,b6,b7,b8,b9}; 

,然后在R.java文件中的ID类另一个数组保存所有按钮的ID变量会看像这样:

private static final int[] numberPad = {b0,b1,b2,b3,b4,b5,b6,b7,b8,b9}; 

的sooo我可以用这个循环减少十行按钮实例的两个:

for(int i = 0; i < numberPad.length; i++) 
    numberPad[i] = (Button) findViewById(R.id.numberPad[i]); 

当我键入了它的罚款,但WH我去保存它会自动恢复到它的原始形式。我没有看到这个代码有什么问题。据我所知,它不会产生任何错误。为什么我不能以这种方式编辑R.java文件?有没有办法?我是不是该?

+0

看看http://stackoverflow.com/questions/3545196/android-programatically-iterate-through-resource-ids – Kennet

回答

2

正如前面所说,R文件是(或应是)重新生成上每次构建自动。你应该尝试一些依赖注入框架(Roboguice适用于Android编程)来清理处理Views的问题。例如,而不是(从项目的资料为准代码):

class AndroidWay extends Activity { 
TextView name; 
ImageView thumbnail; 
LocationManager loc; 
Drawable icon; 
String myName; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    name  = (TextView) findViewById(R.id.name); 
    thumbnail = (ImageView) findViewById(R.id.thumbnail); 
    loc  = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); 
    icon  = getResources().getDrawable(R.drawable.icon); 
    myName = getString(R.string.app_name); 
    name.setText("Hello, " + myName); 
}} 

您可以使用更简单和更短的版本:

class RoboWay extends RoboActivity { 
@InjectView(R.id.name)    TextView name; 
@InjectView(R.id.thumbnail)  ImageView thumbnail; 
@InjectResource(R.drawable.icon) Drawable icon; 
@InjectResource(R.string.app_name) String myName; 
@Inject       LocationManager loc; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    name.setText("Hello, " + myName); 
} } 

这不仅有助于保持你的意见的管理清洁,就地,但也在测试时非常有帮助。

+0

喜欢这个答案。谢谢 – Dave

1

的R.java文件是重新创建。

0

你可以找到你的答案here

0

即使你没有尝试这种方法,你将不得不使用反射,以获得“findViewbyID”为(R.id.numberPad [1])现在没有反思工作。

不使用任何的反思,虽然会neaten你的代码是非常缓慢的。

0

你知道,你可以实现所有外部的 R.java文件和你自己的类 - 只需做一个静态导入R.id. *。

0

R.java是一个可自动生成的系统生成文件。你不应该尝试手动编辑它。

相关问题