2012-06-02 2 views
0

Документация об этом действительно запутанна. Мне просто нужно добавить прямоугольники в представление 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

ошибка.

Возможно, я делаю это очень неправильно, не так ли?

ответ

0

ошибка, кажется, в этой строке:

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

Что такое shopplan? В случае, если это ошибка, и вы имели в виду R.id.roomplan попытаться subtitute Просмотреть в макете для вашего взгляда на заказ:

<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" /> 

UPDATE:

Попробуйте добавить другие два конструктора к вашему CustomView класс:

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

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

Когда вы используете пользовательский вид в макете xml, ваше представление должно иметь дело с атрибутами макета (параметр AttributeSet конструктора).

+0

Благодарим вас за ответ. _shopplan_ - опечатка. Я отредактировал его в _roomplan_. Теперь я получаю сообщение об ошибке: android.view.InflateException: двоичная строка XML-файла # 81: ошибка раздувания класса org.example.myproject.CustomView – duru

+0

И @Xavi, вы думаете, что я на правильном пути? – duru

+0

См. Обновление. Можно сказать, что это лучший способ, но если вы получите то, что вам нужно, это вполне приемлемое решение. –

Смежные вопросы