Android - 将自定义视图添加到 xml 布局中的组件

Android - Add a custom view to a component in a xml layout

我有一个从 class 视图扩展的摘要 class,以及 4 个子classes 来执行一系列矢量绘图。然后我有一个布局,其中有四个按钮和一个视图来显示图纸。根据单击哪个按钮,应在该视图中绘制不同的图形。问题是,当我单击一个按钮时,绘制的图形填满了整个屏幕,按钮消失了。这个问题怎么解决?

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);
}

您不能指望通过在 xml 布局中引用抽象 class 来实例化它。

您需要指定一个具体的实现才能正常工作。

因此,您可以在布局中提供某种类型的 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));
    }
}

您的自定义视图将在布局加载后立即实例化,因此不允许抽象 class!

这里有一个在您的 xml 中包含自定义视图的示例。 http://developer.android.com/training/custom-views/create-view.html