As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened,
visit the help center提供指导。
已关闭8年。
因此,我在Java中有些菜鸟了,我正在尝试为Android开发一个应用程序。
Î出现一些错误,但我无法解决。谁能帮我找到问题所在?
这是我的mainActivity:
package com.example.w;
//import com.example.jkhgvcxz.R;
import views.DrawView;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
Ponto2D patual = new Ponto2D();
int contador = 0;
DrawView drawView;
View view2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(500, 500);
params.leftMargin = 50;
params.topMargin = 50;
drawView = new DrawView(this);
drawView.setBackgroundColor(Color.WHITE);
rl.addView(drawView, params);
drawView.setOnTouchListener(new View.OnTouchListener() {
// @Override
public boolean onTouch(View v, MotionEvent event) {
Ponto2D patual = new Ponto2D((int)event.getX(), (int)event.getY()); Reta r1 = new Reta (inicio, fim);
DrawView.ar[contador] =rl[];
inicio.X = \.X;
inicio.Y = fim.Y;
contador++;
if (event.getAction()== MotionEvent.ACTION_DOWN)
{
drawView.a=7;
drawView.antigox=drawView.X;
drawView.antigoy=drawView.Y;
drawView.X=event.getX();
drawView.Y=event.getY();
//drawView.draw();
drawView.desenhar_quadrado();}
return true;
}
});
}
public void btn(View v)
{
drawView.desenhar_quadrado();
}
public void btn_verde(View v)
{
drawView.paint.setColor(Color.GREEN);
}
public void btn_vermelho(View v)
{
drawView.paint.setColor(Color.RED);
}
public void btn_preto(View v)
{
drawView.paint.setColor(Color.BLACK);
}
public void btn_azul(View v)
{
drawView.paint.setColor(Color.BLUE);
}
public void btn_amarelo(View v)
{
drawView.paint.setColor(Color.YELLOW);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
我的Reta类(class):
package com.example.w;
public class Reta {
Ponto2D inicio;
Ponto2D fim;
int cor;
public Reta(Ponto2D p1, Ponto2D p2){
inicio = new Ponto2D(p1.x, p1.y);
fim = new Ponto2D(p2.x, p2.y);
}
}
我的DrawView类:
package views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
import com.example.w.Reta;
public class DrawView extends View {
public Paint paint = new Paint();
Reta ar[] = new Reta [10];
public int a;
public float antigox=0;
public float antigoy=0;
public float X=0;
public float Y=0;
public DrawView(Context context) {
super(context);
paint.setColor(Color.BLACK);
a=0;
}
public void desenhar_quadrado()
{
invalidate();
}
@Override
public void onDraw(Canvas canvas) {
for(int j=0; j<10; j++){
drawLine(ar[j].inicio.x, ar[j].inicio.y);
}
}
}
还有我的Ponto2D课:
package com.example.w;
public class Ponto2D {
int x;
int y;
public Ponto2D()
{
x = -1;
y = -1;
}
public Ponto2D(int x, int y)
{
this();
this.x = x;
this.y = y;
}
}
现在我有(44-50)
- The constructor Ponto2D(float, float) is undefined
- fim cannot be resolved to a variable
- inicio cannot be resolved to a variable
- line 47: Syntax error on token "[", Expression expected after this token
- Cannot refer to a non-final variable rl inside an inner class defined in a different method
- The field DrawView.ar is not visible
- The type of the expression must be an array type but it resolved to RelativeLayout
- fim cannot be resolved to a variable - inicio cannot be resolved to a variable.
同样在DrawView.java中,第34行我得到:
- The field Reta.inicio is not visible,
- The method drawLine(int, int) is undefined for the type DrawView
- The field Reta.inicio is not visible
- The field Ponto2D.x is not visible.
看这个
public class MainActivity extends Activity {
Ponto2D patual = new Ponto2D(); <---- here
//...
}
您从未在类中定义Ponto2D()构造函数。
添加一个
public Ponto2D()
{
x = -1;
y = -1;
}
public Ponto2D(int x, int y)
{
this();
this.x = x;
this.y = y;
}
第2部分:
public float X=0;
public float Y=0;
然后你这样做
Ponto2D patual = new Ponto2D(event.getX(), event.getY());
真的应该是
Ponto2D patual = new Ponto2D((int)event.getX(), (int)event.getY());
或者您将您的Ponto2D类重做为如下所示
public class Ponto2D
{
float x;
float y;
public Ponto2D ()
{
x=-1.0;
y=-1.0;
}
public Ponto2D(float x, float y)
{
this();
this.x = x;
this.y = y;
}
} //end of class
第3部分:
好的,我现在将描述每个错误。
构造函数Ponto2D(float,float)是不确定的-我们讨论了这一点。 fim无法解析为变量-您从未在MainActivity类中定义'fim'。您需要使用定义的值。我猜您想使用Reta类中的“fim”吗?在这种情况下...
Reta r1 =新Reta(inicio,FIM); 改成
Reta r1 = new Reta (new Ponto2D(), new Ponto2D());
要么
Reta r1 = new Reta (new Ponto2D(<your values>), new Ponto2D(<values again>));
inicio无法解析为变量
与上一个相同。 第47行: token “[”上的语法错误,此 token 后需要表达
DrawView.ar[contador] =rl[];
inicio.X = \.X;
inicio.Y = fim.Y;
这将永远不会编译儿子。我不知道您在尝试什么,但是我建议您收集关于此的想法:D
无法在不同方法中定义的内部类内引用非最终变量rl
这个很有趣。这意味着您无法定位rl,后者是在内部类的外部类中定义的。所以要解决它,只需交换一下
RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
有了这个
final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
该错误有时很难修复,有时您只添加final,有时需要变量的最终副本,而另一些时候则需要真正地重组代码。幸运的是,这次添加了final即可。
字段DrawView.ar不可见打开您的DrawView类,看看这个
public class DrawView extends View {
public Paint paint = new Paint();
Reta ar[] = new Reta [10]; //offending line
public int a;
//...
所以要么像
public class DrawView extends View
{
public Paint paint = new Paint();
public Reta ar[] = new Reta [10];
//...
}
或生成 getter / setter 。
表达式的类型必须是数组类型,但已解析为RelativeLayout
一旦您对前面提到的想法有了想法,这一想法就会自动消失。相信我,我是一名工程师;)字段Reta.inicio不可见,
这是不言自明的...
公共(public)类Reta
{
公开的Ponto2D创意;
公共(public)Ponto2D fim;
公共(public)情报
//...
字段Reta.inicio不可见字段Ponto2D.x不可见。 看到了,这就是为什么您使用getter和setter而不直接从不同的类访问该类的字段的原因。
尝试像这样
public class Ponto2D
{
private int x; //2d plane shouldn't use floating coordinates.
private int y;
Ponto2D() { }; //ctor does nothing.
public Ponto2D(int x, int y)
{
this();
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
}
public class Reta
{
private Ponto2D inicio;
private Ponto2D fim;
private int cor;
Reta()
{
fin = new Ponta2D(); //might cause an error because it's not public
inicio = new Ponta2D(-1, -1); //this should be ok
}
public Reta(Ponto2D p1, Ponto2D p2)
{
//this.inicio = new Ponto2D(p1.getX(),p1.getY());//这真是胡扯
//this.fim = new Ponto2D(p2.getX(),p2.getY());
this.inicio = p1;
this.fim = p2;//let使用这些代替新对象。除非您想要新对象。
}
}
这种代码样式将为您提供一个避免此类错误的思路。
最后部分:
我将为您提供帮助,其余的如果您想以此为生,就必须自己弄清楚……您所犯的错误是学生级别的初学者编程错误,与实际无关Java或Android。您需要了解并知道如何解决这些问题的人,因为没有人会浪费时间为您定义 undefined reference ,并且像这样提出它甚至是很不礼貌的(这表明您甚至没有阅读代码)
无法对非静态字段DrawView.ar进行静态引用
好的,这是您做了什么:
public class DrawView extends View {
public Paint paint = new Paint();
Reta ar[] = new Reta [10];
public int a;
因此DrawView类具有一个名为ar []的成员。
通常,您可以这样访问它:
DrawView dv = new DrawView();
System.out.println(Arrays.toString(dv.ar)); // dv.ar, not DrawView.ar
当您将其作为DrawView.ar调用时,这意味着该类的所有实例都相同
这就是为什么它说“不能以静态方式引用非静态变量ar”的原因。
当事物“静态”时,它们在该类的所有实例中都是共享/相同/公用的。
所以如果你这样做
公共(public)类DrawView扩展了View {
公共(public)Paint paint = new Paint();
static Reta ar[] = new Reta [10];
public int a;
您所有的DrawView实例都将具有相同的Reta数组:)由于您可能想要多个具有自己的矩形的drawview,因此它应该是私有(private)的。而且当它是私有(private)的时,您不能以静态方式(Class.someMember)而是以实例(classInstance.someMember)或((new class).someMember)为目标。
这意味着...。您决定Reta ar []是私有(private)的还是公开的。
public boolean onTouch(View v, MotionEvent event) {
Ponto2D patual = new Ponto2D((int)event.getX(), (int)event.getY());
Reta r1 = new Reta (inicio, fim);
//DrawView.ar[contador] =rl[]; //offending line
//it should be
//drawView.ar = something; but thats also wrong because you cannot refer to a non-final variable drawView in a inner-class blahblah so here's what you do
((DrawView)v).ar[contador] = rl; //or whatever you want it to be
;)
如果您还有其他问题,请阅读书籍。试试谷歌。 Google您的错误:)所有这些都是非常非常普遍的,已经被覆盖了数千次。