0

これに関するドキュメントは本当に混乱しています。main.xml レイアウト ファイルで定義したビューに rectangels を追加するだけです。レイアウトのごく一部になります。

私が達成したいのは、部屋に棚を追加したいのですが、部屋の形状と棚が変わるため、プログラムで追加する必要があります。

以下は、main.xml ファイルの一部です。定義したビューを確認できます。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/relativeLayout2"
    android:layout_width="600dp"
    android:layout_height="650dp"
    android:layout_marginTop="70dp"
    android:layout_marginLeft="30dp"
    android:layout_toRightOf="@+id/relativeLayout1" >

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="@string/getDirections"
        android:textSize="20dp"
        android:textStyle="bold" />

    <View
        android:id="@+id/roomplan"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
            android:layout_below="@+id/textView3"
        android:layout_marginTop="40dp"
        android:background="@android:color/white" />

</RelativeLayout>

これは、動的な変更を処理するために作成したカスタム ビュー クラスです。

public class CustomView extends View {
    ShapeDrawable roomFrame;
    ArrayList<ShapeDrawable> shelfFrames;

    public CustomView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        roomFrame.draw(canvas);
        for (ShapeDrawable shelfFrame : shelfFrames){
            shelfFrame.draw(canvas);
        }
    }

    public void setRoom(Stage stage){
        roomFrame = new ShapeDrawable(new RectShape());
        roomFrame.getPaint().setColor(0xff74AC23);   
        roomFrame.setBounds(10, 10, stage.getWidth(), stage.getHeight());
    }

    public void setShelves(ArrayList<Shelf> shelves){
        shelfFrames = new ArrayList<ShapeDrawable>();
        for(int i = 0; i<shelves.size(); i++){
            ShapeDrawable shelfFrame = new ShapeDrawable(new RectShape());
            shelfFrame.getPaint().setColor(0xff74AC23);
            shelfFrame.setBounds(shelves.get(i).getXPosition(), shelves.get(i).getYPosition(), shelves.get(i).getWidth(), shelves.get(i).getHeight());
            shelfFrames.add(shelfFrame);
        }
    }
}

簡単に言えば、新しい間取りが尋ねられたときに、このクラスを xml レイアウトの View オブジェクトに割り当てようとしています。

public void loadRoomPlan(Room room, ArrayList<Shelf> shelves){
    CustomView asdsView = (CustomView)findViewById(R.id.roomplan);
    asdsView.setRoom(room);
    asdsView.setShelves(shelves);
    asdsView.invalidate();
}

私はいつも得る

原因: java.lang.ClassCastException: android.view.View を org.example.myproject.CustomView にキャストできません

エラー。

おそらく私はこれを非常に間違っていますね。

4

1 に答える 1

0

エラーは次の行にあるようです。

CustomView asdsView = (CustomView)findViewById(R.id.shopplan);

とはshopplan? それが間違いR.id.roomplanで、レイアウトのビューをカスタムビューに置き換えようとした場合:

<org.example.myproject.CustomView
    android:id="@+id/roomplan"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView3"
    android:layout_marginTop="40dp"
    android:background="@android:color/white" />

アップデート:

CustomView他の 2 つのコンストラクターをクラスに追加してみてください。

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

xml レイアウトでカスタム ビューを使用する場合、ビューはレイアウト属性 (コンストラクターの AttributeSet パラメータ) を処理する必要があります。

于 2012-06-02T23:06:37.917 に答える