我有一个APP,bundle ID是com.MYAPP,然后我创建了一个名为com.reference的新包,里面有一个ViewCache文件。它首先在findViewById(R.id.text)上生成错误 findViewById(R.id.image)所以,我不得不导入com.MYAPP.R来摆脱错误。但是在Layout文件夹下,我有许多.xml布局文件,可以使用id = R.id.text和R.id.image。 我认为我需要指定一个特定的xml指向,以便ViewCache确切知道它使用的是哪个xml。我以为我需要导入com.MYAPP.R.row_item.xml。
我也有mainapp.xml,在布局文件夹下使用id.text和id.view.image。 但它不允许我指定import com.MYAPP.R.row_item.xml。
那么我应该在导入中指定什么?我认为导入com.MYAPP.R是不够的。
package com.reference;
import com.MYAPP.R;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class ViewCache {
private View baseView;
private TextView textView;
private ImageView imageView;
public ViewCache(View baseView) {
this.baseView = baseView;
}
public TextView getTextView() {
if (textView == null) {
textView = (TextView) baseView.findViewById(R.id.text);
}
return textView;
}
public ImageView getImageView() {
if (imageView == null) {
imageView = (ImageView) baseView.findViewById(R.id.image);
}
return imageView;
}
}
答案 0 :(得分:1)
澄清一些命名:你称之为bundle id(com.MYAPP)的是你的应用程序包(在清单文件中定义)。
R.java文件包含从您的资源生成的所有ID。它位于<application-package>.R
(因此在您的情况下为com.MYAPP.R
)。如果在多个布局文件中定义相同的id,则会在R文件中生成一个id。
findViewById(id)
在视图中查找具有指定ID的子视图。它不会在所有布局文件中查找具有此ID的视图。
如果您执行以下操作:
public class MyActivity extends Activity {
public void onCreate(Bundle b) {
super.onCreate(b);
this.setContentView(R.layout.myView); // you set the view here
TextView tv = (TextView) findViewById(R.id.text); // this looks in the layout myView for an item with id text
}
}
在您的示例findViewById(..)
中,我会在text
内查找ID为baseView
的子视图。只会baseView
搜索ID为text
的元素,而不会搜索任何其他布局。因此findViewById(..)
的结果取决于您为baseView分配的内容。