Autore Topic: Aiuto con AlertDialog  (Letto 1267 volte)

Offline Alessio_roma™

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
    • www.blogarm.tk
  • Dispositivo Android:
    LG Nexus 4
  • Sistema operativo:
    Windows 7 ultimate x64, Ubuntu 14.04
Aiuto con AlertDialog
« il: 26 Febbraio 2013, 21:57:24 CET »
0
Ho iniziato da poco a programmare su Android,anzi diciamo che tempo fa avevo iniziato ma poi per motivi di tempo ho lasciato perdere,al momento sto sperimentando qualche classe consultando la guida dev di google e guardando qualche tutorial qui sul forum.Attualmente mi trovo in difficoltà nel mostrare un Alert Dialog,partiamo dal fatto che sto usando due classi,una quasi vuota (la MainActivity) e un'altra classe che ho chiamato background dove uso un oggetto canvas per disegnare qualche bitmap,più precisamente delle piccole immagini jpg delle quali genero le bitmap che uso con il metodo drawBitmap dell'oggetto canvas.

Quello che sto cercando di fare è far si che cliccando un'immagine di quelle visualizzate esca un Dialog che mi dica "ok hai selezionato l'immagine",quindi diciamo un modo per vedere che l'input funziona,però ho notato che in tutte le guide c'è un infinità di codice utilizzato per ridefinire tutti i metodi della classe Dialog,ma sinceramente non vedo perchè dovrei farlo visto che mi serve una cosa basilare.Comunque sia il problema è che non mi visualizza il Dialog,qui di seguito posto il codice così potete vedere dove sbaglio.

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
       
            background b = new background(this);
           
            setContentView(b);
           
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.activity_main, menu);
                return true;
        }
}

Codice (Java): [Seleziona]
public class background extends View{

        ImageView I,II;
    Paint pennello;
    Bitmap bmap;
    AlertDialog.Builder builder;
    AlertDialog alert;
   
        private OnClickListener tocco = new OnClickListener(){
                @Override
                public void onClick(View v) {
                        builder.setTitle("Avviso");
                        builder.setMessage("ok hai selezionato l'immagine");
                        builder.setCancelable(true);
                        alert=builder.create();
                        alert.show();
                }
               
        };
     
   
    public background(Context context) {
                super(context);
                I=new ImageView(context);
                I.setImageResource(R.drawable.abc);
                II=new ImageView(context);
                II.setImageResource(R.drawable.asso);
               
                pennello= new Paint();
               
                builder=new AlertDialog.Builder(context);
               
               I.setOnClickListener(tocco);
        }
       
        protected void onDraw(Canvas quadro){
                super.onDraw(quadro);
               
                //Converte l'ImageView in Bitmap
                BitmapDrawable drawable = (BitmapDrawable) I.getDrawable();
            Bitmap bitmap = drawable.getBitmap();
           
            BitmapDrawable drawableII = (BitmapDrawable) II.getDrawable();    
           
            //applica una scala all'oggetto canvas
            quadro.scale((float)(0.5), (float)(0.5));
           
            //Imposta il colore del pennello
                pennello.setColor(Color.rgb(220, 220, 220));
               
                //Disegna la Bitmap
            quadro.drawBitmap(bitmap,1,1,pennello);
           
            //associa la nuova Bitmap
            bitmap= drawableII.getBitmap();
           
            //Disegna la seconda Bitmap
            quadro.drawBitmap(bitmap,90,1,pennello);
           
            //Altro modo di caricare una bitmap
            bmap=BitmapFactory.decodeResource(this.getResources(), R.drawable.asso);
           
            //Disegna la terza bitmap
            quadro.drawBitmap(bmap,180,1,pennello);
        }
       
       
}
« Ultima modifica: 26 Febbraio 2013, 22:00:22 CET da Alessio_roma™ »
I MIEI SITI:
RPG & Fantasy -> La Fucina di Harad
Pagina personale -> Il Web di Alessio_roma™

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Aiuto con AlertDialog
« Risposta #1 il: 27 Febbraio 2013, 08:58:36 CET »
0
Alcuni appunti:
- i nomi delle classi in java (e quindi in android) vanno scritti per convenzioni con la prima lettera maiuscola; la minuscola si usa per le varibili (quindi non "background", ma "Background")
- i nomi delle variabili dovrebbero essere parlanti; I, II, b non sono parlanti, rendono solo estremamente difficile leggere il codice.
Anche non seguendo questi accorgimenti compila tutto comunque? Si, ma sfido chiunque a distanza di qualche giorno a rileggere agevolmente il codice e capire cosa fa.

