2017-07-24 1 views
0

J'ai une vue avec le bouton, En cliquant sur le bouton j'ouvre un dialogue d'alerte. Que je crée en utilisant le code ci-dessousRenvoyer un AlertDialog donne un avertissement Tentative de terminer un événement d'entrée mais le destinataire de l'événement d'entrée a déjà été éliminé

List<String> data = new List<string> { "Hello1", "Hello2", "Hello3", "Hello4" }; 

    void ChangeTubeButton_Click(object sender, EventArgs e) 
    { 
     AlertDialog.Builder builder; 
     builder = new AlertDialog.Builder(Context); 
     builder.SetTitle("Select Tube").SetItems(data.ToArray(), RowSelected); 
     AlertDialog alert = builder.Create(); 
     alert.Show(); 
    } 

    void RowSelected(object senderObject, DialogClickEventArgs eventArgs) 
    { 
     if (eventArgs.Which >= 0 && eventArgs.Which < data.Count) 
     { 
      String selectedHello = data.ElementAt(eventArgs.Which); 
     } 
    } 

L'alerte apparaît correctement sur l'interface utilisateur et je peux sélectionner la ligne correctement. C'est juste quand je tape dehors sur l'écran. Alert rejette mais alse donne un avertissement dans Logcat.

[InputEventReceiver] Attempted to finish an input event but the input event receiver has already been disposed. 
[ViewRootImpl[NavigationView]] Dropping event due to root view being removed: MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=133.8952, y[0]=-190.78308, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=88925144, downTime=88925129, deviceId=1, source=0x1002 } 
[InputEventReceiver] Attempted to finish an input event but the input event receiver has already been disposed. 

Devrais-je m'inquiéter de cet avertissement? Et je veux garder ma fenêtre de journaux propre. Si quelqu'un peut vous aider concernant l'avertissement.

Répondre

2

Ceci n'est pas associé à votre code.

Lorsque vous appuyez sur à l'extérieur de l'écran, cet événement ACTION_DOWN est mis en file d'attente dans la file d'attente des messages de l'application. Ensuite, il est remis à votre classe AlerDialog via la classe ViewPostImeInputStage et enfin ViewPostImeInputStage envoyer cet événement d'entrée à l'écouteur onTouchEvent de AlerDialog.

Depuis cela n'a pas eu lieu à l'intérieur de votre AlertDialog, votre AlerDialog appellera dismiss() méthode:

public boolean onTouchEvent(MotionEvent event) 
{ 
    if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) 
    { 
     cancel();//This will call dismiss() method. 
     return true; 
    } 
    return false; 
} 

Dissmiss() essayer de fermer AlertDialog et AlertDialog::onDetachedWindow appel WindowInputEventReceiver::dispose() premier.

Et puis ViewPostImeInputStage appelez WindowInputEventReceiver::finishInputEvent pour terminer cet événement ACTION_DOWN. Cependant WindowInputEventReceive r instance est déjà disposé afin qu'il jette des messages d'avertissement.

Lorsque vous créez un AlertDialog, il sera associé à un WindowManager, ViewRootImpl est pont entre WindowManager et un DecorView (sa relation avec votre AlertDialog comme ceci: DecorView -> Activité -> votre AlertDialog). Vous pouvez en ce AlerDialog code source:

public AlertDialog create() { 
     final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false); 
     P.apply(dialog.mAlert); 
     dialog.setCancelable(P.mCancelable); 
     if (P.mCancelable) { 
      dialog.setCanceledOnTouchOutside(true); 
     } 
     dialog.setOnCancelListener(P.mOnCancelListener); 
     if (P.mOnKeyListener != null) { 
      dialog.setOnKeyListener(P.mOnKeyListener); 
     } 
     return dialog; 
    }  

Dialog(Context context, int theme, boolean createContextWrapper) { 
    mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context; 

    mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 

    Window w = PolicyManager.makeNewWindow(mContext); 
    mWindow = w; 
    w.setCallback(this); 
    w.setWindowManager(mWindowManager, null, null); 
    w.setGravity(Gravity.CENTER); 
    mUiThread = Thread.currentThread(); 
    mListenersHandler = new ListenersHandler(this); 
} 

Le ne peut pas être delievered à AlertDialog événement motion suivante « ACTION_MOVE », car il a été disposé, de sorte que le ViewRootImpl se Dropping ACTION_MOVE event et lancer des messages d'avertissement.

+0

@soan saini, y a-t-il encore une confusion à propos de cette question? –

+0

Désolé n'a pas pu répondre plus tôt. Je suis un nouveau développeur Android. Donc je m'attendais à ce que cela soit géré par une plate-forme sortie de la boîte. Comme je ne fais rien, ce qui est très personnalisé. Je suis juste en train d'essayer d'afficher une alerte avec la zone de liste sur l'interface utilisateur pour la sélection, en utilisant les contrôles de la plate-forme. Donc, je ne sais pas si l'implémentation de beaucoup de code supplémentaire, que j'essaie toujours de comprendre. Cela vaut trois lignes dans Logcat. Puis-je faire face à n'importe quel problème si je laisse ces journaux comme il est dans l'application? –

+1

@soan saini, le code ci-dessus que j'ai post est le code source dans Android, juste vous aider à comprendre le flux de travail de 'AlertDialog', laissez ces journaux seront OK, si vous avez encore des problèmes, n'hésitez pas à me contacter. –