2017-09-28 10 views
1

サークルを表示するカスタムビューを作成しました(ユーザーがこの "ボール"とさまざまなやり方でやりとりすることができます) 私の主なアクティビティクラスから、 "プロパティは、この場合、その色を変更します。Android - メインアクティビティからカスタムビューでメソッドを呼び出す方法

私の問題は、MainActivityクラスからさまざまなメソッドを呼び出そうとすると何も起こりません(エラーはなく、アプリケーションは実行されますが、実行しません)。しかし、CircleViewクラスから実行すると、ここでは作品(タッチ時に色を変えるなど)

は私のカスタムViewクラス(CircleView.java)です:

public class CircleView extends View { 
    private int circleColor = Color.GREEN; 
    private Paint paint; 

    public CircleView(Context context) { 
     super(context); 
     init(context, null); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_SCROLL: 
       this.circleColor = setRandomColor(); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_DOWN: 
       this.circleColor = setRandomColor(); 
       invalidate(); 
       break; 

     } 
     return super.onTouchEvent(event); 
    } 

    public CircleView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) { 
     paint = new Paint(); 
     paint.setAntiAlias(true); 
    } 

    public void setCircleColor(int circleColor) { 
     this.circleColor = circleColor; 
     invalidate(); 
    } 

    public int setRandomColor() { 
     Random random = new Random(); 
     int randomColor = Color.argb(255, random.nextInt(), random.nextInt(), random.nextInt()); 
     return randomColor; 
    } 

    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
//... 
//someXvalue, someYvalue, someRadius are being set here 
//... 

     paint.setColor(circleColor); 
     canvas.drawCircle(someXvalue, someYvalue, someRadius, paint); 
    } 
} 

そして、ここでは私のMainActivity.javaクラスです:

public class MainActivity extends Activity implements 
     GestureDetector.OnGestureListener { 

    private GestureDetectorCompat mDetector;  
    CircleView circle; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mDetector = new GestureDetectorCompat(this, this); 
     circle = new CircleView(this); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     this.mDetector.onTouchEvent(event); 
     return super.onTouchEvent(event); 
    } 

    @Override 
    public boolean onDown(MotionEvent event) { 
     return true; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent event) { 
     circle.setCircleColor(circle.setRandomColor(0)); 
     circle.invalidate(); 
     return true; 
    } 
} 

私はAndroid開発の初心者ですし、Javaも新しくなっています。私はそれがまだ完全に理解していないものである文脈と何かになる可能性があることを理解しています。 TouchEventsで何かになるかもしれません。そこにいる誰かが私の間違いを見ることができると確信しています。どんな助けもありがとうございます。

答えて

5

あなたcircleビューは、アクティビティのレイアウトの一部ではない、それは)ソリューション

1.ので、あなたの活動画面へのリンクを持っていないメモリ内だけでのオブジェクトのいずれかのアクティビティのビュー

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mDetector = new GestureDetectorCompat(this, this); 
     circle = new CircleView(this); 
     setContentView(circle); 
    } 
として circleを設定します

2.)activity_main.xml<yourpackagename.CircleView ...attributes .../>タグを作成し、findViewByIdを使用してアクティビティで初期化することができます。

+0

ああ、それは問題でした!私はちょうど " circle = new CircleView(this);"を変更しました。 〜 "Circle =(CircleView)findViewById(R.id.circleView);" "今はそれが動作します。これを見ていただきありがとうございます。 – Zerato

+0

@Zerato私は(私とMr.Gabe)が助けてくれることをうれしく思います –

3

1)ジェスチャーでやりたいことがタップであれば、代わりにあなたのビューにonClickListenerを実装するだけです。

2)実際にはどこでもGestureDetectorを使用しているわけではありません。それが動作する方法は、ジェスチャを取得するビューのonTouchListenerを設定し、イベントをジェスチャ検出器に送信することです。任意のビューのデータを検出器に送信することはないので、何もしません。

3)奇妙なバグではありません。なぜcircle.setColor(circle.setRandomColor())ですか?私はsetXXXという名前の関数が実際にXXXを設定することを期待しますが、後でそれを自分で行う必要はありません。その規約には従わないが、デバッグやメンテナンスは難しい。

編集@Pavneet_Singhが言ったこと - あなたのサークルはどこのレイアウトにもないので、画面には表示されません。

+0

私が掲示したコードは、私のプログラムの一部であり、私の問題を説明するのに必要な部分です。現実には、私はあらゆる種類のジェスチャーを使って、ボールを鍛え、動かし、投げる。私はあなたが2)で意味することを正確にはわかりませんが、目標はMainActivityでのみジェスチャ検出器を持つことです。あなたは3)について正しいです、それはちょうど "randomColor()"または何か、またはそのメソッド内で実際にInvalidate()を行うには、そのメソッドの名前を付けることをお勧めします。 – Zerato

関連する問題