当前位置: 首页 > 面试题库 >

Android长按活动

赖诚
2023-03-14
问题内容

我有两个按钮,每按一次将值递增和递减一个,它们与onClickListener配合得很好。我看到存在onLongClickListener,我认为这是用于触摸和保持事件。如果按住按钮,数字将如何快速递增/递减?

我假设onLongClickListener每次长按仅触发一次是正确的吗?我不知道的地方是否有更合适的监听器或属性?


问题答案:

您可以按照以下代码实现它。

package org.me.rapidchange;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class MainActivity extends Activity implements OnKeyListener, 
        OnTouchListener, OnClickListener {
    private class UpdateCounterTask implements Runnable {
        private boolean mInc;

        public UpdateCounterTask(boolean inc) {
            mInc = inc;
        }

        public void run() {
            if (mInc) {
                mHandler.sendEmptyMessage(MSG_INC);
            } else {
                mHandler.sendEmptyMessage(MSG_DEC);
            }
        }
    }

    private static final int MSG_INC = 0;
    private static final int MSG_DEC = 1;

    private Button mIncButton;
    private Button mDecButton;
    private TextView mText;
    private int mCounter;

    private Handler mHandler;
    private ScheduledExecutorService mUpdater;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_INC:
                        inc();
                        return;
                    case MSG_DEC:
                        dec();
                        return;
                }
                super.handleMessage(msg);
            }
        };
        mIncButton = (Button) findViewById(R.id.inc_button);
        mDecButton = (Button) findViewById(R.id.dec_button);
        mText = (TextView) findViewById(R.id.text);
        mIncButton.setOnTouchListener(this);
        mIncButton.setOnKeyListener(this);
        mIncButton.setOnClickListener(this);
        mDecButton.setOnTouchListener(this);
        mDecButton.setOnKeyListener(this);
        mDecButton.setOnClickListener(this);
    }

    private void inc() {
        mCounter++;
        mText.setText(Integer.toString(mCounter));
    }

    private void dec() {
        mCounter--;
        mText.setText(Integer.toString(mCounter));
    }

    private void startUpdating(boolean inc) {
        if (mUpdater != null) {
            Log.e(getClass().getSimpleName(), "Another executor is still active");
            return;
        }
        mUpdater = Executors.newSingleThreadScheduledExecutor();
        mUpdater.scheduleAtFixedRate(new UpdateCounterTask(inc), 200, 200,
                TimeUnit.MILLISECONDS);
    }

    private void stopUpdating() {
        mUpdater.shutdownNow();
        mUpdater = null;
    }

    public void onClick(View v) {
        if (mUpdater == null) {
            if (v == mIncButton) {
                inc();
            } else {
                dec();
            }
        }
    }

    public boolean onKey(View v, int keyCode, KeyEvent event) {
        boolean isKeyOfInterest = keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER;
        boolean isReleased = event.getAction() == KeyEvent.ACTION_UP;
        boolean isPressed = event.getAction() == KeyEvent.ACTION_DOWN
                && event.getAction() != KeyEvent.ACTION_MULTIPLE;

        if (isKeyOfInterest && isReleased) {
            stopUpdating();
        } else if (isKeyOfInterest && isPressed) {
            startUpdating(v == mIncButton);
        }
        return false;
    }

    public boolean onTouch(View v, MotionEvent event) {
        boolean isReleased = event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL;
        boolean isPressed = event.getAction() == MotionEvent.ACTION_DOWN;

        if (isReleased) {
            stopUpdating();
        } else if (isPressed) {
            startUpdating(v == mIncButton);
        }
        return false;
    }
}


 类似资料:
  • 问题内容: 我目前正在使用 要检测用户何时按下我的glSurfaceView,有没有一种方法可以检测何时长按。我猜如果我在开发文档中找不到很多东西,那将是围绕方法的某种变通。类似于注册ACTION_DOWN并查看ACTION_UP之前有多长时间。 如何使用opengl-es在android上检测长按? 问题答案: 尝试这个:

  • 我想在记录器服务运行时显示通知。用户应该能够在通知中直接暂停或停止记录器。所以我在通知中添加了两个按钮,并实现了一个BroadcastReceiver来处理按钮点击。 它几乎像我想要的那样工作,但有一个问题我无法解决。当用户单击按钮时,我想显示活动。这是我的代码: 目前执行每个按钮的正确操作,但如果用户单击时应用程序不可见,则不显示该应用程序。如何实现这一点? 有必要在这里实现BroadcastR

  • 这是我的问题: 我想在一个活动中实现两个按钮。一个是计算BMI,另一个是检查时间。我希望用户能在同一个活动中看到两个按钮,这也取决于他们想做什么。(这些功能不是同时工作的,而是分开的。另外,我在这两个活动中都实现了返回主页的按钮。) 在Android模拟器中,消息来自“应用程序继续停止”。 以下是主要活动。java文件: 谢谢! 这些消息是我按下导致应用程序停止的按钮后的stacktrace:

  • 我用这个教程来实现facebook登录等。 Facebook登录 我在这里添加了新的片段来显示朋友列表。现在,当我在新添加的片段上按下后退按钮时,它会把我带到SPLASH片段,我想要动作栏上同样的后退按钮行为。这意味着当我在我的新片段上时,它会在动作栏上显示一个后退按钮。按下后退按钮会把我带回SPLASH屏幕。

  • 问题内容: 是否可以在JavaScript(或jQuery)中实现“长按”?怎么样? HTML JavaScript 问题答案: 没有“ jQuery”魔术,只有JavaScript计时器。

  •        长按POI功能:在地图中任意位置进行长按,震动后将会弹出POI搜索结果。        POI搜索结果弹框包含:POI搜索名称、经纬度、天气、植被信息、调用导航等        植被信息:点击下方植被信息按钮后会跳转至植被信息页面进行植被信息查看。        调用导航:点击下方调用导航按钮会调起第三方当行应用进行导航。        POI内容保存:点击弹框右上方保存按钮,可跳转