从其他TextView下的XML文件中绘制视图

时间:2016-10-27 21:14:31

标签: android xml canvas view

我正在尝试在视图中绘制Canvas,并在我在XML文件中定义的一些TextView下显示此视图。 每次我测试应用程序时,它都不会在设备上启动。

然而,部件本身有效: 当我将setContentView(R.layout.activity_main);中的onCreate()更改为setContetView(new CustomView(this));时,它可以正常工作,但当然没有textView。

我的 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/sampleText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some Text"/>

    <com.example.simon.drawtest.CustomView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sampleText"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

我的 MainActivity.java

package com.example.simon.drawtest;
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

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

我的 CustomView.java

package com.example.simon.drawtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class CustomView extends View {

    private Paint paint;

    public CustomView(Context context) {
        super(context);   
        paint = new Paint();
        paint.setColor(Color.GRAY);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLUE);
        canvas.drawCircle(200, 200, 100, paint);
    }
}

1 个答案:

答案 0 :(得分:1)

显示您的整个activity_main.xml ...

两个View都应包含在例如FrameLayout

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/sampleText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some Text"/>
    <com.example.simon.drawtest.CustomView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sampleText"
        android:layout_alignParentBottom="true"/>
</FrameLayout>

编辑:好的,所以你有RelativeLayout ..还要注意,Android 5.0引入了elevation attribute,你可能会遇到一些问题,例如HERE

另外......您的TextView在XML中是第一位的,因此它将在您的自定义视图之前绘制(如果未设置高程,则按顺序绘制)

下面...... android:layout_below="@+id/sampleText"表示垂直轴下方。尝试删除此行

编辑:用户在评论中发布异常堆栈跟踪,所以下面我正在为他的案例粘贴正确答案(复制评论):

  

你的错误堆栈说

     

引起:java.lang.NoSuchMethodException:    [类android.content.Context,接口   android.util.AttributeSet]

     

你只有一个带Context的构造函数   只有,系统还需要一个附加的AttributeSet。查看   THIS问题&amp;回答,为您的CustomView应用适当的构造函数