Autore Topic: AlertDialog non bloccante  (Letto 1195 volte)

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
AlertDialog non bloccante
« il: 08 Luglio 2011, 15:18:06 CEST »
0
Salve, ho un codice così strutturato:
Codice (Java): [Seleziona]
public class main_Activity extends Activity{
       
        static final int DIALOG_ERRORE = 0;
        static final int DIALOG_SI_NO = 1;
       
        @Override
        public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       

        Button binvio = (Button) findViewById(R.id.binvio);
                binvio.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                //...
                                try{
                                        //...
                                }catch(Exception e){
                                        showDialog(DIALOG_ERRORE);
                                        finish();
                                }
                                       
                                Intent intent = new Intent(main_Activity.this, Index.class);
                                String pkg = getPackageName();
                                intent.putExtra(pkg + ".usrname", usrname);
                                startActivity(intent);
                                finish();
                        }
                });
               
        }
       
        @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog;
        AlertDialog.Builder builder = new AlertDialog.Builder(main_Activity.this);
        builder.setMessage("Errore durante la procedura di login.")
               .setCancelable(false)
               .setPositiveButton("Chiudi", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        dismissDialog(id);
                   }
               });
        dialog = builder.create();     
   
        return dialog;
    }
}

quando mi si apre la alert questa mi si richiude da sè, senza darmi modo di chiuderla premendo il pulsante. Poi mi lancia anche la nuova attività. Sapete dirmi come mai non è bloccante? e come fare per renderla tale?

Grazie!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #1 il: 08 Luglio 2011, 15:28:19 CEST »
0
Se vuoi che l'activity venga aperta quando viene premuto il tasto "Chiudi" perchè non hai messo il codice che l'avvia nel relativo onClickListener?

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #2 il: 08 Luglio 2011, 15:32:52 CEST »
0
Evidentemente mi sono spiegata male: lo showDialog() è all'interno della clausola catch e mi fa apparire una dialog che in pratica mi dice che si è verificato un errore e l'applicazione verrà chiusa appena premo "chiudi" (pulsante appartenente alla dialog). Però la dialog si chiude da sè, senza lasciare il tempo di premere il pulsante e l'activity va avanti ignorando anche il finish() che c'è dopo lo showdialog ed esegue il codice che fa partire la nuova attività.
Spero di essere stata più chiara adesso...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #3 il: 08 Luglio 2011, 15:38:17 CEST »
0
Il finish mica interrompe il metodo in esecuzione!
Metti lo startactivity ecc ecc nel try e sposta il finish che hai nel catch all'interno dell'onClickListener del Dialog.

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #4 il: 08 Luglio 2011, 15:42:55 CEST »
0
Il finish() non dovrebbe terminare l'attività? comunque quello che non capisco è come mai la dialog non sia bloccante, ovvero perchè si autochiuda senza aspettare che l'utente prema il pulsante. Questo è il problema. Poi che questo codice abbia poco senso e possa essere fatto in altro modo ti dò pienamente ragione, ma era solo un esempio per spiegare il mio problema..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #5 il: 08 Luglio 2011, 15:46:12 CEST »
0
Il finish() non dovrebbe terminare l'attività? comunque quello che non capisco è come mai la dialog non sia bloccante, ovvero perchè si autochiuda senza aspettare che l'utente prema il pulsante. Questo è il problema. Poi che questo codice abbia poco senso e possa essere fatto in altro modo ti dò pienamente ragione, ma era solo un esempio per spiegare il mio problema..

Non vedo dove stia il problema. Devi solo adeguare il tuo codice (banalmente come ti ho suggerito sopra) sapendo che i Dialog non sono bloccanti.

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #6 il: 08 Luglio 2011, 15:50:16 CEST »
0
Non credevo che le Dialog non fossero bloccanti. Il problema sta nel fatto che nella mia applicazione uso la dialog per far fare una scelta all'utente; ci sono 2 pulsanti:
con uno torna semplicemente alla attività precedente.
con l'altro apre la nuova attività.

E' praticamente una finestra di "conferma"..

Non esiste un modo per far apparire una finestra di questo tipo?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #7 il: 08 Luglio 2011, 15:54:22 CEST »
0
Non esiste un modo per far apparire una finestra di questo tipo?

Una roba del genere...

Codice (Java): [Seleziona]
    @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog;
        AlertDialog.Builder builder = new AlertDialog.Builder(main_Activity.this);
        builder.setMessage("Errore durante la procedura di login.")
               .setCancelable(false)
               .setPositiveButton("Chiudi", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        dismissDialog(id);
                   }
               });
               .setNegativeButton("Vai", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        startActivity(...);
                        finish();
                   }
               });
        dialog = builder.create();      
   
        return dialog;
    }

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #8 il: 08 Luglio 2011, 15:56:47 CEST »
0
Si. Questo l'ho fatto. Ma non mi va! Nel senso che mi appare la finestra con i pulsanti per 1 secondo e poi si chiude da sè, senza che l'utente prema niente..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #9 il: 08 Luglio 2011, 15:58:03 CEST »
0
Si. Questo l'ho fatto. Ma non mi va! Nel senso che mi appare la finestra con i pulsanti per 1 secondo e poi si chiude da sè, senza che l'utente prema niente..

