0

だから、私は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クラス:

    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.
4

1 に答える 1

3

これを見て

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 (initio, fim);

これをに変更

Reta r1 = new Reta (new Ponto2D(), new Ponto2D());

また

Reta r1 = new Reta (new Ponto2D(<your values>), new Ponto2D(<values again>));
  • inicio は、前のものと同じ変数に解決できません。

  • 47 行目: トークン "[" の構文エラー、このトークンの後に式が必要です

            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];
    //... 
}

またはゲッター/セッターを生成します。

  • 式の型は配列型である必要があり
    ますが、前述のものについて考えをまとめると、RelativeLayout に解決されます。これは自動的に消えます。信じてくれ。私は技術者だ ;)

  • フィールド Reta.inicio は表示されません。これは今では一目瞭然です...

    public class Reta { public Ponto2D inicio; 公開 Ponto2D fim; public int cor; //... }

  • フィールド Reta.inicio が表示されない

  • フィールド Ponto2D.x は表示されません。

これが、ゲッターとセッターを使用し、異なるクラスからクラスのフィールドに直接アクセスしない理由です。

こんな感じに作ってみてください

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; //新しいオブジェクトの代わりにこれらを使用しましょう。新しいオブジェクトが必要でない限り。} }

このコード スタイルは、このような間違いを避ける方法を教えてくれます。

最後の部分:

これで生計を立てたい場合は、残りの部分を自分で把握する必要があります...あなたが持っているエラーは学生レベルの初心者プログラミングのものであり、実際には関係ありませんJava または Android。誰もあなたのために未定義の参照を修正するのに時間を無駄にしないので、あなたが理解し、解決する方法を知っている必要があります。

非静的フィールド 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 class DrawView extends View { public Paint paint = new Paint();

static Reta ar[] = new Reta [10];
public int a;

すべての DrawView インスタンスは同じ Reta 配列を持ちます:)おそらく、独自の長方形を持つ複数のドロービューが必要になるため、プライベートにする必要があります。また、プライベートの場合は、静的な方法 (Class.someMember) ではなく、インスタンス (classInstance.someMember) または ((new Class).someMember) からターゲットにすることはできません。

つまり.... Reta ar[] をプライベートにするかパブリックにするかを決定します。

 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 で検索してください :) これらはすべて本当によくあることで、何千回も取り上げられてきました。

于 2012-10-03T15:08:15.203 に答える