Autore Topic: setOnKeyListener non funziona correttamente  (Letto 446 volte)

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
setOnKeyListener non funziona correttamente
« il: 02 Febbraio 2014, 18:34:40 CET »
0
Ciao a tutti!
Nella mia applicazione c'è un'activity nella quale, tramite l'utilizzo dei fragment, faccio partire un loop di Runnable.
In questa activity c'è un EditText nel quale, dopo aver inserito un numero compreso da 1 a 9 e quando e premuto il tasto Enter della tastiera, fa partire il successivo thread. Ecco il codice:
Codice (Java): [Seleziona]
public class Step1Training extends Activity {
       
        ImageFragment myImageFragment;
        InputFragment myInputFragment;
        Drawable cross;
        ImageView myImageView;
        EditText myEditText;
        Button continueButton;
        int length;
        String rating;
        Handler handler;
        boolean continueTask;
        int[] screenshots = {
                   R.drawable.googleplaybooks2,
                   R.drawable.aldiko1,
                   R.drawable.chaton2,
                   R.drawable.cinetrailer1,
                   R.drawable.fanpage1
        };
        String filePATH;
        Intent intent;
        File root;
        boolean fileDeleted, start_Thread;
        TextHandler textHandler;
        int participantID;
               
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.step1_training);
               
                // i = 0;
                fileDeleted = false;
                root = Environment.getExternalStorageDirectory();
                textHandler = new TextHandler();
                intent = getIntent();
                filePATH = intent.getStringExtra("file_path");
                participantID = intent.getIntExtra("participant_ID", participantID);
                System.out.println(filePATH);
                System.out.println(participantID);
               
                handler = new Handler();
                length = screenshots.length;
                start_Thread = false;
               
                initUI();
               
                startThread();
               
                addListenerOnContinueButton();
        }
       
        private void initUI(){
                myImageFragment = (ImageFragment)getFragmentManager().findFragmentById(R.id.imageFragment);
                myInputFragment = (InputFragment)getFragmentManager().findFragmentById(R.id.inputFragment);
               
                myImageView = (ImageView)myImageFragment.getView().findViewById(R.id.screenshotImageView);
                myImageView.setImageResource(R.drawable.cross300x300);
               
                continueButton = (Button) myInputFragment.getView().findViewById(R.id.continueButton);
                continueButton.setVisibility(View.GONE);
               
                myEditText = (EditText) myInputFragment.getView().findViewById(R.id.ratingEditText);
                myEditText.setText("");
               
                myEditText.setOnKeyListener(new View.OnKeyListener(){
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                        System.out.println("ON KEY ENTER DOWN!!!!!");
                if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                    if(myEditText.getText().toString().equals("")){
                        Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                        // start_Thread = false;
                        return false;
                    } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                                Integer.parseInt(myEditText.getText().toString()) <= 9){
                        start_Thread = true;
                        return true;
                    }
                }
                return false;
            }
        });
               
                myEditText.setOnKeyListener(new OnKeyListener(){
                public boolean onKey(View arg0, int arg1, KeyEvent event) {
                        System.out.println("HIDE KEYBOARD!!!!!");
                // If the event is a key-down event on the "enter" button
                if ( (event.getAction() == KeyEvent.ACTION_DOWN  ) &&
                     (arg1 == KeyEvent.KEYCODE_ENTER)){              
                                InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);  
                        return true;
                }
                return false;
             }
        });
               
                myEditText.setVisibility(View.GONE);
        }
       
        private void startThread(){
                handler.postDelayed(new TaskScreenshot(0), 1000);
        handler.postDelayed(new TaskNoise(), 1050);
        handler.postDelayed(new TaskEditText(), 1550);
       
        if(start_Thread == true){
                startThread2(1);
        }
        }
       
        private void startThread2(final int i){
                System.out.println(i);
               
                if(i < length){
                        handler.postDelayed(new TaskCross(), 1000);
                        handler.postDelayed(new TaskScreenshot(i), 2000);
                handler.postDelayed(new TaskNoise(), 2100);
                handler.postDelayed(new TaskEditText(), 3000);
               
                if(start_Thread == true){
                        startThread2(i+1);
                }
               
                if(i == length-1 && myEditText.getVisibility() == View.VISIBLE){
                                continueButton.setVisibility(View.VISIBLE);
                        }
                }
        }
       
        private void addListenerOnContinueButton() {
                         
                continueButton.setOnClickListener(new OnClickListener() {
 
                        @Override
                        public void onClick(View arg0) {
                                Intent intent = new Intent(Step1Training.this, MainSession1.class);
                                intent.putExtra("file_path", filePATH);
                                intent.putExtra("participand_ID", participantID);
                                startActivity(intent);
                        }
                });
        }
       
        @Override
        public void onBackPressed() {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Attenzione")
        .setMessage("Sei sicuro/a di voler uscire dall'applicazione?\n" +
                        "Confermando uscirai dall'applicazione e perderai \n" +
                        "tutti i dati raccolti finora.")
        .setCancelable(false)
        .setNegativeButton("No",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        })
        .setPositiveButton("Si", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int whichButton)
            {
                fileDeleted = textHandler.deleteFile(filePATH);
                if(fileDeleted){
                        System.out.println("CANCELLATO!!");
                } else {
                        System.out.println("NON CANCELLATO!!");
                }
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
        }
       
        class TaskScreenshot implements Runnable{

                int j;
               
                public TaskScreenshot(int _i){
                        this.j = _i;
                }
               
                @Override
                public void run() {
                        System.out.println("Screenshot");
                        myEditText.setText("");
                        myEditText.setVisibility(View.GONE);
                        myImageFragment.getView().setVisibility(View.VISIBLE);
                myImageView.setImageResource(screenshots[j]);
                        myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                        myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }
        }
       
        class TaskNoise implements Runnable{
               
                @Override
                public void run() {
                        System.out.println("Noise");
                myImageView.setImageResource(R.drawable.noise);
                myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                        myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }
        }
       
        class TaskEditText implements Runnable{

                @Override
                public void run() {
                        System.out.println("EditText");
                        myEditText.setVisibility(View.VISIBLE);
                myImageFragment.getView().setVisibility(View.GONE);
                }
        }
       
        class TaskCross implements Runnable{

                @Override
                public void run() {
                        System.out.println("Cross");
                        myEditText.setVisibility(View.GONE);
                        myImageFragment.getView().setVisibility(View.VISIBLE);
                        myImageView.getLayoutParams().width = 100;
                        myImageView.getLayoutParams().height = 100;
                        myImageView.setImageResource(R.drawable.cross300x300);
                }
        }
}

