2015-04-10 3 views
2

Это мои первые вопросы, поэтому я приношу свои извинения, если формат немного неправильный.Как сделать кнопку прокрутки влево на Android

В настоящее время я работаю над проектом в Android Studio, где мне нужно сделать кнопку динамически, которая будет прокручиваться влево (как что-то в Mail для iPhone). Я знаю, что здесь было много вопросов о прокрутке, но я не мог найти ничего, что конкретно отвечало бы на мой вопрос. Я разместил свой код ниже. Любая помощь приветствуется. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

public class ViewHistoryActivity extends ActionBarActivity { 
    //list holding the pre-sorted logs stored in database 
    private ArrayList<WorkoutLog> logHistory; 
    private GestureDetectorCompat gd; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_view_history); 
     logHistory = new ArrayList<WorkoutLog>(); 
     // Create database handler. This allows easy interaction with 
     // the app's database. 
     DatabaseHandler db = new DatabaseHandler(this); 
     // Get sorted (by date) ArrayList of WorkoutLogs. 
     logHistory = (ArrayList<WorkoutLog>) db.getAllWorkoutLogs(); 
     //loop that creates buttons based on the number of logs stored in the database 
     //these buttons will be scrollable because of the xml file. Clicking on a button will 
     //bring you to another activity in which you can see the contents of the log 
     for (int i==0; i<logHistory.size(); i++) { 
     //new button being created for log 
     Button myButton = new Button(this); 
     //set the text of the log to be the logs title (will add date later) 
     myButton.setText(logHistory.get(i).getLogTitle() + "\n" + logHistory.get(i).getLogDateString() + "\n\n\n"); 
     //needed because logHistory was complaining below for intent.putExtra(...) 
     final int test = i; 
     //allows user to click on it 
     myButton.setClickable(true); 
     //when the button is click on by the user, starts the new activity with the detailed 
     //log information. Right now, when clicked on the log just returns to the main page 
     myButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = new Intent(ViewHistoryActivity.this, ViewHistoryDetailed.class); 
      intent.putExtra("logID",String.valueOf(logHistory.get(test).getLogID())); 
       startActivity(intent); 
      } 
     }); 
     myButton.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       gd = new GestureDetectorCompat(ViewHistoryActivity.this, new MyGestureListener()); 
       gd.onTouchEvent(event); 
       return true; 
      } 
      class MyGestureListener extends GestureDetector.SimpleOnGestureListener { 
       //private static final String DEBUG_TAG = "Gestures"; 
       private static final int SWIPE_THRESHOLD = 100; 
       private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

       public boolean onDown(MotionEvent event) { 
        Toast.makeText(ViewHistoryActivity.this, "got to onDown", Toast.LENGTH_SHORT).show(); 
        return true; 
       } 
       public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
        Toast.makeText(ViewHistoryActivity.this, "Got to here", Toast.LENGTH_SHORT).show(); 
        boolean result = false; 
        try { 
         float diffY = e2.getY() - e1.getY(); 
         float diffX = e2.getX() - e1.getX(); 
         if (Math.abs(diffX) > Math.abs(diffY)) { 
          if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
           if (diffX > 0) { 
           onSwipeRight(); 
           } else { 
            // onSwipeLeft(); 
           } 
          } 
          result = true; 
         } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 
          if (diffY > 0) { 
           // onSwipeBottom(); 
          } else { 
           // onSwipeTop(); 
          } 
         } 
         result = true; 
        } catch (Exception exception) { 
         exception.printStackTrace(); 
        } 
        return result; 
       } 
       public void onSwipeRight() { 
        Toast.makeText(ViewHistoryActivity.this, "Caught swipe left", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     //gets the layout of this class, which has been nested inside a scrollable interface 
     LinearLayout layout = (LinearLayout) findViewById(R.id.View_History); 
     //sets button parameters 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     //adds button to the layout 
     layout.addView(myButton, lp); 
    } 
} 

Прямо сейчас, когда я нажимаю вниз, это дает мне сообщение Toast, «onDown была нажата». Но всякий раз, когда я пытаюсь бросить, он ничего не делает - я не получаю никаких сообщений.

ответ

1

Вам необходимо инициализировать GestureDetectorCompat (gd) в onCreate не каждый раз, когда происходит событие onTouch.

Попробуйте переместить код ниже в onCreate

gd = new GestureDetectorCompat(ViewHistoryActivity.this, new MyGestureListener()); 

GestureDetector сохраняет ссылку все различных MotionEvents (вниз, Переместить, вверх), так что он может рассчитать движение и скорость маха. Если он инициализируется каждый раз при возникновении события, он никогда не сможет вычислить полную последовательность MotionEvents (только последние MotionEvent)

+0

Спасибо за предложение, это имеет смысл. Я пытался сделать это заранее, но это дает мне ошибку: «Не удается разрешить символ MyGestureListener()». Я считаю, что это связано с тем, что этот класс встроен в метод onTouchListener(). Любые предложения о том, как это исправить? –

+1

Переместите MyGestureListener из onTouchListener. Либо поставьте его в отдельный класс, либо поставьте его как внутренний класс ViewHistoryActivity. Я бы посоветовал узнать, как работают классы на Java, поскольку это будет тяжелая борьба, если вы не понимаете этого, лучше понять принципы Java, прежде чем рискнуть в Android - это моя рекомендация. –

Смежные вопросы