2012-02-09 21 views
6

Devo impedire che l'app esegua l'uscita se qualcuno preme il tasto Indietro su un dispositivo Android in modo da poter inviare una messagebox per chiedere se l'utente vuole uscire dall'app o no, ho scoperto che utilizzando:Come bloccare il tasto Indietro in Android quando si utilizza Qt

@Override 
void MainWindow::onBackPressed() 
{ 
    ... 
} 

ho potuto gestire questo caso, ho provato sul mio progetto necessitas e non ha funzionato. Può qtkeyevent gestirlo? o c'è un altro modo per farlo?

ho bloccare il prodotto utilizzando questo:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
    //moveTaskToBack(true); 
    return true; 
    } 
if (QtApplication.m_delegateObject != null && 
     QtApplication.onKeyDown != null) 
    return (Boolean) 
QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, keyCode, event); 
    else 
    return super.onKeyDown(keyCode, event); 
} 

ora ho bisogno di catturare l'evento su Qt così ho un mando un messaggio

risposta

4

Ecco come risolverlo:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     int newKeyCode = keyCode; 
     if ((keyCode == KeyEvent.KEYCODE_BACK)) 
     { 
      newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS; 
     } 
     if (QtApplication.m_delegateObject != null && 
QtApplication.onKeyDown != null) 
      return (Boolean) 
QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, newKeyCode, 
event); 
     else 
      return super.onKeyDown(newKeyCode, event); 
    } 
    public boolean super_onKeyDown(int keyCode, KeyEvent event) 
    { 
     return super.onKeyDown(keyCode, event); 
    } 

//--------------------------------------------------------------------------- 

    @Override 
    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent 
event) 
    { 
     int newKeyCode = keyCode; 
     if ((keyCode == KeyEvent.KEYCODE_BACK)) 
     { 
      newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS; 
     } 
     if (QtApplication.m_delegateObject != null && 
QtApplication.onKeyMultiple != null) 
      return (Boolean) 
QtApplication.invokeDelegateMethod(QtApplication.onKeyMultiple ,newKeyCode, 
repeatCount, event); 
     else 
      return super.onKeyMultiple(newKeyCode, repeatCount, event); 
    } 
    public boolean super_onKeyMultiple(int keyCode, int repeatCount, 
KeyEvent event) 
    { 
     return super.onKeyMultiple(keyCode, repeatCount, event); 
    } 

//--------------------------------------------------------------------------- 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) 
    { 
     int newKeyCode = keyCode; 
     if ((keyCode == KeyEvent.KEYCODE_BACK)) 
     { 
      newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS; 
     } 
     if (QtApplication.m_delegateObject != null && 
QtApplication.onKeyDown != null) 
      return (Boolean) 
QtApplication.invokeDelegateMethod(QtApplication.onKeyUp, newKeyCode, 
event); 
     else 
      return super.onKeyUp(newKeyCode, event); 
    } 
    public boolean super_onKeyUp(int keyCode, KeyEvent event) 
    { 
     return super.onKeyUp(keyCode, event); 
    } 

e poi in Qt:

void MainWindow::keyPressEvent(QKeyEvent *k) 
{ 
    if(k->key() == Qt::Key_MediaPrevious) 
    { 
     int ret = messageBox(QMessageBox::Yes | QMessageBox::No, "¿Desea salir de la aplicación?", QMessageBox::Question); 

     switch(ret) 
     { 
     case QMessageBox::Yes: 
      this->close(); 
      break; 

     case QMessageBox::No: 
      break; 
     } 
    } 
} 

Grazie a Koying che pubblica qui questa soluzione http://groups.google.com/group/android-qt/browse_thread/thread/676c24e94bb9a200?pli=1

0

È possibile scrivere onKeyListener per l'attività, verificare la presenza di keycodes e se sono quello che vuoi, consumare loro. Almeno, in Java. Sicuramente, il C++ non ha meno possibilità.

0

Non sono sicuro se questo vale per la vostra situazione, ma in Android in generale, in ogni Activity di interesse che avrebbe usato il seguente per ignorare il pulsante indietro stampa:

@Override 
public void onBackPressed() 
{ 
    // Make sure to NOT call super! 
    ... 
} 
Problemi correlati