これを長らく検索して作業しています。 (これは、単純でなければならない支援のおかげで?。)findViewById(R.id。>> StringVarHere <<)の操作方法は?
通常、より多くのハードコード化された方法で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") ;
}
予想したように、私は、... GENを
//// 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 ...
/>
を.setIdを試してみました
// ...
public static final class id {
public static final int TextViewFee=0x7f05000f;
public static final int TextViewFum=0x7f05001c;
public static final int TextViewFoo=0x7f05001d;
// ... etc
「編Rファイルは、このような何かを持っています
はい、ありがとう - それは活動の中でそれを行うことが理にかなっています。私はコードが大きすぎるのを防ぐよう努めていました。ここで私はあなたとA-Cの有益な提案に基づいて今何をしているのですか? 1つのString []にフォームのすべてのテキストを戻すことを意図しています。 (私はすべてのフィールドにも力を入れることができると知っています)
皆さんはこれについて以下のすべてを考えていますか?あなたの提案、マッドマッドと非常によく似ていますか?これが貧弱な設計アプローチであるかどうか疑問に思っていますか?
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クラスから、それだけだ。これは作業を行い
res_id = getResources().getIdentifier (field, "id", getPackageName());
((EditText)findViewById (res_id)).setText("NoLongerFubar");
- 私はそれがテストにスタンドアロンしようとしたとき:
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());
}
あなたが試したと言うSOの答えを見ると、うまくいくはずです。 'setContentView()'を呼び出した後、すべてこれを行うようにしてください –
"SO"?あれは何でしょう ? ...うん、setContentViewを忘れると、参照するためのXMLがないことを意味します:) ... –
SO = "StackOverflow"。私はあなたが鉱山かその答えの実装を使っていた試練を投稿すべきだと思います。私は私の実装を試して、それは動作したので、私はそれがあなたのために働いていないのか分かりません。 –