Документация об этом действительно запутанна. Мне просто нужно добавить прямоугольники в представление I, определенное в файле макета main.xml. Это будет небольшая часть макета.Android: рисование фигур программно на вид в макете
Что я хочу достичь, я хочу добавить полки в комнату, но поскольку форма комнаты и полки меняются, мне нужно добавить их программно.
Ниже небольшая часть моего файла 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>
Это обычай View класс я создал для обработки динамических изменений:
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:
public void loadRoomPlan(Room room, ArrayList<Shelf> shelves){
CustomView asdsView = (CustomView)findViewById(R.id.roomplan);
asdsView.setRoom(room);
asdsView.setShelves(shelves);
asdsView.invalidate();
}
Я всегда получаю
Caused by: java.lang.ClassCastException: android.view.View cannot be cast to org.example.myproject.CustomView
ошибка.
Возможно, я делаю это очень неправильно, не так ли?
Благодарим вас за ответ. _shopplan_ - опечатка. Я отредактировал его в _roomplan_. Теперь я получаю сообщение об ошибке: android.view.InflateException: двоичная строка XML-файла # 81: ошибка раздувания класса org.example.myproject.CustomView – duru
И @Xavi, вы думаете, что я на правильном пути? – duru
См. Обновление. Можно сказать, что это лучший способ, но если вы получите то, что вам нужно, это вполне приемлемое решение. –