通过android中的代码触发事件

时间:2010-09-25 17:17:39

标签: android

想知道是否有任何方法可以通过编程方式在android应用程序中构建和触发事件(例如,在click事件上)。

感谢。

抱歉,似乎问题不够明确,让我再解释一下:

  • 我有一个具有多个视图的Activity(让我们称之为A)(例如5个ImageView)。
  • 我的Activity使用的普通Java类(我们称之为B)。
  • 我的活动中有一个B实例。
  • 如果用户单击视图(图像视图),则视图OnClickListener将调用B
  • 中的方法
  • 在B中,如果操作成功,它将再次回调活动中的方法。
  • 在活动方法中,它将更改单击的ImageView的图像或状态。

另一方面:

点击活动中的视图(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.

我能为这个问题做些什么?我认为在视图上生成一个点击事件(通过代码),看它可以帮助与否。

你的解决方案是什么? 谢谢

3 个答案:

答案 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)