【问题标题】:Drawing a circle in android在android中画一个圆圈
【发布时间】:2013-03-09 03:05:37
【问题描述】:

我已经学习了一个星期的android。我正在编写一个简单的程序来画一个圆圈。但是当我运行它时它告诉我程序已经停止。我一遍又一遍地阅读代码,但找不到错误。你能帮帮我吗?

package org.example.viewwithlines;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
public class MainActivity extends Activity {


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

    static public class GraphicsView extends View 
    {
        Paint p;
        public GraphicsView(Context context) {
        super(context);
        p=new Paint();
        p.setColor(Color.MAGENTA);
        }
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawCircle(30, 40, 10, p);   
        }
        }
}

这是xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <org.example.viewwithlines.MainActivity.GraphicsView
    android:id="@+id/graphics" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

</LinearLayout>

【问题讨论】:

  • 请添加显示异常的logcat输出
  • 它可以编译,但是当我在模拟器上运行它时,它告诉我应用程序已停止
  • 当你在模拟器上运行程序时,应该有一个日志会显示异常。此日志称为 logcat。当程序崩溃时,你能找到这个日志并粘贴它显示的内容吗?
  • 03-08 17:14:33.751:E/AndroidRuntime(612):在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)

标签: android


【解决方案1】:

你想做什么?

对于背景和一般用途,您可以简单地创建一个可绘制资源并将其设置为方形视图:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <solid android:color="#FF0000"/>
</shape>

【讨论】:

    【解决方案2】:

    很难说出它不起作用的确切原因。我至少看到两个原因。

    1. 布局中的类名错误。由于GraphicsView是嵌套类,所以应该是org.example.viewwithlines.MainActivity$GraphicsView

      <view
          class="org.example.viewwithlines.MainActivity$GraphicsView"
          android:id="@+id/graphics" 
          android:layout_width="fill_parent" 
          android:layout_height="fill_parent"/>
      
    2. 您必须提供一个以ContextAttributeSet 作为参数的构造函数

      public GraphicsView(Context context, AttributeSet attrs) {
          super(context, attrs);
          p=new Paint();
          p.setColor(Color.MAGENTA);
      }
      

    【讨论】:

      【解决方案3】:

      当你扩展一个视图时,你需要给它添加不同的构造函数,让它在不同的环境下工作。当您在 xml 中使用 View 时,它会使用包含 AttributeSet 的构造函数。

      尝试添加如下所示的:

          public GraphicsView(Context context, AttributeSet attribs) {
              super(context, attribs);
              p=new Paint();
              p.setColor(Color.MAGENTA);
          }
      

      请参阅this post,以获得更详细的说明。

      另外,您正在尝试在 xml 中引用内部类。当你这样做时,你必须使用$ 而不是.。这样做的问题是$ 是 xml 标签名称中的非法字符,所以你必须这样做:

      <view class="org.example.viewwithlines.MainActivity$GraphicsView" 
          ...
          attribs here
          ... />
      

      【讨论】:

        猜你喜欢
        • 2012-11-12
        • 2014-11-15
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多