按钮状态为down时填充textview

时间:2013-06-27 09:34:02

标签: android

我想在按钮关闭时用字符填充TextView 我写了这段代码,但它只写了一个字符?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button b = (Button) findViewById(R.id.btn);
    final TextView tv =(TextView) findViewById(R.id.txt1);

    b.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN){
                String s = tv.getText().toString();
                tv.setText( s + "E");
                return false;
            }
            return false;
        }
    });

}

如何在按钮状态停止时用字符填充textview?

3 个答案:

答案 0 :(得分:1)

好的..这是解决方案。尝试使用Handler

Button b = (Button) findViewById(R.id.btn);
        final TextView tv = (TextView) findViewById(R.id.txt1);
        b.setOnTouchListener(new OnTouchListener() {
            private Handler mHandler;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    if (mHandler != null)
                        return true;
                    mHandler = new Handler();
                    mHandler.postDelayed(mAction, 500);
                    return false;
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    if (mHandler == null)
                       return true;
                    mHandler.removeCallbacks(mAction);
                    mHandler = null;
                    return false;
            }
                return false;
            }

            Runnable mAction = new Runnable() {
                @Override
                public void run() {                 
                    String s = tv.getText().toString();
                    tv.setText(s + "E");
                    mHandler.postDelayed(this, 500);
                }
            };
        });

Reference。 我希望这会对你有所帮助。

答案 1 :(得分:1)

你可以这样做:

创建一个布尔成员变量,用作填充textview的标志。在触摸下设置boolean为true,并启动一个设置文本的runnable,然后启动另一个runnable。这会创建一个循环。 在on up up中,将boolean设置为false,循环将停止。像这样(未经测试):

private boolean mFillTextView = false;

@Override
public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN){
                mFillTextView = true;
                Handler mHandler= new Handler();
                mHandler.postDelayed(new MyRunnable(), 300);
                return false;
            }
            if (event.getAction() == MotionEvent.ACTION_UP){
                mFillTextView =false;
            }
            return false;
        }
    });

class MyRunnable implements Runnable{
    @Override
    public void run() {
        if (mFillTextView){
            mTextView.setText(mTextView.getText()+"a");
            mHandler.postDelayed(new MyRunnable(), 300);

        })};
    }

答案 2 :(得分:1)

您可以在收到TextView事件时启动填充MotionEvent.ACTION_DOWN的循环线程

然后,您可以使用MotionEvent.ACTION_UP事件来阻止该线程运行

在线程内部,您需要先调用UI线程,然后才能修改TextView

中的文本