Per il tuo problema specifico: aggiungi il tuo listener 'tocco', che dovrebbe visualizzare il dialog, alla ImageView 'I'... ma 'I' te la crei al volo ( I=new ImageView(context); ) e non ha nessun riferimento con la tua view custom 'background' (non viene mai visualizzato).
Visto che ti sei fatto una view custom (perché non hai usato direttamente un ImageView mi sfugge, ma è un'altra storia), dovresti aggiungere il listener direttamente alla tua view.

Indicativamente:
Codice (Java): [Seleziona]
//I.setOnClickListener(tocco);
this.setOnClickListener(tocco);

Offline Alessio_roma™

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
    • www.blogarm.tk
  • Dispositivo Android:
    LG Nexus 4
  • Sistema operativo:
    Windows 7 ultimate x64, Ubuntu 14.04
Re:Aiuto con AlertDialog
« Risposta #2 il: 27 Febbraio 2013, 10:32:31 CET »
0
Alcuni appunti:
- i nomi delle classi in java (e quindi in android) vanno scritti per convenzioni con la prima lettera maiuscola; la minuscola si usa per le varibili (quindi non "background", ma "Background")
- i nomi delle variabili dovrebbero essere parlanti; I, II, b non sono parlanti, rendono solo estremamente difficile leggere il codice.
Anche non seguendo questi accorgimenti compila tutto comunque? Si, ma sfido chiunque a distanza di qualche giorno a rileggere agevolmente il codice e capire cosa fa.

Per il tuo problema specifico: aggiungi il tuo listener 'tocco', che dovrebbe visualizzare il dialog, alla ImageView 'I'... ma 'I' te la crei al volo ( I=new ImageView(context); ) e non ha nessun riferimento con la tua view custom 'background' (non viene mai visualizzato).
Visto che ti sei fatto una view custom (perché non hai usato direttamente un ImageView mi sfugge, ma è un'altra storia), dovresti aggiungere il listener direttamente alla tua view.

Indicativamente:
Codice (Java): [Seleziona]
//I.setOnClickListener(tocco);
this.setOnClickListener(tocco);
Per le cose che hai elencato all'inizio,so già tutto,solo che questa era una prova al volo per vedere cosa facevano alcune classi e i loro metodi,non è di certo il codice sorgente di un'app vera e propria  :-) a dir la verità non pensavo nemmeno che avrei dovuto condividere il codice in rete,la prossima volta starò più attento.

Ho capito quello che mi suggerisci ma al momento non posso provarlo (lo proverò stasera) però mi sorge un dubbio,se io uso un listener su tutta la View,dopo come faccio a capire quale è l'ImageView selezionata? per quello che sto pensando di fare ho bisogno che siano distinte

P.S: Comunque mi compila tutto senza problemi

Post unito: 27 Febbraio 2013, 21:37:13 CET
nessuno sa aiutarmi?
« Ultima modifica: 27 Febbraio 2013, 21:37:13 CET da Alessio_roma™, Reason: Merged DoublePost »
I MIEI SITI:
RPG & Fantasy -> La Fucina di Harad
Pagina personale -> Il Web di Alessio_roma™

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Aiuto con AlertDialog
« Risposta #3 il: 28 Febbraio 2013, 16:57:52 CET »
0
Per carità, colpa mia che son pignolino su certe cose!  :-P

Secondo me prima di tutto c'è da capire che vuoi ottenere per poterti essere d'aiuto.

Dal codice che hai condiviso vedo che (da quel che deduco) ti sei fatto una view custom sulla cui superficie disegni all'onDraw l'immagine R.drawable.asso...
In tutto questo le due ImageView che dichiari non entrano mai in gioco: le dichiari, le inizializzi, ma non le aggiungi mai alla view contenitore (quindi non vengono proprio prese in considerazione quando il dispositivo disegna la tua view background).

Riprendendo quanto scrivi nel tuo primo intervento:

Citazione
Attualmente mi trovo in difficoltà nel mostrare un Alert Dialog,partiamo dal fatto che sto usando due classi,una quasi vuota (la MainActivity) e un'altra classe che ho chiamato background dove uso un oggetto canvas per disegnare qualche bitmap,più precisamente delle piccole immagini jpg delle quali genero le bitmap che uso con il metodo drawBitmap dell'oggetto canvas.

Per fare questo tipo di gestione non hai bisogno di una view custom nella quale disegnare le immagini, hai bisogno di un layout da associare all'activity che contiene due ImageView.

MyActivity.java
Codice (Java): [Seleziona]
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.View;

public class MyActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // imposto il layout da utilizzare nell'activity, che
    // contiene le due ImageView che voglio usare
    setContentView(R.layout.layout_my_activity);
  }

  /**
   * Metodo chiamato al click sulla prima immagine (impostato sul layout)
   */

  public void onClickImage1(View view) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Immagine 1");
    builder.setTitle("Click su immagine");
    builder.setPositiveButton("Chiudi",new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog,int id) {
        dialog.dismiss();
      }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
  }
 
  /**
   * Metodo chiamato al click sulla seconda immagine (impostato sul layout)
   */

  public void onClickImage2(View view) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Immagine 2");
    builder.setTitle("Click su immagine");
    builder.setPositiveButton("Chiudi",new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog,int id) {
        dialog.dismiss();
      }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
  }
}

layout_my_activity.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

    <ImageView
       android:id="@+id/imageView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/immagine1"
       android:onClick="onClickImage1"/> <!-- al click sull'immagine 1 chiama il metodo onClickImage1 dell'activity -->

    <ImageView
       android:id="@+id/imageView2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/immagine2"
       android:onClick="onClickImage2" /> <!-- al click sull'immagine 2 chiama il metodo onClickImage2 dell'activity -->

