2010-09-25 5 views
1

Vous vous demandez s'il existe un moyen de générer et de déclencher un événement (par exemple sur un événement click) dans les applications android par programme.déclencher un événement par code dans android

Merci.

désolé, il semble question ne suffit pas claire, laissez-moi vous expliquer un peu plus:

  • J'ai une activité (permet de l'appeler A) avec plusieurs vues (5 ImageView par exemple).
  • Et une classe Java normale (appelons-la B) qui est utilisée par mon activité.
  • Il existe une instance de B dans mon activité.
  • Si l'utilisateur clique sur une vue (vue image), la vue OnClickListener appelle une méthode dans B
  • Dans B, si l'opération réussit, il rappelle une méthode en activité à nouveau. En mode d'activité, il changera l'image ou l'état pour ImageView cliqué.

dans d'autre part:

cliquez sur Affichage (x) Activité -------> B.doSomething() --------> A.bIsDone() -----> changer l'image pour la vue (x)

avec l'exécution normale, son fonctionnement et il n'y a aucun problème.

le problème est que je veux simuler ce processus pour être automatique, mon code ressemble à ceci:

 while (!b.isFinished()) { 
      try { 
       b.doSomething(<for View x>); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     }   

Le problème est que, il ne rien rendre, jusqu'à la fin de la boucle.

J'ai essayé de mettre la boucle dans un autre thread, mais son lancement exception:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Que puis-je faire pour ce problème? Je pensais générer un événement click sur vue (par code), pour voir ça peut aider ou non.

Quelle est votre solution? Merci

Répondre

4

dans votre Activity B, créez un Handler

Handler mHandler = new Handler();

Dans votre doSomething() à l'intérieur B votre mise à jour à l'aide ImageView mHandler.post(Runnable r). Le Runnable doit inclure du code pour mettre à jour l'interface utilisateur.

Le problème est probablement dû au fait que vous essayez de mettre à jour les composants B à l'aide du filetage A. Je suppose que vous pourriez aussi utiliser runOnUiThread(Runnable r).

Réponse originale avant la modification de la question.

dispatchKeyEvent(KeyEvent event) pour les clés

dispatchTouchEvent(MotionEvent) pour Touch

Se référer aux autres dispatchXXX fonctions. Google est ton ami. :)

Voici un résumé de dispatchKeyEvent des docs.

dispatchKeyEvent public boolean (événement KeyEvent)

Dispatch un événement clé pour la vue suivante sur le chemin de mise au point. Ce chemin s'étend du haut de l'arborescence jusqu'à la vue actuellement ciblée. Si cette vue est mise au point, elle sera envoyée à elle-même. Sinon, le prochain nœud sera envoyé sur le chemin de focus. Cette méthode déclenche également les écouteurs de clé.

+0

Ma question portait sur l'événement de construction et de tir, ne pas les manipuler. – mhshams

+0

@mohammad, de quoi parlez-vous? 'onKeyUp, onKeyDown' gère les messages,' dispatchKeyEvent' est utilisé pour déclencher un événement. Peut-être que vous devriez mieux parler de votre problème. – st0le

+0

@mohammad, 'View.performClick' peut simuler un clic. Si un clic est tout ce que vous cherchez. – st0le

0

Je ne sais pas ce que vous entendez par la construction et le feu d'un événement et sur quel contexte (par exemple à partir d'une vue, activité ou service) mais essayer.

Pour créer un événement clé, utilisez simplement les KeyEvent Contructors.

Pour MotionEvents vous pouvez utiliser la méthode obtain statique [ici] [1]

Si vous voulez les tirer d'utiliser les méthodes mentionnées précédemment sur l'activité cible (qui peut être extraient que le contexte (getContext()) si à l'intérieur d'une vue)

Espérons que cela aide, si ce n'est pas s'il vous plaît fournir avec plus de détails et/ou exemple de code.

[1]: http://developer.android.com/reference/android/view/MotionEvent.html#obtain(long, long, int, float, float, int)

2

Si vous parlez auditeurs, comme OnClickListener, alors oui: vous pouvez créer vos propres auditeurs et les déclencher.

Fondamentalement, vous commencez par définir une interface pour cet écouteur. Pour un DaterTimePicker (qui a un DaterPicker et TimerPicker) widget I une fois utilisé

public interface OnDateTimeSetListener { 
    public abstract void onDateTimeSet(DatePicker datePicker, TimePicker timePicker); 
} 

L'interface définit une méthode unique qui doit être mis en œuvre par vos auditeurs.

Ensuite, dans votre classe, vous faites quelque chose comme

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() est utilisé pour définir les auditeurs de en dehors de la classe (à savoir dans votre activité principale).

onDateTimeSet est utilisée en interne (donc déclarée privée) pour déclencher l'événement et de vérifier si onDateTimeSetListener a été défini ou bien nous obtiendrions un NullPointerException si elle n'a pas été définie. Si elle a été définie, appelez-la onDateTimeSet méthode.

Et dans votre principale Activity vous ajoutez simplement un auditeur et ajoutez le code dont vous avez besoin, comme:

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"); 
    } 
}); 

Ici vous configurez l'auditeur de la même façon que vous souhaitez mettre en place un OnClickListener.

Il s'agit d'un peu de code pour un événement simple, mais pour autant que je sache, c'est la bonne façon de l'implémenter.

Questions connexes