所以我在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文件?有办法吗?我应该吗?
答案 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是一个系统生成的文件,它是自动生成的。您不应该尝试手动编辑它。