Reputation: 1365
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
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