</LinearLayout>

Non serve altro.

Offline Alessio_roma™

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
    • www.blogarm.tk
  • Dispositivo Android:
    LG Nexus 4
  • Sistema operativo:
    Windows 7 ultimate x64, Ubuntu 14.04
Re:Aiuto con AlertDialog
« Risposta #4 il: 28 Febbraio 2013, 20:35:33 CET »
0
Per carità, colpa mia che son pignolino su certe cose!  :-P

Secondo me prima di tutto c'è da capire che vuoi ottenere per poterti essere d'aiuto.

Dal codice che hai condiviso vedo che (da quel che deduco) ti sei fatto una view custom sulla cui superficie disegni all'onDraw l'immagine R.drawable.asso...
In tutto questo le due ImageView che dichiari non entrano mai in gioco: le dichiari, le inizializzi, ma non le aggiungi mai alla view contenitore (quindi non vengono proprio prese in considerazione quando il dispositivo disegna la tua view background).

Riprendendo quanto scrivi nel tuo primo intervento:

Per fare questo tipo di gestione non hai bisogno di una view custom nella quale disegnare le immagini, hai bisogno di un layout da associare all'activity che contiene due ImageView.

MyActivity.java
Codice (Java): [Seleziona]
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.View;

public class MyActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // imposto il layout da utilizzare nell'activity, che
    // contiene le due ImageView che voglio usare
    setContentView(R.layout.layout_my_activity);
  }

  /**
   * Metodo chiamato al click sulla prima immagine (impostato sul layout)
   */

  public void onClickImage1(View view) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Immagine 1");
    builder.setTitle("Click su immagine");
    builder.setPositiveButton("Chiudi",new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog,int id) {
        dialog.dismiss();
      }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
  }
 
  /**
   * Metodo chiamato al click sulla seconda immagine (impostato sul layout)
   */

  public void onClickImage2(View view) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Immagine 2");
    builder.setTitle("Click su immagine");
    builder.setPositiveButton("Chiudi",new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog,int id) {
        dialog.dismiss();
      }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
  }
}

layout_my_activity.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

    <ImageView
       android:id="@+id/imageView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/immagine1"
       android:onClick="onClickImage1"/> <!-- al click sull'immagine 1 chiama il metodo onClickImage1 dell'activity -->

    <ImageView
       android:id="@+id/imageView2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/immagine2"
       android:onClick="onClickImage2" /> <!-- al click sull'immagine 2 chiama il metodo onClickImage2 dell'activity -->

</LinearLayout>

Non serve altro.
Magari fosse così semplice :-),innazitutto sulle 2 ImageView hai ragione però se noti le ho usato nel metodo onDraw(Canvas quadro) per ottenere le drawable da cui poi ho ottenuto le prime due Bitmap,infatti se guardi bene nella canvas vengono disegnate 3 Bitmap,non una soltanto,comunque sia avrei potuto caricare tutte e tre le Bitmap come ho fatto per la terza,senza mettere in mezzo ImageView e Drawable,ma ti ripeto,questo applicazione è solo una prova per vede i vari modi in cui posso arrivare a fare certe cose.

Seconda cosa,ho bisogno della canvas per disegnare le immagine sovrapposte per un tot numero di pixel perchè volevo realizzare un gioco di carte e disporre il mazzo come in Microsoft Hearts,per questo mi chiedevo come poter aggiungere un listener su una Bitmap in modo che cliccandola mi si visualizzi un AlertDialog che mi da la certezza di averla cliccata,tutto qui insomma,ho anche aperto un topic nella sezione relativa ai listener,però l'ho fatto quando mi sono accorto che non era l'AlertDialog il problema,ma il listener che era associato all'ImageView che non entrava in gioco (come mi hai fatto giustamente notare tu).
I MIEI SITI:
RPG & Fantasy -> La Fucina di Harad
Pagina personale -> Il Web di Alessio_roma™

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Aiuto con AlertDialog
« Risposta #5 il: 01 Marzo 2013, 10:08:57 CET »
0
Hai ragione, non avevo notato che disegnavi tutte e tre le immagini sul canvas  :-)

Mi stavo chiedendo, visto il risultato che vuoi ottenere, non è che puo' essere interessante usare la StackView? Te lo suggerisco per amor di sperimentazione  :-)

Offline Alessio_roma™

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
    • www.blogarm.tk
  • Dispositivo Android:
    LG Nexus 4
  • Sistema operativo:
    Windows 7 ultimate x64, Ubuntu 14.04
Re:Aiuto con AlertDialog
« Risposta #6 il: 02 Marzo 2013, 17:28:51 CET »
0
Al momento ho risolto per metà con l'utilizzo dell'OnTouchEvent,riesco ad ottenere le coordinate X e Y del punto in cui clicco,ora devo inventarmi un modo per calcolare quale carta ho cliccato :-)
I MIEI SITI:
RPG & Fantasy -> La Fucina di Harad
Pagina personale -> Il Web di Alessio_roma™