src*_*src 28 events android button
我是Android新手,很抱歉,这个问题很容易回答.我有两个按钮,一个减少按钮和一个增加按钮,在它们中间有一个显示值的TextView.
当我按下减少按钮时,当我按下增加按钮时TextView中的值减小并增加,没有问题,我得到了它的工作,但问题是只需单击一下,值就会增加/减少1.我想要实现的是,当我连续按下按钮(例如增加按钮)时,该值也会不断增加,并且只有在我释放增加按钮时才会停止.
那可能吗?如果是这样,您能否展示一些示例代码或如何实现它的参考?谢谢!
这是我的main.xml
<?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="<" />
<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=">" />
</RelativeLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的Main.java
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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Yar*_*Yar 80
要使其工作,您需要一个线程,当您长按按钮时,该线程将更新整数值.
在您的活动中创建处理程序:
private Handler repeatUpdateHandler = new Handler();
Run Code Online (Sandbox Code Playgroud)
并且将说明2个变量:是增量还是减量?一次只能设置一个.
private boolean mAutoIncrement = false;
private boolean mAutoDecrement = false;
Run Code Online (Sandbox Code Playgroud)
和现在的数值
public int mValue;
Run Code Online (Sandbox Code Playgroud)
还有一个将在另一个线程中运行的类:
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 );
}
}
}
Run Code Online (Sandbox Code Playgroud)
为您的按钮添加长按监听器:
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;
}
});
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,按钮是增量按钮.创建另一个按钮,将mAutoDecrement设置为true.
而decrement()将是一个函数,它将像你这样设置你的实例int变量:
public void decrement(){
mValue--;
_value.setText( ""+mValue );
}
Run Code Online (Sandbox Code Playgroud)
你计算出增量.哦,REP_DELAY是一个设置为50的静态int变量.
我看到这是Jeffrey Cole在http://www.technologichron.net上提供的开源NumberPicker的摘录 .必须添加正确作者的归属.
虽然接受的答案是完全正确的,但可以稍微简化一下。
基本上,我们可以优化两件事:
所以这是我的版本:
// global variables
Handler handler = new Handler();
Runnable runnable;
increaseView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
runnable = new Runnable() {
@Override
public void run() {
if (!increaseView.isPressed()) return;
increaseValue();
handler.postDelayed(runnable, DELAY);
}
};
handler.postDelayed(runnable, DELAY);
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
这里可运行对象被重用。当视图不再被按下时,它将停止调用自己。
减少视图或按钮可以用类似的方式定义。
我回答这个问题很晚,但它可能会帮助任何正在寻找更好答案的人。
我创建了一个CounterHandler类,它非常容易使用来实现上述连续计数器功能。
您可以在以下要点中找到该类,并提供“如何使用”示例。 https://gist.github.com/nomanr/d142f4ccaf55ceba22e7f7122b55b9b6
示例代码
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();
Run Code Online (Sandbox Code Playgroud)
就这样。:)
我长按时增加值的方法是使用计时器,该计时器用于定期检查按钮是否仍处于按下状态,然后增加值,否则取消计时器。要更新UI,请使用Handler。
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;
}
});
Run Code Online (Sandbox Code Playgroud)
处理程序:
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));
}
}) ;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36980 次 |
| 最近记录: |