0

重複の可能性:
editTexts をループして値を確認する

約 100 個の editTexts (15 行、10 列) を含むレイアウトがあり、すべて行/列 ID (box0101、box0102 など) に基づいて名前が付けられています。

「クリア」ボタンがクリックされたときに呼び出される clearBoard() メソッドがあります (以下のコードを参照)。すべてのボックス (box0101、box0102、box0103 など) をループし、内容を "" に置き換えて空白にすることを目的としています。

LogCat に表示されるエラーには、java.lang.NoSuchFieldException: box0101 at java.lang.Class.getDeclaredField(Class.java:631) と表示されますが、xml で定義された box0101 が間違いなくあり、実行中に何度か参照しています。問題のないコード。

何か案は?

XML から

           <EditText 
            android:gravity="center"
            android:layout_marginLeft="10dp"
            android:id="@+id/box0101"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="@drawable/boxoutlineone" />    
        <EditText 
            android:gravity="center"
            android:id="@+id/box0201"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="#000000" />   
        <EditText
            android:gravity="center" 
            android:id="@+id/box0301"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="#000000" />   
        <EditText 
            android:gravity="center"
            android:id="@+id/box0401"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="#000000" />

活動中:

final EditText box0101 = (EditText)findViewById(R.id.box0101);
    final EditText box0201 = (EditText)findViewById(R.id.box0201);
    final EditText box0301 = (EditText)findViewById(R.id.box0301);
    final EditText box0401 = (EditText)findViewById(R.id.box0401);
    final EditText box0501 = (EditText)findViewById(R.id.box0501);

等...

    public void clearBoard() {
    final int ROW_COUNT = 14;
    final int COL_COUNT = 9;
    final String ROWS[] = {"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15"};
    final String COLS[] = {"01","02","03","04","05","06","07","08","09","10"};

    for(int i=0; i<ROW_COUNT; i++) {
        for(int j=0; j<COL_COUNT; j++) {
            String a = ROWS[i];
            String b = COLS[j];
            int editTextId=getResId("box"+a+b,this,id.class);
            EditText et=(EditText)findViewById(editTextId);    
            et.setText("");
        }
    }
}

public static int getResId(String variableName, Context context, Class<?> c) {

    try {
        Field idField = c.getDeclaredField(variableName);
            return idField.getInt(idField);
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
}
4

1 に答える 1

1

より実用的な方法ではなく、Fieldクラスを使用して取得することにした理由がわかりません。idResources.getIdetifier

for(int i=0; i<ROW_COUNT; i++) {
    for(int j=0; j<COL_COUNT; j++) {
        String a = ROWS[i];
        String b = COLS[j];
        int editTextId = getResources().getIdentifier("box" + a + b , "id", getPackageName());
        EditText et=(EditText)findViewById(editTextId);    
        et.setText("");
    }
}

EditTextまたは、 aにあるものに基づいてTableLayout、への参照をメソッドに渡し、TableLayoutメソッドでそれをトラバースすることができますgetChildAt(position)

于 2012-11-22T09:16:01.143 に答える