2012-05-23 84 views
2

Falks,這將是愚蠢的錯誤,但我真的不能猜測它在哪裏。 我正嘗試設置OnTouchListener,但未調用onTouch方法。不能設置OnTouchListener

Here`s我的代碼:

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我step_page.xml其傳遞給的setContentView()方法。

<?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> 

此處建議的另一種方法不起作用。 :

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; 
     } 

    }); 

有沒有說法?

+0

你有沒有什麼異常 – Praveenkumar

+0

不,我只是沒有從onTouch方法的反應。在那裏有幾個Log.d(標籤,「消息」)。非他們被調用。 – Stas

+0

你能看到你的'RelativeLayout'輸出嗎? – Praveenkumar

回答

1

與我認爲你認爲RelativeLayout view = new RelativeLayout(this);所做的相反,它不會爲您的活動佈局提供父級RelativeLayout視圖。你可以做的是給你的父親RelativeLayout指定一個id,使用findViewById獲得它,並附加你的onTouchListener或任何它。

編輯(因爲您發佈的XML佈局)

你父母的RelativeLayout不外露 - 整個屏幕正在被滾動型所佔據,所以RelativeLayout的背後卻是從來沒有接觸到觸摸。 由於您的內部RelativeLayout(ScrollView中的一個)內沒有任何可點擊的視圖,因此您可以在其上附加onTouch。

+0

我編輯了問題,並添加了像你說的代碼。它沒有工作。我在做什麼錯了? – Stas

+0

看到我編輯的答案 – josephus

+0

謝謝,它使感覺。但是現在只有當我在空的表面上滑動時纔有效。如果是照片或textView - 它不起作用。在這種情況下,我必須將onTouthListener設置爲textView和照片? – Stas