想知道是否有任何方法可以通过编程方式在android应用程序中构建和触发事件(例如,在click事件上)。
感谢。
抱歉,似乎问题不够明确,让我再解释一下:另一方面:
点击活动中的视图(x)-------> B.doSomething()--------> A.bIsDone()----->更改图像的视图(x)
执行正常,工作正常,没有问题。
问题是我想模拟这个过程是自动的,我的代码看起来像这样:
while (!b.isFinished()) {
try {
b.doSomething(<for View x>);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
问题是,在循环结束之前,它不会呈现任何内容。
我试图将循环放在另一个Thread中,但它抛出异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
我能为这个问题做些什么?我认为在视图上生成一个点击事件(通过代码),看它可以帮助与否。
你的解决方案是什么? 谢谢
答案 0 :(得分:4)
在Activity B
中,创建一个Handler
Handler mHandler = new Handler();
在doSomething()
内B
内使用mHandler.post(Runnable r)
更新您的ImageView。
Runnable应该包含如何更新UI的代码。
问题很可能是因为您尝试使用B
线程更新A
组件。我想你也可以使用runOnUiThread(Runnable r)
。
编辑问题前的原始答案。
<击>
密钥dispatchKeyEvent(KeyEvent event)
dispatchTouchEvent(MotionEvent)
请参阅其他dispatchXXX
功能。谷歌是你的朋友。 :)
以下是docs中dispatchKeyEvent的摘要。
public boolean dispatchKeyEvent(KeyEvent event)
将关键事件发送到焦点路径上的下一个视图。 此路径从视图树的顶部向下延伸到当前聚焦的视图。 如果此视图具有焦点,它将自行调度。 否则,它将在焦点路径下调度下一个节点。 此方法还会触发所有关键侦听器。
击><击> 撞击>
答案 1 :(得分:2)
如果您正在谈论听众,例如OnClickListener
,那么是:您可以创建自己的听众并触发它们。
基本上,您首先要为该Listener定义一个接口。对于曾经使用过的DaterTimePicker(有一个DaterPicker和TimerPicker)小部件
public interface OnDateTimeSetListener {
public abstract void onDateTimeSet(DatePicker datePicker, TimePicker timePicker);
}
接口定义了一个必须由侦听器实现的方法。
然后在课堂上你会做类似
的事情public class DateTimePickerDialog extends AlertDialog {
private OnDateTimeSetListener onDateTimeSetListener;
private DatePicker datePicker;
private TimePicker timePicker;
public void setOnDateTimeListener(OnDateTimeSetListener l) {
this.onDateTimeSetListener = l;
}
private onDateTimeSet() {
if(onDateTimeSetListener!=null)
onDateTimeSetListener.onDateTimeSet(this.datePicker, this.timePicker);
}
private doSomething() {
// Do your code here
// fire up the event once finished
onDateTimeSet();
}
}
setOnDateTimeListener()
用于设置来自类之外的侦听器(即在您的主要活动中)。
onDateTimeSet
(因此声明为私有)来触发事件并检查是否设置了onDateTimeSetListener
,否则如果未设置NullPointerException
,我们将获得onDateTimeSet
。如果已设置,请调用它的Activity
方法。
在您的主DateTimePicker dateTimePicker = (DateTimePicker)findViewById(R.id.datetime);
dateTimePicker.setOnDateTimeListener(new OnDateTimeSetListener () {
void onDateTimeSet(DatePicker datePicker, TimePicker timePicker) {
// Date/Time was changed
Log.d("OnDateTimeSet", "Date/time was updated");
}
});
中,您只需添加一个监听器并添加您需要的代码,例如:
OnClickListener
您可以像设置{{1}}一样设置侦听器。
对于一个简单的事件,你需要做很多代码,但据我所知,这是实现它的正确方法。
答案 2 :(得分:0)
我不确定构建和触发事件以及在哪个上下文(即来自视图,活动或服务)的意思,但是会试一试。
要创建键事件,只需使用KeyEvent Contructors。
对于MotionEvents,您可以使用[here] [1]
中的静态obtain
方法
如果要触发它们,请在目标Activity上使用前面提到的方法(如果在View中,可以将其作为上下文(getContext()
)获取)
希望它有所帮助,如果没有,请提供更多详细信息和/或示例代码。
[1]:http://developer.android.com/reference/android/view/MotionEvent.html#obtain(long,long,int,float,float,int)