Stas
Stas

Reputation: 1365

Cannot set OnTouchListener

Falks, it is going to be silly mistake but I really cannot guess where is it. I`m trying to set OnTouchListener but method onTouch is not invoked.

Here`s my code:

    public class StepActivity extends SherlockActivity  
    {
    private Recipe recipe = null;
    private String TAG = "StepActivity";
    private ArrayList<Step> steps;
    private int caret = 0;
    private int currentStep = 1;
    private int stepQuantity;
    private TextView viewStepBody;
    private TextView stepNumber;
    private ImageView viewPicture;
    private String bodyText;
    private String picture;
    private String [] pictures = new String [5];



    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.step_page);
        RelativeLayout view = new RelativeLayout(this);
        view.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motion) {

                Log.i(TAG, "In onTouch");
                float downXValue = 0;
                // Get the action that was done on this touch event
                switch (motion.getAction())
                {

                    case MotionEvent.ACTION_DOWN:
                    {
                        Log.i(TAG, "In onTouch1");
                        // store the X value when the user's finger was pressed down
                        downXValue = motion.getX();
                        break;
                    }

                    case MotionEvent.ACTION_UP:
                    {
                        Log.i(TAG, "In onTouch2");
                        // Get the X value when the user released his/her finger
                        float currentX = motion.getX();            
                        // going backwards: pushing stuff to the right
                        if (downXValue < currentX)
                        {
                            Log.i(TAG, "In onTouch previous");
                            goPrevious();
                        }

                        // going forwards: pushing stuff to the left
                        if (downXValue > currentX)
                        {
                            Log.i(TAG, "In onTouch next");
                            goNext();
                        }
                        break;
                    }
                }
                // if you return false, these actions will not be recorded
                return true;
            }

        });

        viewStepBody = (TextView)findViewById(R.id.step_body);
        stepNumber = (TextView)findViewById(R.id.step_number);
        viewPicture = (ImageView)findViewById(R.id.picture);


        TextView recipeTitle = (TextView)findViewById(R.id.recipe_title);
        try {
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            recipe = (Recipe)getIntent().getSerializableExtra("Recipe1");
            steps = recipe.getSteps();
            stepQuantity = steps.size();

            Log.d(TAG,"steps: " + steps.size());
            if (stepQuantity > 0) {
                Step step = steps.get(0);
                pictures[0] = Constants.URL + step.getImg_url();
                bodyText =  step.getInstruction();
                new DownloadImageTask().execute(pictures);
                recipeTitle.setText(recipe.getTitle());
            }
            updateInfo();
        } catch (Exception e) {
            Toast.makeText(this, "Error occured" + e.getMessage(), 200);
        }

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.step_menu, (com.actionbarsherlock.view.Menu) menu);
        return super.onCreateOptionsMenu(menu);
    }

    private void updateInfo() {
        new DownloadImageTask().execute(pictures);
        viewStepBody.setText(bodyText);
        stepNumber.setText(currentStep + "/" + stepQuantity);
    }

    private void goNext() {
        if (currentStep != stepQuantity) {
            caret++;
            currentStep++;
            Step newStep = steps.get(caret);
            pictures[0] = Constants.URL + newStep.getImg_url();
            bodyText = newStep.getInstruction();
            updateInfo();
        } else {
            caret = 0;
            currentStep = 1;
            Step newStep = steps.get(caret);
            bodyText = newStep.getInstruction();
            pictures[0] = Constants.URL + newStep.getImg_url();
            updateInfo();
        }
    }

    private void goPrevious() {
        if (currentStep != 1) {
            caret--;
            currentStep--;
            Step newStep = steps.get(caret);
            bodyText = newStep.getInstruction();
            pictures[0] = Constants.URL + newStep.getImg_url();
            updateInfo();
        }
        else {
            caret = stepQuantity - 1;
            currentStep = stepQuantity;
            Step newStep = steps.get(caret);
            bodyText = newStep.getInstruction();
            pictures[0] = Constants.URL + newStep.getImg_url();
            updateInfo();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId())  {
        case R.id.next: 
            goNext();
            return true;
        case R.id.previous: 
            goPrevious();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

Here`s my step_page.xml which passed to the setContentView() method.

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/step_layout1">
<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView android:id="@+id/recipe_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="23dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:textColor="#9d9d9d"
            android:textStyle="bold"
            android:layout_marginTop="4dp"/>

        <TextView android:id="@+id/step_word"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25dp"
            android:layout_below="@+id/recipe_title"
            android:textColor="#000000"
            android:textStyle="bold"
            android:text="@string/step_word"
            android:layout_marginTop="4dp"/>

        <TextView android:id="@+id/step_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25dp"
            android:layout_toRightOf="@+id/step_word"
            android:layout_below="@+id/recipe_title"
            android:textColor="#000000"
            android:textStyle="bold"
            android:layout_marginLeft="3dp"
            android:text="1/12"
            android:layout_marginTop="4dp"/>



        <ImageView
            android:id="@+id/picture"
            android:layout_width="300dp"
            android:layout_height="200dp"
            android:layout_below="@+id/step_word"
            android:layout_centerHorizontal="true"
            />

        <TextView android:id="@+id/step_body"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"
            android:textColor="#000000"
            android:paddingTop="2dp"
            android:layout_below="@+id/picture"
            /> 

    </RelativeLayout>
</ScrollView>
</RelativeLayout>

One more approach which was advised here doesn`t work. :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.step_page);
    RelativeLayout view = (RelativeLayout) findViewById(R.id.step_layout1);
    view.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motion) {

            Log.i(TAG, "In onTouch");
            float downXValue = 0;
            // Get the action that was done on this touch event
            switch (motion.getAction())
            {

                case MotionEvent.ACTION_DOWN:
                {
                    Log.i(TAG, "In onTouch1");
                    // store the X value when the user's finger was pressed down
                    downXValue = motion.getX();
                    break;
                }

                case MotionEvent.ACTION_UP:
                {
                    Log.i(TAG, "In onTouch2");
                    // Get the X value when the user released his/her finger
                    float currentX = motion.getX();            
                    // going backwards: pushing stuff to the right
                    if (downXValue < currentX)
                    {
                        Log.i(TAG, "In onTouch previous");
                        goPrevious();
                    }

                    // going forwards: pushing stuff to the left
                    if (downXValue > currentX)
                    {
                        Log.i(TAG, "In onTouch next");
                        goNext();
                    }
                    break;
                }
            }
            // if you return false, these actions will not be recorded
            return true;
        }

    });

Any remarks?

Upvotes: 2

Views: 2429

Answers (1)

josephus
josephus

Reputation: 8304

Contrary to what I think you think RelativeLayout view = new RelativeLayout(this); does, it doesn't give you the parent RelativeLayout view for your activity's layout. What you can do is assign an id to your parent RelativeLayout, get a hold of it using findViewById, and attach your onTouchListener or whatever to it.

Edit (since you posted the xml layout)

Your parent RelativeLayout is not exposed - the whole screen is being occupied by the ScrollView, so the RelativeLayout behind it is never accessible to touch. Since you don't have any clickable view inside your inner RelativeLayout (the one inside your ScrollView), you can attach your onTouch on that.

Upvotes: 1

Related Questions