在Android中具有其他视图的屏幕上绘制
-
16-10-2019 - |
题
在过去的几个小时中,我一直在寻找一个非常愚蠢的问题的答案。我知道如何在Android中的画布上绘制,如果将视图类扩展,将OnDraw和set setContentView()修改为该类的新实例。但是,我还需要在活动的底部有2个文本视图和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"/>
解决方案
基本上,您需要使用自定义视图类和其他小部件来定义XML文件。在您的情况下,XML文件中将有2个自定义视图,2个文本视图和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"
其他提示
您应该能够像其他任何视图类一样,在res/layout/main.xml中扩展的类,并在布局.xml文件中添加textView和EditTexts,就像正常情况一样。我没有亲自这样做,但是我以这种方式使用了自定义视图类。
然后,对于您的setContentView,您只需使用Layout .xml文件,例如:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
不隶属于 StackOverflow