-1

結果を複数のテキストビューに保存するアプリを作成しています。まず、ビューを取得する必要があります。これらは、結果1、....結果20という名前の20のビューです。テキストビューの配列に取得するにはどうすればよいですか。この方法を見つけましたが、長すぎます

TextView [] results = {(TextView)findViewById (R.id.result1),
            (TextView)findViewById (R.id.result2),(TextView)findViewById (R.id.result3),
            (TextView)findViewById (R.id.result4),(TextView)findViewById (R.id.result5),
            (TextView)findViewById (R.id.result6).....};

助けてくれてありがとう

4

2 に答える 2

0

テキストビューを含むレイアウトを親にするハンドルがある場合、次のような関数を使用してそれらを再帰的に検出できます。

void getTextViews(View view, List<TextView> textViews) {
  if (view instanceof TextView) {
    textviews.add((TextView)view);
  else if (TextView instanceof ViewGroup) {
    getTextViews((ViewGroup)view, textViews);
  }
}

今はこのように呼んでいます。

ViewGroup topLayout = findViewById(...);
List<TextView> views = new ArrayList<TextView>();
getTextViews(topLayout, views);
TextView[] textViewArray = textViews.toArray(new TextView[0]);

これはかなり長くなりますが、テキストビューを追加、削除、または名前変更する場合にコードを変更する必要がないという利点があります。

私見、少ないコードを書くことに集中するのではなく、明確なコードを書くことに集中してください。入力速度が生産性を制限する要因になることはめったにありません。

于 2012-07-25T15:31:42.420 に答える
0

あなたが始めた方法は正しいです。次に、その反復コードをサイクルに入れることを考えてください。

たとえば、TextView リソースの配列を入力として受け取るメソッドを設計し、「for」サイクルを使用して、対応する ID でそのビューを見つけます。

private TextView[] initTextViews(int[] ids){

        TextView[] collection = new TextView[ids.length];

        for(int i=0; i<ids.length; i++){
            TextView currentTextView = (TextView)findViewById(ids[i]);
            collection[i]=currentTextView;
        }

        return collection;
}

そして、次のように使用します。

// Your TextViews ids
int[] ids={R.id.result1, R.id.result2, R.id.result3};

// The resulting array
TextView[] textViews=initTextViews(ids);
于 2012-07-25T15:35:38.200 に答える