Autore Topic: Problema avvio fragmentactivity con intent  (Letto 280 volte)

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Problema avvio fragmentactivity con intent
« il: 20 Marzo 2015, 12:06:48 CET »
0
Salve a tutti, ho un problema che definisco strano.
La vista della main activity è un fragmentpager con 8 fragment, per 4 di questi è possibile inserire dei dati.
Nella versione iniziale il menù principale ha una voce di aggiunta dati specifica per ogni fragment, nel xml viene chiamata una procedura presente nella main activity che avvia utilizzando intent con i parametri necessari le fragment activity specifiche; in questo modo tutto funziona correttamente.
Le funzioni per 3 fragment sono così:
Codice: [Seleziona]
public void voce1 (MenuItem item_mn) {
        Intent i = new Intent(this, classe1.class);
        i.putExtra("ID",idnecessario); //ognuno il suo id specifico
        startActivityForResult(i, identificativo_chiamante);
        overridePendingTransition(R.anim.fadein_animation,0);
    }
Mentre per l'ultima ho necessità che l'utente selezioni una certa tipologia prima di procedere:
Codice: [Seleziona]
public void voce4 (MenuItem item_mn) { //con questo seleziono la tipologia di dati da aggiungere per il fragment 4
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle(R.string.testshint);
        builder.setCancelable(true);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                StartTest(which);
                dialog.cancel();
            }
        });
        builder.setSingleChoiceItems(R.array.tests_names,-1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                StartTest(which);
                dialog.cancel();
            }
        });
        builder.show();
    }
    private void StartTest (int which) {
        Intent i = new Intent(this, classe4.class);
        i.putExtra("ID_TEST",which);
        startActivityForResult(i, identificativo_chiamante);
        overridePendingTransition(R.anim.fadein_animation,0);
    }

Con l'ultimo aggiornamento che sto preparando, le voci del menù sono aumentate ed ho pensato di raggruppare le voci dedicate all'aggiunta dei dati, quindi ho rimosso quelle specifiche precedenti ed aggiunto una generica, anch'essa nel file xml esegue una funzine presente nella main activity.
In questa funzione recupero il numero del fragment corrente per identificare i parametri necessari e poi avvio con intent quello che serve; adesso bisogna che sia visualizzato il fragment a cui aggiungere i dati per poterli aggiungere.
Codice: [Seleziona]
public void menuadd (MenuItem item_mn) {
        Intent i = null;
        ViewPager mPager = (ViewPager) findViewById(R.id.pager);
        int ff = mPager.getCurrentItem();
        int caller = 0;
        boolean startactivity = true;
        switch (ff) {
            case 0: //aggiunta ex voce1
                caller = 0;
                i = new Intent(this, classe1.class);
                break;
            case 1: //aggiunta ex voce2
                caller = 1;
                i = new Intent(this, classe2.class);
                i.putExtra("ID",0);
                break;
            case 3: //aggiunta ex voce3
                caller = 4;
                i = new Intent(this, classe3.class);
                break;
            case 5: //aggiunta ex voce4
                caller = 6;
                voce4(); //per la scelta della tipologia di dati
                i = new Intent(this, classe4.class);
                if (testtoadd<50) { i.putExtra("ID",testtoadd); } //testtoadd = variabile globale della main activity, in oncreate imposto a 50 che è un valore "non valido"
                break;
            default: startactivity = false; //fragment che non prevedono aggiunta dati
        }
        if (startactivity) {
            startActivityForResult(i, caller);
            overridePendingTransition(R.anim.fadein_animation, 0);
        }
    }
e questa è la funzione di scelta della tipologia, leggermente modificata dalla precedente:
Codice: [Seleziona]
private void voce4 () { //con questo seleziono la tipologia di dati da aggiungere per il fragment 4
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle(R.string.testshint);
        builder.setCancelable(true);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                testtostart = which;
                dialog.cancel();
            }
        });
        builder.setSingleChoiceItems(R.array.tests_names,-1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                testtostart = which;
                dialog.cancel();
            }
        });
        builder.show();
    }

Per i primi 3 fragment tutto funziona correttamente, ma se scelgo di aggiungere dati al 4° l'app va in crash perchè:
1) il dialog di scelta non viene mostrato
2)  testtoadd rimane impostato a 50 e quindi non viene passato il parametro alla classe che deve gestire l'inserimento

Ho provato anche:
1) a utilizzare getapplicationcontext() invece di this per il AlertDialog.Builder;
2) utilizzare il metodo precedente: dal dialogo chiamata a StartTest e qui impostare testtoadd
3) far visualizzare il dialog di scelta direttamente nello switch
Ma sempre con lo stesso risultato, il dialog non si vede.

Cosa mi suggerite?

Post unito: 20 Marzo 2015, 13:30:09 CET

Scusate, colpa mia, qua siamo in asincrono!

Farò avviare l'activity di inserimento dal dialogo.
« Ultima modifica: 20 Marzo 2015, 13:30:09 CET da LonelyWolf, Reason: Merged DoublePost »
Se la mia risposta ti è utile, per favore un thanks!