【问题标题】:Drawing on a screen with other views in android在 android 中使用其他视图在屏幕上绘图
【发布时间】:2011-01-21 16:34:11
【问题描述】:

过去几个小时我一直在寻找一个非常愚蠢问题的答案。如果您扩展视图类,修改 onDraw 并将 setContentView() 设置为该类的新实例,我知道如何在 android 的画布上绘图。但是,我还需要在活动底部有 2 个 TextView 和 2 个 EditText,如果 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"/>

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    setContentView(R.layout.main); 
    

    编辑:问题是你的类是私有的,所以当你的活动调用布局并试图膨胀它时它“不可见”。

    Edit2:这当然行不通,你使用的是内部类!如果您希望得到答案,就必须传达这样的信息。

    内部类的 XML 语法不同。

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

    【讨论】:

    • 我试过这个,我收到了运行时 xml 解析错误。我很肯定我拼写正确。我将在上面添加该代码。
    • Tom,您的自定义视图需要公开一个特殊的构造函数,以便 LayoutInflater 可以创建自定义视图的实例。您的 customView 类需要在 d.android.com/reference/android/view/…, android.util.AttributeSet) 处显示 ctor。 developer.android.com/resources/samples/ApiDemos/src/com/… 提供了一个示例实现
    • 如果我弄错了,我很抱歉,但构造函数不只是 public MyView(Context context, AttributeSet attrs){ super(context, attrs); } 就像我上面所说的那样?
    • 有 2 个错误:二进制 xml 文件第 7 行:为 android.physicsengine.ResultantForceEngine.MyView 膨胀类 android.physicsengine.ResultantForceEngine.MyView 和 ClassNotFoundException 时出错
    • “ResultantForceEngine”是 android.physicsengine 包中的包还是类?如果是类,则需要将 XML 文件更改为
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多