可以/我应该编辑R.java文件。 如果是这样,怎么样?

所以我在Eclipse for Android 4.0中编写了一个简单的计算器,我正在尝试对我的代码进行流线化,并使其尽可能简单。 我正在尝试清理的地方是我的findViewById()。 因为我有按钮0-9来实例化我有一个十行长的代码块,如下所示:

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

正如你所看到的,这件事只是在寻求一个for循环。 所以我想做的是制作两个数组。 Activity中的一个实例变量数组,它包含数字键盘的所有Button实例变量:

 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}; 

因此,我可以使用此循环将十行Button实例减少为两行:

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

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

如前所述,R文件是(或应该)在每次构建时自动重新生成。 你应该尝试一些dependency injection框架( Roboguice适用于Android编程)来清理处理视图的问题。 例如,代替(从项目文档中获取的代码):

 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 ); } } 

这不仅有助于保持您的视图管理清洁和就地,而且在测试时也非常有用。

每次构建时都会重新创建R.java文件。

由于R.java是自动生成的,我认为编辑它是一个非常糟糕的主意。

有时在使用Eclipse时,我会遇到一些关于R.java的奇怪错误,为了解决这个问题,我只是清理项目,然后每一个都重新工作。

有关资源的更多信息,请查看此链接: http : //developer.android.com/guide/topics/resources/accessing-resources.html

即使您尝试了这种方法,您也必须使用Reflection来获取“findViewbyID”,因为(R.id.numberPad [i])现在可以在没有Reflection的情况下工作。

也不要使用Reflection,虽然它会使你的代码变得非常慢。

您知道,您可以在R.java文件之外和您自己的类中实现所有这些 – 只需执行R.id. *的静态导入。

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