0

Catch The Cowsからクラスをダウンロードしました。これは Google マップ オブジェクトに似ているか、少なくともそれを使用しています。

タッチ可能にする必要がある画面の領域をリストする XML ファイルを解析し、このメソッドでそれらを作成します。 これはコンテキストのためにここにあります。コードの一部をコメントアウトし、問題を解決するために独自のコードを追加しました

private Area addShape( String shape, String name, String coords, String id) {   
        Log.v("IDS:", "id was "+id);
        Area a = null;
        String rid = id.replace("@+id/", "");
        Log.v("IDS:", "rid was "+rid);

        // Generate a new ID for the area.
        int _id = 1;
        View vi = findViewById(_id);
        while (vi!=null) {
            _id++;
            vi = findViewById(_id);
        }

                //View.generateViewId(); //=0;
        Log.v("IDS:", "After conversion final time "+_id);
        /*
        try {
            Class<R.id> res = R.id.class;
            Field field = res.getField(rid);    // eg. rid = area10
            _id = field.getInt(null);
            Log.v("IDS:", "After conversion "+_id);
        }
        catch (Exception e) {
           _id = 0;
           Log.e("Exception ",e.getMessage());
        } finally {
            Log.v("IDS:", "After conversion final time "+_id);
        }
        */
        if (_id != 0) {
            if (shape.equalsIgnoreCase("rect")) {
                String[] v = coords.split(",");
                if (v.length == 4) {
                    a = new RectArea(_id, name, Float.parseFloat(v[0]),
                            Float.parseFloat(v[1]),
                            Float.parseFloat(v[2]),
                            Float.parseFloat(v[3]));
                }
            } 
            if (shape.equalsIgnoreCase("circle")) {
                String[] v = coords.split(",");
                if (v.length == 3) {
                    a = new CircleArea(_id,name, Float.parseFloat(v[0]),
                            Float.parseFloat(v[1]),
                            Float.parseFloat(v[2])
                            );
                }
            } 
            if (shape.equalsIgnoreCase("poly")) {               
                a = new PolyArea(_id,name, coords);                     
            } 
            if (a != null) {
                addArea(a);
            }
        } else {
            Log.v("Loading ID: ","_id was 0");
        }
        return a;
    }

残念ながら、画面には何もレンダリングされませんでした。これは _id = 0 が原因でした。これは、次のコードで変更する必要があります。

   try {
                Class<R.id> res = R.id.class;
                Field field = res.getField(rid);    // eg. rid = area10
                _id = field.getInt(null);
            }

それを試してデバッグするために何をするのかわからないのですが、このスニペットが何をしているのか誰か説明できますか?

4

1 に答える 1

1

R は読み取り専用クラスです。これはコンパイル時に生成され、リフレクションを使用してそのフィールドを変更しないでください。また、フィールド値にアクセスするためにリフレクションを避ける必要があります。公式の API を使用する必要があります。

クラスの最初の行のコメントは

/* AUTO-GENERATED FILE.  DO NOT MODIFY. */ 
于 2013-07-30T12:41:59.243 に答える