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

时间:2011-12-04 11:01:24

标签: java android edit

所以我在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]);

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

6 个答案:

答案 0 :(得分:2)

如前所述,R文件是(或应该)在每次构建时自动重新生成。你应该尝试一些依赖注入框架(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 ); 
} } 

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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