2015-02-18 2 views
0

У меня есть абстрактный класс, расширенный от класса View и 4 подкласса для выполнения серии векторных чертежей. Затем у меня есть макет с четырьмя кнопками и представлением, чтобы показать чертежи. В зависимости от того, какая кнопка нажата, в этом представлении должны быть нарисованы разные цифры. Проблема в том, что когда я нажимаю одну кнопку, рисунки рисуются на весь экран, кнопки исчезают. Как можно решить эту проблему?Android - добавление пользовательского представления к компоненту в макете xml

public abstract class DrawFiguresWithDimensions extends View{ 
    public DrawingFiguresWithDimensions(Context context) 
    //... 
} 
public class DrawRectangleWithDimensions extends DrawFiguresWithDimensions {..} 
public class DrawTWithDimensions extends DrawFiguresWithDimensions {..} 
public class DrawDobleTWithDimensions extends DrawFiguresWithDimensions {..} 
public class DrawBoxWithDimensions extends DrawFiguresWithDimensions {..} 

Вот "activity_main.xml":

<LinearLayout 
android:id="@+id/mainLayout" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:custom="http://schemas.android.com/apk/res-auto" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:layout_weight="10" 
tools:context=".MainActivity"> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:layout_weight="1" 
    android:weightSum="4" 
    > 
    <Button 
     android:id="@+id/btnSecRec" 
     android:text="Rec" 
     android:onClick="btnSecRec" 
     android:layout_weight="1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
    <Button 
     android:id="@+id/btnSecT" 
     android:text="T" 
     android:onClick="btnSecT" 
     android:layout_weight="1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
    <Button 
     android:id="@+id/btnSecDobleT" 
     android:text="DT" 
     android:onClick="btnSecDobleT" 
     android:layout_weight="1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
    <Button 
     android:id="@+id/btnSecCajon" 
     android:text="Box" 
     android:onClick="btnSecCajon" 
     android:layout_weight="1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
    </LinearLayout> 
<View class="com.tari.drawfigureswithdimensions.DrawFiguresWithDimensions" 
    android:id="@+id/viewDatosSec" 
    android:layout_weight="8" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 

"MainActivity.java"

public class MainActivity extends Activity { 

DrawRectangleWithDimensions sec1; 
DrawTWithDimensions sec2; 
DrawDoubleTWithDimensions sec3; 
DrawBoxWithDimensions sec4; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void btnSecRec(View view){ 
    sec1 = new DrawRectangleWithDimensions(this); 
    sec1.setFigure(10, 40); 
    setContentView(sec1); 
} 
public void btnSecT(View view){ 
    sec2 = new DrawTWithDimensions(this); 
    sec2.setFigure(100, 20, 20, 70); 
    setContentView(sec2); 
} 
public void btnSecDobleT(View view){ 
    sec3 = new DrawDoubleTWithDimensions(this); 
    sec3.setFigure(100, 20, 20, 90, 50, 25); 
    setContentView(sec3); 
} 
public void btnSecCajon(View view){ 
    sec4 = new DrawBoxWithDimensions(this); 
    sec4.setFigure(100, 20, 20, 80); 
    setContentView(sec4); 
} 

ответ

0

Вы не можете ожидать, чтобы создать экземпляр абстрактного класса по ссылаясь на него в вашем XML-макете.

Вам нужно будет указать конкретную реализацию, чтобы она работала должным образом.

Таким образом, вместо этого вы можете предоставить ViewGroup некоторого вида в своем макете, чтобы служить родителем для любой конкретной реализации DrawFiguresWithDimensions, которую вы хотите показать, на основе нажатия какой кнопки.

Затем динамически удаляйте текущий дочерний элемент, связанный с вашей родительской группой ViewGroup, и добавьте тот, который соответствует вашей нажатой кнопке.

По сути, вы хотите, чтобы заменить это в макете activity_main.xml:

<View class="com.tari.drawfigureswithdimensions.DrawFiguresWithDimensions" 
android:id="@+id/viewDatosSec" 
android:layout_weight="8" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
/> 

с этим:

<RelativeLayout 
    android:id="@+id/viewDatosSec" 
    android:layout_weight="8" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 

а затем при обработке нажатия кнопок, сделать что-то вроде:

@Override 
public void onClick(View v) 
{ 
    int id = v.getId(); 

    if (id == R.id.btnSecCajon) 
    { 
     RelativeLayout parent = (RelativeLayout)findViewById(R.id.viewDatosSec); 
     parent.removeAllViews(); 
     parent.addView(new DrawBoxWithDimensions(this)); 
    } 
} 
+0

Спасибо за ваш комментарий, Майкл. Я создал ViewGroup с четырьмя представлениями DrawFiguresWithDimensions в макете, но я все еще придерживаюсь того, как реализовать код динамически. Не могли бы вы рассказать мне, как это сделать, например, в public void btnSecRec (View view) {}, используя DrawRectangleWithDimensions? – David

+0

@David Я только что обновил свой ответ с дополнительной информацией о том, как вы динамически размещаете представление в родительской группе ViewGroup. –

+0

Спасибо, Майкл! что решило проблему! Спасибо, что были настолько конкретны, это отлично подходит для начинающих, таких как я. – David

0

Ваш пользовательский просмотр будет создан, как только макет будет загружен, поэтому NO abstract class al спустил!

Здесь приведен пример пользовательского представления в вашем xml. http://developer.android.com/training/custom-views/create-view.html

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