在android中使用其他视图绘制屏幕

时间:2011-01-21 16:34:12

标签: android android-layout android-canvas android-edittext textview

我一直在寻找过去几个小时来回答一个非常愚蠢的问题。我知道如何在android中绘制画布,如果你扩展视图类,修改onDraw并将setContentView()设置为该类的新实例。但是,我还需要在活动的底部有2个TextView和2个EditTexts,如果setContentView()设置为只有该视图,这些视图显然不会显示。如何将所有这些放在屏幕上?

编辑:这是我的代码:(包名是android.physicsengine)

package android.physicsengine;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;

public class ResultantForceEngine extends Activity {
private EditText mag;
private EditText dir;
private View image;
private RelativeLayout layout;

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

    mag = (EditText)findViewById(R.id.magnitude);
    dir = (EditText)findViewById(R.id.direction);
}

public class MyView extends View{
    public MyView(Context context){

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

        super(context, attrs);

    }
    public MyView(Context context, AttributeSet attrs, int defStyle){

        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.drawColor(Color.BLACK);
        Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        circlePaint.setColor(Color.RED);
        canvas.drawLine(canvas.getWidth()/2, canvas.getHeight()/2-200, canvas.getWidth()/2 ,canvas.getHeight()/2+200, circlePaint);
        canvas.drawLine(canvas.getWidth()/2-200, canvas.getHeight()/2, canvas.getWidth()/2+200 ,canvas.getHeight()/2, circlePaint);
    }
}
}

和xml

<view class="android.physicsengine.ResultantForceEngine$MyView"
              android:id="@+id/image"
              android:layout_alignParentLeft="true"
              android:layout_alignParentRight="true"
              android:layout_alignParentTop="true"
              android:layout_alignParentBottom="true"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" />
<TextView     android:id="@+id/magText"
              android:text="Magnitude (N) ="
              android:textSize="15dip"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:gravity="center_vertical" 
              android:layout_alignParentLeft="true"
              android:layout_alignParentBottom="true" />
    <EditText android:id="@+id/magnitude"
              android:inputType="numberDecimal"
              android:layout_alignParentBottom="true" 
              android:layout_toRightOf ="@id/magText"
              android:layout_width="wrap_content"
              android:padding="3dip"
              android:layout_height="wrap_content" />

    <TextView android:id="@+id/dirText"
              android:text="Angle (deg) ="
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="15dip"
              android:layout_alignParentBottom="true"
              android:layout_toRightOf ="@id/magnitude"
              android:padding="3dip"
              android:gravity="center_vertical" />
    <EditText android:id="@+id/direction"
              android:inputType="numberDecimal"
              android:layout_alignParentBottom="true" 
              android:layout_toRightOf ="@id/dirText"
              android:layout_alignParentRight="true"
              android:layout_height="wrap_content" 
              android:padding="3dip"
              android:layout_width="wrap_content"/>

2 个答案:

答案 0 :(得分:3)

基本上,您需要使用自定义视图类和其他小部件来定义XML文件。在您的情况下,XML文件中会有自定义视图,2个textviews和2个edittexts。

您可以像使用任何其他窗口小部件一样在XML中定义自定义视图,除非您使用视图的命名空间和类名。

<com.example.android.myCustomView
    android:id="@+id/my_custom_view"
    ...

然后在您的活动中进行简单的调用

setContentView(R.layout.main); 

编辑:问题是您的课程是私有的,所以当您的活动调用布局并尝试对其进行充气时,它“不会被看到”。

Edit2:当然这不起作用,你正在使用内部类!如果你希望得到答案,你必须传达这样的东西。

内部类的XML语法不同。

<view class="com.example.android.MyClass$MyInnerClass"

答案 1 :(得分:0)

您应该能够像使用任何其他View类一样使用在res / layout / main.xml中扩展的类,并在布局.xml文件中添加TextView和EditTexts。我没有亲自这样做过,但我已经以这种方式使用了自定义View类。

然后对于你的setContentView,你只需要使用布局.xml文件,如:

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ...