Autore Topic: [risolto]blocco tasto back  (Letto 3596 volte)

marco1991

  • Visitatore
[risolto]blocco tasto back
« il: 05 Luglio 2012, 19:56:54 CEST »
0
salve ragazzi,
mi sono iscrtitto da poco ma vi seguo da molto :)

basandomi sul libro '' beginner android games'' ho sviluppato il gioco snake usando il framework proposto dal libro...
in pratica cè solo una Activity e quindi se premo il tasto back indipendentemente dal ''luogo'' in cui mi trovo, il programma esce.
questo è molto fastidioso anche perchè le frecce per muovere il verme sono in basso, quindi vicino al tato back..

ho gia cercato thread simili su questo forum e ne ho travi alcuni. in tutti viene proposto

Codice: [Seleziona]
@Override
           public boolean onKeyDown(int keyCode, KeyEvent loadhome) {
              if ((keyCode == KeyEvent.KEYCODE_BACK)) {
                 
                   return false;
               }
               return super.onKeyDown(keyCode, loadhome);
           }

però questo non funziona. a dire il vero non ho nemmeno la funzione onKeyDown.. il framework mi propone nella classe game un istanza della classe Input che ha la funzione getKeyEvents()...questa funzione mi restituisce un ArrayList di tutti gli eventy keyEvent.. in pratica quando devo verificare se un determinato tasto è stato premuto devo ciclare all'iterno dell'array..

idem per il touchEvent
ed esempio per vedere se ho cliccato sullo schermo devo fare:

List<TouchEvent> Tevents = game.gettouchEvents();
for( int i=0; i<Tevent.size(); i++ ){
 TouchEvent event = Tevents.get(i);
 if ( event.type == TouchEvents.TOUCH_DOWN ) {
    //fai qualcosa
 }
}

(sono andato un pò a memoria ma è circa così)..

avete idee? :(

grazie mille!
« Ultima modifica: 16 Luglio 2012, 23:44:22 CEST da marco1991 »

Offline sirtraco

  • Utente junior
  • **
  • Post: 92
  • Respect: 0
    • Mostra profilo
Re:blocco tasto back
« Risposta #1 il: 11 Luglio 2012, 08:46:52 CEST »
0
per disattivare il tasto indietro io ho inserito questo metodo:
Codice (Java): [Seleziona]
public void onBackPressed() {
                return;
                }
prova e fammi sapere se funziona  ;-)

marco1991

  • Visitatore
Re:blocco tasto back
« Risposta #2 il: 11 Luglio 2012, 11:16:09 CEST »
0
grazie per l'intervento!

la mia funzione è questa:

Codice: [Seleziona]
private void updateRunning(List<TouchEvent> touchEvents, List<Input.KeyEvent> keyEvents, float deltaTime) {
                if( Settings.soundEnabled && !Assets.soundTrack.isPlaying()) {
                        Assets.soundTrack.play();
                }
               
                int len = touchEvents.size();
               
                for( int i=0; i<keyEvents.size(); i++ ) {
                        Input.KeyEvent tmp = keyEvents.get(i);
                        if( tmp.keyCode == KeyEvent.KEYCODE_BACK ) {
                               
                           // [color=red]qui ci entra quando clicco il back, però se ci metto solamente ''return'' o ''continue'' o ''break'' esce comunque [/color]
                        }
                }
               
                for(int i=0; i<len; i++) {
                        TouchEvent event = touchEvents.get(i);
                        if(event.type == TouchEvent.TOUCH_UP) {
                                if( event.x < 64 && event.y < 64 ) {
                                        if( Settings.soundEnabled ) {
                                                Assets.click.play(1);
                                        }
                                        state = GameState.Paused;
                                        return;
                                }
                        }
                        if( event.type == TouchEvent.TOUCH_DOWN) {
                                if( event.x <= 160 && event.y > 64) {
                                        world.snake.turnLeft();
                                }
                                if( event.x > 160 && event.y > 64) {
                                        world.snake.turnRight();
                                }
                        }
                }

Offline nadirangel

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    appsnadir
  • Sistema operativo:
    Windows xp
Re:blocco tasto back
« Risposta #3 il: 14 Luglio 2012, 13:08:33 CEST »
0
per disattivare il tasto indietro io ho inserito questo metodo:
Codice (Java): [Seleziona]
public void onBackPressed() {
                return;
                }
prova e fammi sapere se funziona  ;-)

Giusto! Ovviamente mettendo l'override prima ;)

marco1991

  • Visitatore
Re:blocco tasto back
« Risposta #4 il: 14 Luglio 2012, 14:03:31 CEST »
0
Giusto! Ovviamente mettendo l'override prima ;)

però purtroppo non funziona nel mio caso come ho specificato nel precedente post

Offline nadirangel

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    appsnadir
  • Sistema operativo:
    Windows xp
Re:blocco tasto back
« Risposta #5 il: 14 Luglio 2012, 15:54:58 CEST »
0
io in una mia applicazione l'ho disabilitato cosi e funziona. Fammi sapere

        @Override
        public void onBackPressed(){
                 return;
                 };
       
       
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                // Take care of calling this method on earlier versions of
                // the platform where it doesn't exist.
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

marco1991

  • Visitatore
Re:blocco tasto back
« Risposta #6 il: 14 Luglio 2012, 17:48:28 CEST »
0
mmm..
gia l'verride sulla prima funzione mi da errore...

non ci sto più capendo nulla xD

Offline nadirangel

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    appsnadir
  • Sistema operativo:
    Windows xp
Re:blocco tasto back
« Risposta #7 il: 14 Luglio 2012, 17:50:52 CEST »
0
ti da errore cosa? logcat? oppure l'sdk? xke credo che il codice che ti ho scritto vuole un minisdkversion = 5 se nn ricordo male ovvero sulla 1.5 nn va. se è un errore di logcat postalo

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:blocco tasto back
« Risposta #8 il: 14 Luglio 2012, 17:58:22 CEST »
0
Il metodo "onBackPressed" esiste dal API 5, se usi un API inferiore è ovvio che "@Override" segnali errore, non esiste nessun metodo in nessuna super classe. L'unica soluzione è usate un API dalla 5 in su'.
adb logcat | tee /tmp/logcat | grep TAG

marco1991

  • Visitatore
Re:blocco tasto back
« Risposta #9 il: 14 Luglio 2012, 18:37:06 CEST »
0
però io uso l'sdk 7

 <uses-sdk android:minSdkVersion="7" />

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:blocco tasto back
« Risposta #10 il: 15 Luglio 2012, 09:51:09 CEST »
0
No, quella riga dichiara semplicemente che applicativo vuole come minimo API 7 per essere eseguito, ma non imposta l'uso della API 7 per la compilazione. Devi impostarla in Project -> Properties -> Android -> Project Build Target un API >= 5 compatibile con il tuo device, se ti manca la devi scaricare dal SDK Manager.
adb logcat | tee /tmp/logcat | grep TAG

marco1991

  • Visitatore
Re:blocco tasto back
« Risposta #11 il: 15 Luglio 2012, 17:04:09 CEST »
0
No, quella riga dichiara semplicemente che applicativo vuole come minimo API 7 per essere eseguito, ma non imposta l'uso della API 7 per la compilazione. Devi impostarla in Project -> Properties -> Android -> Project Build Target un API >= 5 compatibile con il tuo device, se ti manca la devi scaricare dal SDK Manager.
la spunta è su andorid 2.1 con api 7  :-(

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:blocco tasto back
« Risposta #12 il: 16 Luglio 2012, 01:53:58 CEST »
0
Allora comunica esattamente l'errore.
adb logcat | tee /tmp/logcat | grep TAG

marco1991

  • Visitatore
Re:blocco tasto back
« Risposta #13 il: 16 Luglio 2012, 15:56:53 CEST »
0
ragazzi vi ringrazio ancora per l'aiuto! spero davvero di risolvere sta robetta che sebra facile ma mi fa sta facendo impazzire..

Codice (Java): [Seleziona]
private void updateRunning(List<TouchEvent> touchEvents, List<Input.KeyEvent> keyEvents, float deltaTime) {
                if( Settings.soundEnabled && !Assets.soundTrack.isPlaying()) {
                        Assets.soundTrack.play();
                }
               
                for( int i=0; i<keyEvents.size(); i++ ) {
                        Input.KeyEvent tmp = keyEvents.get(i);
                        if( tmp.keyCode == KeyEvent.KEYCODE_BACK ) {
                                Log.d("---------------------", "sono entratoooooooo");
                        }
                }
               
                int len = touchEvents.size();
                for(int i=0; i<len; i++) {
                        TouchEvent event = touchEvents.get(i);
                        if(event.type == TouchEvent.TOUCH_UP) {
                                if( event.x < 64 && event.y < 64 ) {
                                        if( Settings.soundEnabled ) {
                                                Assets.click.play(1);
                                        }
                                        state = GameState.Paused;
                                        return;
                                }
                        } ect etc....


alla rga nove ho messo un Log per vedere se entrava in quella funzione premendo il tasto back. il risultato è che ci entra. quindi premendo il back il codice li dentro viene eseguito
come potete vedere alla funzione updateRunning (che viene invocata da una classse Runnable) viene passata una collection di keyevents, questa collection viene fatta da questa classe:

Codice (Java): [Seleziona]
public class KeyboardHandler implements OnKeyListener {

        boolean[] pressedKeys = new boolean[128];
        Pool<KeyEvent> keyEventPool;
        List<KeyEvent> keyEventsBuffer = new ArrayList<KeyEvent>();
        List<KeyEvent> keyEvents = new ArrayList<KeyEvent>();
       
        public KeyboardHandler(View view){
                PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() {
                        public KeyEvent createObject() {
                                return new KeyEvent();
                        }
                };
                keyEventPool = new Pool<KeyEvent>(factory, 100);
                view.setOnKeyListener(this);
                view.setFocusableInTouchMode(true);
                view.requestFocus();
        }

       
        public boolean onKey(View v, int keyCode, android.view.KeyEvent event) {
                if(event.getAction() == android.view.KeyEvent.ACTION_MULTIPLE)
                        return false;
               
                synchronized(this){
                        KeyEvent keyEvent = keyEventPool.newObject();
                        keyEvent.keyCode = keyCode;
                        keyEvent.keyChar = (char) event.getUnicodeChar();
                       
                        if(event.getAction() == android.view.KeyEvent.ACTION_DOWN){
                                keyEvent.type = KeyEvent.KEY_DOWN;
                               
                                if(keyCode > 0 && keyCode < 127)
                                        pressedKeys[keyCode] = true;  
                        }
                        if(event.getAction() == android.view.KeyEvent.ACTION_UP){
                                keyEvent.type = KeyEvent.KEY_UP;
                                if(keyCode > 0 && keyCode < 127)
                                        pressedKeys[keyCode] = false;
                        }
                        keyEventsBuffer.add(keyEvent);
                }
                return false;
        }
       

        public boolean isKeyPressed(int keyCode){
                if(keyCode < 0 || keyCode > 127)
                        return false;
               
                return pressedKeys[keyCode];
        }
       
       
        public List<KeyEvent> getKeyEvents(){
                synchronized (this) {
                        int len = keyEvents.size();
                        for(int i=0; i<len; i++){
                                keyEventPool.free(keyEvents.get(i));
                        }
                        keyEvents.clear();
                        keyEvents.addAll(keyEventsBuffer);
                        keyEventsBuffer.clear();
                        return keyEvents;
                }
        }

}

se qui dentro provo a overraidare un metodo onBackPressed mi da errore consigliandomi di togliere l'@Override
usando un OnKeyListener poi non ho il metodo onKeyDown ma solo onKey
« Ultima modifica: 16 Luglio 2012, 16:15:01 CEST da marco1991 »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:blocco tasto back
« Risposta #14 il: 16 Luglio 2012, 16:38:36 CEST »
0
Non ho capito cosa cosa non funziona e trovo il codice troppo complesso per una semplice lettura del tasto back.

Rispondo solo ai tuoi dubbi.

I metodi "onBackPressed" e "onKeyDown" si trovano nella classe "Activity", nella classe che hai riportato tu non erediti da "Activity" quindi non hai un "@Override" dei metodi e se lo metti ti segnala errore. Se implementi l'interfaccia "OnKeyListener" devi per forza implementare il solo metodo "OnKey" e non "onKeyDown".

adb logcat | tee /tmp/logcat | grep TAG