2011-10-29 38 views
20

Tôi mới sử dụng Android nên xin lỗi nếu câu hỏi này rất dễ trả lời. Tôi có hai nút, một nút giảm và tăng, và ở giữa chúng một TextView hiển thị một giá trị.Liên tục tăng giá trị số nguyên khi nhấn nút

Khi tôi nhấn nút giảm, giá trị trong TextView giảm và tăng khi tôi nhấn nút tăng, không có vấn đề với điều đó, tôi nhận được rằng làm việc nhưng vấn đề là giá trị chỉ tăng/giảm 1 trên một nhấp chuột. Những gì tôi đang cố gắng đạt được là khi tôi liên tục nhấn nút (ví dụ như nút tăng), giá trị cũng liên tục tăng lên và chỉ dừng lại khi tôi nhả nút tăng.

Điều đó có khả thi không? Nếu có, bạn có thể hiển thị một số mã mẫu hoặc tham chiếu về cách triển khai không? Cảm ơn!

Đây là main.xml tôi

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

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="44dp" 
     android:gravity="center_horizontal" > 

     <Button android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:text="&lt;" /> 

     <TextView android:id="@+id/textView1" 
      android:layout_width="50dp" 
      android:layout_height="fill_parent" 
      android:layout_alignBottom="@+id/button1" 
      android:layout_toRightOf="@+id/button1" 
      android:gravity="center" 
      android:text="45" /> 

     <Button android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toRightOf="@+id/textView1" 
      android:text="&gt;" /> 

    </RelativeLayout> 

</RelativeLayout> 

và đây là Main.java tôi

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class Main extends Activity { 

    private Button _decrease; 
    private Button _increase; 
    private TextView _value; 
    private static int _counter = 45; 
    private String _stringVal; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     _decrease = (Button) findViewById(R.id.button1); 
     _increase = (Button) findViewById(R.id.button2); 
     _value = (TextView) findViewById(R.id.textView1); 

     _decrease.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Log.d("src", "Decreasing value..."); 
       _counter--; 
       _stringVal = Integer.toString(_counter); 
       _value.setText(_stringVal); 
      } 
     }); 

     _increase.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Log.d("src", "Increasing value..."); 
       _counter++; 
       _stringVal = Integer.toString(_counter); 
       _value.setText(_stringVal); 
      } 
     }); 

    } 
} 

Trả lời

58

Đối rằng để làm việc, bạn cần một chủ đề đó sẽ cập nhật giá trị số nguyên khi bạn dài báo chí trên một nút.

Tạo một handler trong hoạt động của bạn:

private Handler repeatUpdateHandler = new Handler(); 

Và 2 vars mà sẽ nêu: là nó tăng hay giảm? Chỉ có một bộ tại một thời điểm.

private boolean mAutoIncrement = false; 
private boolean mAutoDecrement = false; 

Và giá trị số hiện

public int mValue; 

Và một lớp mà sẽ chạy trong một thread:

class RptUpdater implements Runnable { 
    public void run() { 
     if(mAutoIncrement){ 
      increment(); 
      repeatUpdateHandler.postDelayed(new RptUpdater(), REP_DELAY); 
     } else if(mAutoDecrement){ 
      decrement(); 
      repeatUpdateHandler.postDelayed(new RptUpdater(), REP_DELAY); 
     } 
    } 
} 

Thêm một người biết lắng nghe báo chí dài để nút của bạn:

mBTIncrement.setOnLongClickListener( 
      new View.OnLongClickListener(){ 
       public boolean onLongClick(View arg0) { 
        mAutoIncrement = true; 
        repeatUpdateHandler.post(new RptUpdater()); 
        return false; 
       } 
      } 
    ); 

mBTIncrement.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL) 
        && mAutoIncrement){ 
       mAutoIncrement = false; 
      } 
      return false; 
     } 
    }); 

Trong trường hợp trên, butto n là số tăng. Tạo một nút khác sẽ đặt mAutoDecrement thành true.

Và giảm một() sẽ là một chức năng, trong đó sẽ thiết lập int instance variable của bạn như thế này:

public void decrement(){ 
    mValue--; 
    _value.setText(""+mValue); 
} 

Bạn tìm thặng dư ra. Oh và REP_DELAY là biến tĩnh int được đặt thành 50.

Tôi thấy đây là trích đoạn từ Mã nguồn mở số Jeffson Cole có sẵn tại số http://www.technologichron.net/ Thuộc tính của tác giả phù hợp phải được thêm vào.

+0

cảm ơn bạn, tôi chắc chắn sẽ thử điều này. :) – src

+0

i theo hướng dẫn của bạn, tạo hàm 'increment()' và khai báo 'REP_DELAY', không có lỗi nhưng khi tôi nhấn nút tăng, giá trị tăng nhưng ngay cả khi tôi giải phóng nó, giá trị vẫn tăng và không dừng lại. Cùng đi với nút giảm. Tui bỏ lỡ điều gì vậy? – src

+1

Xin lỗi, quên việc thêm onTouchListener, điều này sẽ xóa cờ tăng (tương tự cho giảm) - vui lòng xem mã cập nhật. – Yar

2

Cách của tôi để tăng giá trị khi nhấp chuột dài là sử dụng Bộ hẹn giờ được sử dụng để kiểm tra định kỳ nếu nút vẫn được nhấn và tăng giá trị, nếu không hủy hẹn giờ. Để cập nhật Trình xử lý sử dụng giao diện người dùng.

vh.bttAdd.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 

      final Timer timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
       if(vh.bttAdd.isPressed()) { 
        final int track = ((ChannelAudioTrack) channels.get(vh.getAdapterPosition())).goToNextTrack(); 
        updateUI(vh,track); 
       } 
       else 
       timer.cancel(); 
      } 
      },100,200); 

      return true; 
     } 
    }); 

Handler:

private void updateUI(final TrackViewHolder vh, final int track) 
{ 
new Handler(Looper.getMainLooper()).post(new Runnable() { 
         @Override 
         public void run() { 
            vh.tvTrackNumber.setText(Integer.toString(track)); 
         } 
        }) ; 
} 
1

Tôi muộn để trả lời câu hỏi này, nhưng nó có thể giúp bất cứ ai đang tìm kiếm một câu trả lời tốt hơn.

Tôi đã tạo một lớp CounterHandler và cực kỳ dễ sử dụng để đạt được chức năng truy cập liên tục được đề cập ở trên.

Bạn có thể tìm lớp học theo ý chính sách sau bằng ví dụ "cách sử dụng". https://gist.github.com/nomanr/d142f4ccaf55ceba22e7f7122b55b9b6

Mẫu mã

new CounterHandler.Builder() 
      .incrementalView(buttonPlus) 
      .decrementalView(buttonMinus) 
      .minRange(-50) // cant go any less than -50 
      .maxRange(50) // cant go any further than 50 
      .isCycle(true) // 49,50,-50,-49 and so on 
      .counterDelay(200) // speed of counter 
      .counterStep(2) // steps e.g. 0,2,4,6... 
      .listener(this) // to listen counter results and show them in app 
      .build(); 

Thats tất cả. :)

Các vấn đề liên quan