Quindi, dopo aver premuto il tasto Enter, sparisce la tastiera (come scritto nel codice), ma non fa partire il successivo thread. Perchè? Sbaglio impostare i listener?

Post unito: [time]03 Febbraio 2014, 16:23:07 CET[/time]
Ho aggiornato il codice:
Codice (Java): [Seleziona]
private boolean addListenerOnEditText(){
                myEditText.setOnKeyListener(new View.OnKeyListener(){
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                        System.out.println("KEY ENTER!!!!!");
                if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                    if(myEditText.getText().toString().equals("")){
                        Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                        start_Thread = false;
                        return false;
                    } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                                Integer.parseInt(myEditText.getText().toString()) <= 9){
                        start_Thread = true;                           
                        return true;
                    }
                }
                return false;
            }
       
        });
                return start_Thread;
        }
       
        private void startThread(){
                handler.postDelayed(new TaskScreenshot(0), 1000);
        handler.postDelayed(new TaskNoise(), 1050);
        handler.postDelayed(new TaskEditText(), 1550);
       
        if(addListenerOnEditText()){
                startThread2(1);
        }
       
        }
       
        private void startThread2(final int i){
                System.out.println(i);
               
                if(i < length){
                        handler.postDelayed(new TaskCross(), 1000);
                        handler.postDelayed(new TaskScreenshot(i), 2000);
                handler.postDelayed(new TaskNoise(), 2100);
                handler.postDelayed(new TaskEditText(), 3000);
               
                if(addListenerOnEditText()){
                        startThread2(i+1);
                }
               
                if(i == length-1 && myEditText.getVisibility() == View.VISIBLE){
                                continueButton.setVisibility(View.VISIBLE);
                        }
                }
        }

Ma il risultato è lo stesso.
Comunque il listener sembra funzionare perchè, mettendo il System.out.println dentro il metodo, stampa a console la stringa. Non riesco a capire allora dove sia il problema.

Qualcuno può aiutarmi? E' da giorni che ci sbatto la testa.
Grazie!
« Ultima modifica: 03 Febbraio 2014, 16:23:34 CET da DamianFox »