搜索并研究了这一段时间 - 没有运气。 (一定很简单?谢谢你的帮助。)
尝试获取/设置一个充满EditTexts文本的屏幕,但不是采用通常的,更加硬编码的方式:
... findViewById (R.id.SomeTextWidgetId) ;
相反,我试图通过一个包含(String)name_of_widget的变量找出一种可重用的方法。
在伪代码中:
findViewById(R.id。>> StringVarHere<<); //怎么做?
我也尝试了这种findViewById方法,但它不起作用(!?)
//// given:
static final String FIELD_TV_FEE = "TextViewFee" ;
static final String FIELD_TV_FOO = "TextViewFoo" ;
static final String FIELD_TV_FUM = "TextViewFum" ;
//// and some arbitrary number more of similar fields
static final String [] ALL_FIELDS = {
FIELD_TV_FEE ,
FIELD_TV_FOO ,
FIELD_TV_FUM // ...
} ;
//// ...
//// this part works
int ResourceID;
String stringVarHere = FIELD_TV_FEE;
//// outputs a correct id, say '0x7f05000f' as in R.id.xxx below
ResourceID = context
.getResources()
.getIdentifier ( stringVarHere,
"id",
context
.getApplicationInfo()
.packageName
) ;
Log.d ("MyClass" , "RESID = " + Integer.toHexString(ResourceID) ) ;
/*
* that's where I'm stuck ^^^ ... how do I do:
*/
String field_name ;
for ( field_name : ALL_FIELDS ) {
(EditText) SomethingLike_a_findViewById(field_name).setText ("Hello Wurld") ;
}
我试过.setId ......
//// details
<!-- excerpt from working xml layout -->
<EditText
android:id="@+id/TextViewFee"
android:inputType="text"
android:layout ... etc ...
/>
<EditText
android:id="@+id/TextViewFoo"
android:inputType="text"
android:layout ... etc ...
/>
<EditText
android:id="@+id/TextViewFum"
android:inputType="text"
android:layout ... etc ...
/>
正如所料,gen'ed R文件有这样的东西:
// ...
public static final class id {
public static final int TextViewFee=0x7f05000f;
public static final int TextViewFum=0x7f05001c;
public static final int TextViewFoo=0x7f05001d;
// ... etc
是的,谢谢 - 在活动中这样做是有意义的。我试图阻止它变得过于笨重。根据您和A-C的有用建议,这就是我现在正在做的事情。目的是将表单的所有字段文本放回一个String []中。 (我知道我也可以对所有领域进行暴力破解。)
你们对此有何看法 - 看起来与你的建议非常相似,madlymad?我想知道这是一种糟糕的设计方法吗?
public class FoodBar {
private Activity activity;
private Context ctx;
public FoodBar ( Activity _activity ) {
this.activity = _activity;
this.ctx = this.activity.getApplicationContext() ;
}
public String[] getTextFromAllEditTexts () { // the UI views
int res_id = 0;
int i = 0;
String [] retValues = new String [MyClassName.ALL_FIELDS_LENGTH] ;
for (String field : MyClassName.ALL_FIELDS_ALL_VEHICLES) {
res_id = this.ctx.getResources()
.getIdentifier ( field, "id", this.ctx.getPackageName() );
((EditText) this.activity
.findViewById (res_id))
.setText( "Meat and Potatoes" ) ;
// redundant - get it right back to make sure it really went in !
retVal[i++] = ((EditText) this.activity
.findViewById (res_id))
.getText().toString() ;
}
return retVal;
} // end func
} // end class
然后从Activity类中,它只是:
String [] theFields = null;
FoodBar = new FoodBar (this);
try {
theFields = FoodBar.getTextFromAllEditTexts ();
} catch (Exception e) {
Log.d ("OOPS", "There's a big mess in the Foodbar: " + e.toString() );
}
答案 0 :(得分:3)
你能做到的方式是(据我了解你的方式):
这可以在非活动(YourClassname.java)中:
public static int getMyId(Context context, String field) {
return context.getResources().getIdentifier (field, "id", context.getPackageName());
}
在Activity-class中:
for ( String field_name : YourClassname.ALL_FIELDS ) {
int resid = YourClassname.getMyId(context, field_name);
if(resid != 0) { // 0 = not found
EditText et = (EditText) findViewById(resid);
if (et != null) {
et .setText ("Hello Wurld") ;
}
}
}
但我认为在活动类中编写代码更好:
String packageName = getPackageName();
Resources res = getResources();
for ( String field_name : YourClassname.ALL_FIELDS ) {
int resid = res.getIdentifier (field_name, "id", packageName);
if(resid != 0) {// 0 = not found
EditText et = (EditText) findViewById(resid);
if (et != null) {
et .setText ("Hello Wurld") ;
}
}
}
答案 1 :(得分:2)
A-C建议的内容如下:
res_id = getResources().getIdentifier (field, "id", getPackageName());
((EditText)findViewById (res_id)).setText("NoLongerFubar");
这项工作 - 当我在测试台中独立尝试时。谢谢 !仍然不确定是什么爆炸,但我怀疑是无法访问上下文或资源项目。
答案 2 :(得分:1)
请注意,变量名称(例如R.id.some_id
)仅在编译时可用,并且在运行时无法从String值访问。由于这些ID被声明为int
,因此您可以考虑使用int[]
或List<Integer>
来存储ID。根据布局的动态以及使用其中的视图执行的操作,您甚至可能只想在运行时创建视图并存储数组或列表而不使用任何ID。