Allora sbagli da qualche altra parte...  sicuramente fai un finish dopo aver chiamato showDialog. Tiralo via e vedrai che si sistema.

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #10 il: 08 Luglio 2011, 16:04:54 CEST »
0
ho guardato, ma niente. La finestra di dialog si chiude da sola e l'attività [che ha chiamato la showdialog] va avanti come se niente fosse..
Se vuoi provo a postarti l'intero codice...io è da stamani che lo guardo ma non capisco dov'è l'errore...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #11 il: 08 Luglio 2011, 16:16:20 CEST »
0
ho guardato, ma niente. La finestra di dialog si chiude da sola e l'attività [che ha chiamato la showdialog] va avanti come se niente fosse..
Se vuoi provo a postarti l'intero codice...io è da stamani che lo guardo ma non capisco dov'è l'errore...

Ma non è il codice che hai postato sopra?  ???

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #12 il: 08 Luglio 2011, 16:21:18 CEST »
0
si, ma quella era la versione "a grande linee"...magari mi è sfuggito qualcosa di essenziale...!

Codice (Java): [Seleziona]
package progetto.android;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class main_Activity extends Activity{
       
        static final int DIALOG_ERRORE = 0;
       
        @Override
        public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        //pulsante invio - gestione con classi interne anonime
        Button binvio = (Button) findViewById(R.id.binvio);
                binvio.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                EditText username_text = (EditText) findViewById(R.id.username);
                                String usrname = username_text.getText().toString();
                                EditText psw_text = (EditText) findViewById(R.id.psw);
                                String psw = psw_text.getText().toString();
                               
                                //faccio una query al DB per vedere se l'utente si può identificare
                                String result = "";
                                InputStream is = null;
                                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                                nameValuePairs.add(new BasicNameValuePair("usrname", usrname));
                                nameValuePairs.add(new BasicNameValuePair("psw", psw));
                               
                                //POST
                                try{
                                        HttpClient httpclient = new DefaultHttpClient();
                                        HttpPost httppost = new HttpPost("http://192.168.56.1/log.php");
                                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                                        HttpResponse response = httpclient.execute(httppost);
                                        HttpEntity entity = response.getEntity();
                                        is = entity.getContent();
                                }catch(Exception e){
                                        showDialog(DIALOG_ERRORE);
                                }
                                //conversione della risposta in una stringa
                                try{
                                        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                                        StringBuilder sb = new StringBuilder();
                                        String line = null;
                                        while((line = reader.readLine()) != null){
                                                sb.append(line + "\n");
                                        }
                                        is.close();
                                       
                                        result = sb.toString();
                                }catch(Exception e){
                                        //Toast.makeText(main_Activity.this, "Eccezione conversione.", Toast.LENGTH_SHORT).show();
                                        showDialog(DIALOG_ERRORE);
                                }
                               
                                //parse Json data
                                try{
                                        JSONArray jarray = new JSONArray(result);
                                        JSONObject json_obj = jarray.getJSONObject(0);
                                        String un = json_obj.getString("usrname");
                                        Toast.makeText(main_Activity.this, "Utente " + un + " loggato.", Toast.LENGTH_SHORT).show();
                                       
                                }catch(Exception e){
                                        //Toast.makeText(main_Activity.this, "eccezione parse\n", Toast.LENGTH_SHORT).show();
                                        showDialog(DIALOG_ERRORE);
                                }
                               
                                Toast.makeText(main_Activity.this, "intent.", Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(main_Activity.this, Index.class);
                                String pkg = getPackageName();
                                intent.putExtra(pkg + ".usrname", usrname);
                                startActivity(intent);
                                finish();
                        }
                });
               
                //Pulsante esci
            Button besci = (Button) findViewById(R.id.besci);
                besci.setOnClickListener(new OnClickListener() {
       
                        @Override
                        public void onClick(View v) {
                                finish();
                        }
                });
        }
       
        @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog;
        AlertDialog.Builder builder = new AlertDialog.Builder(main_Activity.this);
        builder.setMessage("Errore durante la procedura di login.")
               .setCancelable(false)
               .setPositiveButton("Chiudi", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        dismissDialog(id);
                   }
               });
        dialog = builder.create();     
   
        return dialog;
    }
}

Fai conto che il mio progetto è fatto da più attività e nelle attività successive devo fare uso della dialog con due pulsanti :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #13 il: 08 Luglio 2011, 16:23:20 CEST »
0
Aggiungi un semplice return sotto a showDialog(DIALOG_ERRORE); ;)

Offline cha

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:AlertDialog non bloccante
« Risposta #14 il: 08 Luglio 2011, 16:27:31 CEST »
0
per un return ho buttato via 6 ore di lavoro  :'( :'( :'( :'( :'(

grazie mille! :-) :-)