Android - 按住按钮重复操作

68

我承认我是个新手,在尝试开发Android应用。我一直在网上寻找如何实现“按住按钮重复操作”的建议——我创建了一个由按钮组成的自定义数字键盘,并希望拥有类似于退格键的行为。已经做到这一步了,我叫来了一个朋友,他以前没有编写过Android应用,但是了解很多C# / Java知识,似乎知道自己在做什么。

下面的代码运行良好,但我觉得它可以更简洁地实现。如果我漏掉了什么,我道歉,但希望这能解释我的思路。我认为onTouchListener没问题,但线程处理的方式感觉不太对。

有更好或更简单的方法吗?

public class MyApp extends Activity {

private boolean deleteThreadRunning = false;
private boolean cancelDeleteThread = false;
private Handler handler = new Handler();
    
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    
    //May have missed some declarations here...
        
    Button_Del.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            
           switch (event.getAction())
           {
               case MotionEvent.ACTION_DOWN:
               {
                   handleDeleteDown();
                   return true;
               }
               
               case MotionEvent.ACTION_UP:
               {
                   handleDeleteUp();
                   return true;
               }
               
               default:
                   return false;
           }
        }

        private void handleDeleteDown() {

            if (!deleteThreadRunning)
                startDeleteThread();
        }

        private void startDeleteThread() {

            Thread r = new Thread() {
                
                @Override
                public void run() {
                    try {
                        
                        deleteThreadRunning = true;
                        while (!cancelDeleteThread) {
                            
                            handler.post(new Runnable() {   
                                @Override
                                public void run() {
                                    deleteOneChar();
                                }
                            });
                            
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                throw new RuntimeException(
                                    "Could not wait between char delete.", e);
                            }
                        }
                    }
                    finally
                    {
                        deleteThreadRunning = false;
                        cancelDeleteThread = false;
                    }
                }
            };
            
            // actually start the delete char thread
            r.start();
        }
    });
}

private void handleDeleteUp() {
    cancelDeleteThread = true;
}

private void deleteOneChar()
{
    String result = getNumberInput().getText().toString();
    int Length = result.length();
    
    if (Length > 0)
        getNumberInput().setText(result.substring(0, Length-1));
        //I've not pasted getNumberInput(), but it gets the string I wish to delete chars from
}

1
那似乎并不像一个问题。但是代码看起来还不错。 - Konstantin Burov
同意,问题是是否有更好的Android特定方法来完成它。感觉为了实现一些如此微不足道的事情而编写了很多代码。 - Mark
12个回答

0

0
这是一个与使用嵌套点击监听器不同的解决方案。
用法:
 view.setOnTouchListener(new LongTouchIntervalListener(1000) {
        @Override
        public void onTouchInterval() {
            // do whatever you want
        }
 });

以及监听器本身:

public abstract class LongTouchIntervalListener implements View.OnTouchListener {

    private final long touchIntervalMills;
    private long touchTime;
    private Handler handler = new Handler();

    public LongTouchIntervalListener(final long touchIntervalMills) {
        if (touchIntervalMills <= 0) {
            throw new IllegalArgumentException("Touch touch interval must be more than zero");
        }
        this.touchIntervalMills = touchIntervalMills;
    }

    public abstract void onTouchInterval();

    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                onTouchInterval();
                touchTime = System.currentTimeMillis();
                handler.postDelayed(touchInterval, touchIntervalMills);
                return true;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                touchTime = 0;
                handler.removeCallbacks(touchInterval);
                return true;
            default:
                break;
        }
        return false;
    }

    private final Runnable touchInterval = new Runnable() {
        @Override
        public void run() {
            onTouchInterval();
            if (touchTime > 0) {
                handler.postDelayed(this, touchIntervalMills);
            }
        }
    };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接