Wolf Gang
Wolf Gang

Reputation: 43

Access variable inside same class

I have a custom view class with a button and I let the user touch the screen so I can retrieve the coordinates. What I want to do is, whenever he clicks the button, to set its text to the coordinates of his touch. How do I do this?

public class TargetView extends RelativeLayout{
    .
    .
    .
    public float x=0;
    public float y=0;

    public TargetView(final Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    ((Activity)getContext())
        .getLayoutInflater()
        .inflate(R.layout.target_view, this, true);

    Target=findViewById(R.id.target);
    Undo=(Button)findViewById(R.id.undo_bt);

    Undo.setOnClickListener(new OnClickListener(){

        public void onClick(View v) {
            Log.d("x,y",(String.valueOf(x)+","+String.valueOf(y)));
            Undo.setText(String.valueOf(x)+","+String.valueOf(y));

        }

    });

        @Override
        public boolean onTouchEvent(MotionEvent event){

        switch (event.getAction()){
        case (MotionEvent.ACTION_DOWN): {

                 x = event.getX();
                 y = event.getY();
            }
            return false;
        } 
        . 
        .
        .
 }

EDIT I have added a Log.d inside the button listener and it seems that the button gets clicked only before the user touches the rest of the screen and changes x,y (text changes to "0.0").

My .xml files:

   <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

       <android.archer.test.TargetView
        android:id="@+id/myTargetView"
        android:layout_width="300dip"
        android:layout_height="300dip"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/target" >
       </android.archer.test.TargetView> 

      </LinearLayout>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

  <View
       android:id="@+id/target"
       android:layout_width="300dp"
       android:layout_height="350dip" />

    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
      android:id="@+id/undo_bt"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_alignParentLeft="true"
          android:text="-" />

    </RelativeLayout>

Upvotes: 2

Views: 70

Answers (2)

Kumar Vivek Mitra
Kumar Vivek Mitra

Reputation: 33534

- Return super.onTouchEvent(event) at the end of onTouchEvent method.

Eg:

@Override
    public boolean onTouchEvent(MotionEvent event){

    switch (event.getAction()){
    case (MotionEvent.ACTION_DOWN): {

             x = event.getX();
             y = event.getY();
        }
        return super.onTouchEvent(event);
    }

- Moreover, there is an hierarchy of views that Android maintains and the events are handled accordingly. Every View in the hierarchy gets the event, but only if the parent event has not consume it. Meaning - if you have a parent view that handles onTouchEvent() and returns true every time, then the child never receives the event.

Upvotes: 1

dumbfingers
dumbfingers

Reputation: 7089

Change return in your snippet:

   @Override
    public boolean onTouchEvent(MotionEvent event){

    switch (event.getAction()){
    case (MotionEvent.ACTION_DOWN): {

             x = event.getX();
             y = event.getY();
        }
        return false;
    } 

to return true;

And if possible, you can put log into your onTouchEvent to see if it can return the coordinates.

Upvotes: 0

Related Questions