Autore Topic: Persistenza dati da altra activity  (Letto 531 volte)

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Persistenza dati da altra activity
« il: 20 Dicembre 2014, 11:50:08 CET »
0
nei seguenti codici trasferisco dei valori da una activity "Anagraficalista" ad una activity  "imputdati.
L'activity"Anagraficalista"  preleva dati  da database, li mostra in una lista e li invia, attraverso il ContextMenu, alla activity "imputdati".
Con la procedura SharedPreferences voglio rendere persistenti i dati arrivati in "imputdati" da "Anagraficalista" ma non succede nulla e non viene trasferito alcun dato.
Se commento i codici relativi al trasferimento dei dati da  "Anagraficalista" e gli stessi li digito a mano nel layout "imputdati" la procedura di SharedPreferences va a buon fine e rende persistenti i dati. Se viceversa commento i codici relativi alla persistenza, il passaggio dei dati dalla classe"Anagraficalista" avviene regolarmente ma, naturalmente, senza che io possa renderli persistenti.

ecco la classe Anagraficalista che visualizza i dati letti da database
Codice (Java): [Seleziona]
public class Anagraficalista extends ListActivity
{
    private CursorAdapter adapter = null;
    private DbAdapter db7 = new DbAdapter(this);
    private AdapterView<CursorAdapter> listView;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        adapter = new CursorAdapter(this,db7.getAnagrafica(), false)
        {
            @Override          
            public View newView(Context context, Cursor cursor, ViewGroup viewGroup)    //crea la vista che conterrà i dati
            {
                View v = LayoutInflater.from(context).inflate(R.layout.dialog_layout_anagrafica, null);
                return v;
            }      
            @Override
            public void bindView(View view, Context context, Cursor cursor)
            {
               
                TextView txt = (TextView) view.findViewById(R.id.t_PRZ);
                txt.setText(cursor.getString(cursor.getColumnIndex("PRZ")));
                txt = (TextView) view.findViewById(R.id.t_DAT);
                txt.setText(cursor.getString(cursor.getColumnIndex("DAT")));
                txt = (TextView) view.findViewById(R.id.t_SUP);              
            }        
            @Override
            public Object getItem(int position)
            {
                Cursor crs=getCursor();
                crs.moveToPosition(position);              
                String PRZ = crs.getString(crs.getColumnIndex("PRZ"));
                String DAT = crs.getString(crs.getColumnIndex("DAT"));            
                AnagraficaInfo ai=new AnagraficaInfo PRZ, DAT);
                return ai;
            }
        };
        getListView().setAdapter(adapter);
        registerForContextMenu(getListView());
    }
@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {               //finestra di dialogo a pressione lunga x XML modifica-elimina
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }
   
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int id = item.getItemId();
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        int position = info.position;
        AnagraficaInfo ai = (AnagraficaInfo) adapter.getItem(position);
        switch (id) {                    
            case R.id.ins1:
                Intent a = new Intent(getApplicationContext(),imputdati.class);
                a.putExtra("click","1");            
                a.putExtra("PRZ", ai.getPRZ().toString());
                a.putExtra("DAT", ai.getDAT().toString());
                startActivity(a);
                break;
            case R.id.ins2:
                Intent b = new Intent(getApplicationContext(),imputdati.class);
                b.putExtra("click","2");
                b.putExtra("PRZ", ai.getPRZ().toString());
                b.putExtra("DAT", ai.getDAT().toString());
                startActivity(b);
                break;

        };
                return super.onContextItemSelected(item);
    }

nella classe ricevente "imputdati" ci sono subito i codici che mi consentono di ricevere i dati dalla mittente e poi
la procedura di persistenza con SharedPreferences
Codice (Java): [Seleziona]
public class imputdati extends Activity {
    //impostare delle costanti che contengono il nome delle chiavi delle nostre SharedPreferences
    public static final String MY_PREFERENCES = "MyPref";
    public static final String PRZa1_KEY = "txt_PRZa1";
    public static final String PRZa2_KEY = "txt_PRZa2";
    public static final String DATa1_KEY = "txt_DATa1";
    public static final String DATa2_KEY = "txt_DATa2";

    // i riferimenti agli elementi del Layout delle nostre SharedPreferences
    public EditText txt_PRZa1;
    public EditText txt_DATa1;
    public EditText txt_PRZa2;
    public EditText txt_DATa2;

    private SharedPreferences sp;
    private SharedPreferences.Editor editor;
    public Button savebtn;
    public Button reset1;
    private CursorAdapter adapter = null;
    private EditText editText;
    private AdapterView<CursorAdapter> string;
    private AdapterView<CursorAdapter> viewGroup;
    private DbAdapter db7 = new DbAdapter(this);
    EditText t_PRZ;
    EditText t_DAT;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        setContentView(R.layout.imputdati);
     
        String click = getIntent().getExtras().getString("click");
        if (click.equals("1")) {
            t_PRZ = (EditText) findViewById(R.id.txt_PRZa1);
            t_DAT = (EditText) findViewById(R.id.txt_DATa1);
            Intent a = getIntent();
            Bundle d = a.getExtras();
            t_PRZ.setText(d.getString("PRZ"));
            t_DAT.setText(d.getString("DAT"));

        } else if (click.equals("2")) {
            t_PRZ = (EditText) findViewById(R.id.txt_PRZa2);
            t_DAT = (EditText) findViewById(R.id.txt_DATa2);
            Intent b = getIntent();
            Bundle e = b.getExtras();
            t_PRZ.setText(e.getString("PRZ"));
            t_DAT.setText(e.getString("DAT"));
        } else if (click.equals("3")) {
        }
            // comincia la procedura SharedPreferences per salvare i dati nel layout imputdati
            sp = getSharedPreferences(MY_PREFERENCES, Activity.MODE_PRIVATE);

            //set reference dei vari elementi disposti sul Layout,
            txt_PRZa1 = (EditText) findViewById(R.id.txt_PRZa1);
            txt_DATa1 = (EditText) findViewById(R.id.txt_DATa1);

            txt_PRZa2 = (EditText) findViewById(R.id.txt_PRZa2);
            txt_DATa2 = (EditText) findViewById(R.id.txt_DATa2);

            savebtn = (Button) findViewById(R.id.button8);
            //impostare l'azione exec quando l'utente fa clic su SaveBtn
            savebtn.setOnClickListener(new View.OnClickListener() {
                @SuppressLint("NewApi")
                @Override
                public void onClick(View v) {
                    //Impostare le prefs condivise da salvare
                    editor = sp.edit();
                    editor.putString(PRZa1_KEY, txt_PRZa1.getText().toString());
                    editor.putString(DATa1_KEY, txt_DATa1.getText().toString());

                    editor.putString(PRZa2_KEY, txt_PRZa2.getText().toString());
                    editor.putString(DATa2_KEY, txt_DATa2.getText().toString());

                    //Se Android <2.3 (API9) salvare SharedPreferences sincrono, se maggiore o uguale a 2.3, farlo in modo asincrono
                    if (Build.VERSION.SDK_INT < 9) {
                        editor.commit();
                    } else editor.apply();
                }
            });
        }

    @Override
    protected void onResume() {
        super.onResume();
        //legge le preferenze condivise e imposta il valore sul layout di impaginazione
        String txt_PRZa1Text = sp.getString(PRZa1_KEY, "");
        String txt_DATa1Text = sp.getString(DATa1_KEY, "");

        String txt_PRZa2Text = sp.getString(PRZa2_KEY, "");
        String txt_DATa2Text = sp.getString(DATa2_KEY, "");

        //procedura di aggiornamento dei controlli del layout
        txt_PRZa1.setText(txt_PRZa1Text);
        txt_DATa1.setText(txt_DATa1Text);

        txt_PRZa2.setText(txt_PRZa2Text);
        txt_DATa2.setText(txt_DATa2Text);
    }
non vi posto il logcat perchè non mi da alcun errore, semplicemente non trasferisce alcun dato
grazie a chi mi dedicherà del tempo
« Ultima modifica: 22 Dicembre 2014, 11:45:45 CET da gaetano_c »

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Persistenza dati da altra activity
« Risposta #1 il: 22 Dicembre 2014, 14:45:42 CET »
0
Anche un cenno o una ipotesi di possibile soluzione è gradita

Inviato dal mio GT-I9300


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 716
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Persistenza dati da altra activity
« Risposta #2 il: 22 Dicembre 2014, 15:31:32 CET »
+1
onResume() viene chiamato dopo onStart(), ma in onStart() non salvi i dati nelle SharedPref, quindi:
1-La onStart inizializza le due EditText
2-La onResume sovrascrive le due EditText con i dati presi da SP, che però non sono stati ancora salvati

soluzioni:
a-Salva i dati nelle SP alla fine di onStart()
-oppure-
b-Utilizza onSaveInstanceState ed il savedInstanceState di onStart per gestire la persistenza.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Persistenza dati da altra activity
« Risposta #3 il: 22 Dicembre 2014, 21:35:39 CET »
0
Grazie mille seguirò le tue direttive e ti aggiornerò.

Inviato dal mio GT-I9300



Post unito: [time]23 Dicembre 2014, 18:47:52 CET[/time]
come suggerito da Ohmnibus, ho salvato i dati nelle SharedPreferences sp alla fine del metodo on start in questo modo:
Codice (Java): [Seleziona]
 @Override
    protected void onStart() {
        super.onStart();
        String click = getIntent().getExtras().getString("click");
        if (click.equals("1")) {
            t_PRZ = (EditText) findViewById(R.id.txt_PRZa1);
            t_DAT = (EditText) findViewById(R.id.txt_DATa1);
            Intent a = getIntent();
            Bundle d = a.getExtras();
            t_PRZ.setText(d.getString("PRZ"));
            t_DAT.setText(d.getString("DAT"));
        } else if (click.equals("2")) {
            t_PRZ = (EditText) findViewById(R.id.txt_PRZa2);
            t_DAT = (EditText) findViewById(R.id.txt_DATa2);
            Intent b = getIntent();
            Bundle e = b.getExtras();
            t_PRZ.setText(e.getString("PRZ"));
            t_DAT.setText(e.getString("DAT"));
        } else if (click.equals("3")) {
        }
        sp = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
            editor = sp.edit();
                editor.putString(PRZa1_KEY, txt_PRZa1.getText().toString());
                editor.putString(DATa1_KEY, txt_DATa1.getText().toString());
                editor.putString(PRZa2_KEY, txt_PRZa2.getText().toString());
                editor.putString(DATa2_KEY, txt_DATa2.getText().toString());
                editor.commit();
    }
    @Override
    protected void onResume() {
        super.onResume();

        //legge le preferenze condivise e imposta il valore sul layout di impaginazione
        sp = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
        String Texta = sp.getString(PRZa1_KEY,"");
        String Textb = sp.getString(DATa1_KEY,"");
        String Textc = sp.getString(PRZa2_KEY,"");
        String Textd = sp.getString(DATa2_KEY,"");
        //procedura di aggiornamento dei controlli del layout
        txt_PRZa1.setText(Texta);
        txt_DATa1.setText(Textb);
        txt_PRZa2.setText(Textc);
        txt_DATa2.setText(Textd);
    }
però succede che:
prima non riuscivo a visualizzare i dati inviati dalla mittente ma rendevo persistenti i dati digitati con tastiera nelle EditText di "Imputdati",
ora arrivano i dati inviati dalla mittente ma non resta più nulla di persistente nemmeno i dati digitati nelle EditText.
Non mi resta che provare l'implementazione dell' onSaveInstanceState  ma dovrò prima documentarmi e studiarlo.
Grazie
« Ultima modifica: 23 Dicembre 2014, 18:49:37 CET da gaetano_c »

Offline gaetano_c

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    Windows 7
Re:Persistenza dati da altra activity
« Risposta #4 il: 24 Dicembre 2014, 11:38:28 CET »
0
gentile  Ohmnibus, grazie al tuo prezioso suggerimento ho risolto comunque con la prima soluzione in questo modo:
ho effettuato il salvataggio in onStart ma non alla fine bensì ad ogni singolo inserimento e funziona tutto perfettamente
ecco i codici
e ancora grazie
Codice (java
): [Seleziona]
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        setContentView(R.layout.imputdati);

        reset1 = (Button) findViewById(R.id.reset1);
        reset1.setOnClickListener(resetListener);

        Button home = (Button) findViewById(R.id.button6);
        home.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent home = new Intent(imputdati.this, home.class);
                home.putExtra("click", "3");  //condizione di ritorno dell'intent
                startActivity(home);
            }
        });
        // comincia la procedura SharedPreferences per salvare i dati inseriti nel layout di imputdati
        //recuperiamo le nostre SharedPreferences utilizzando il metodo getSharedPreferences
        sp = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
        txt_PRZa1 = (EditText) findViewById(R.id.txt_PRZa1);
        txt_DATa1 = (EditText) findViewById(R.id.txt_DATa1);
        txt_PRZa2 = (EditText) findViewById(R.id.txt_PRZa2);
        txt_DATa2 = (EditText) findViewById(R.id.txt_DATa2);
        savebtn = (Button) findViewById(R.id.button8);
        //impostare l'azione exec quando l'utente fa clic su SaveBtn
        savebtn.setOnClickListener(new View.OnClickListener()
        {
            @SuppressLint("NewApi")
            @Override
            public void onClick(View v) {
                //Impostare le prefs condivise da salvare
                editor = sp.edit();
                editor.putString(PRZa1_KEY, txt_PRZa1.getText().toString());
                editor.putString(DATa1_KEY, txt_DATa1.getText().toString());
                editor.putString(PRZa2_KEY, txt_PRZa2.getText().toString());
                editor.putString(DATa2_KEY, txt_DATa2.getText().toString());
                //Se Android <2.3 (API9) salvare SharedPreferences sincrono, se maggiore o uguale a 2.3, farlo in modo asincrono
                if (Build.VERSION.SDK_INT < 9) {
                    editor.commit();
                } else editor.apply();
            }
        });
    }
    //onStart inizializza le  EditText
    @Override
    protected void onStart() {
        super.onStart();
        String click = getIntent().getExtras().getString("click");
        if (click.equals("1")) {
            t_PRZ = (EditText) findViewById(R.id.txt_PRZa1);
            t_DAT = (EditText) findViewById(R.id.txt_DATa1);
            Intent a = getIntent();
            Bundle d = a.getExtras();
            t_PRZ.setText(d.getString("PRZ"));
            t_DAT.setText(d.getString("DAT"));
            sp = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                editor = sp.edit();
                editor.putString(PRZa1_KEY, txt_PRZa1.getText().toString());
                editor.putString(DATa1_KEY, txt_DATa1.getText().toString());
                editor.commit();
        } else if (click.equals("2")) {
            t_PRZ = (EditText) findViewById(R.id.txt_PRZa2);
            t_DAT = (EditText) findViewById(R.id.txt_DATa2);
            Intent b = getIntent();
            Bundle e = b.getExtras();
            t_PRZ.setText(e.getString("PRZ"));
            t_DAT.setText(e.getString("DAT"));
            sp = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
            editor = sp.edit();
            editor.putString(PRZa2_KEY, txt_PRZa2.getText().toString());
            editor.putString(DATa2_KEY, txt_DATa2.getText().toString());
            editor.commit();
        } else if (click.equals("3"));
    }
    @Override
    protected void onResume() {
        super.onResume();
        //legge le preferenze condivise e imposta il valore sul layout di impaginazione
        sp = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
        String Texta = sp.getString(PRZa1_KEY,"");
        String Textb = sp.getString(DATa1_KEY,"");
        String Textc = sp.getString(PRZa2_KEY,"");
        String Textd = sp.getString(DATa2_KEY,"");
                //procedura di aggiornamento dei controlli del layout
        txt_PRZa1.setText(Texta);
        txt_DATa1.setText(Textb);
        txt_PRZa2.setText(Textc);
        txt_DATa2.setText(Textd);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu)           //Menu per la gestione del database
    {
        MenuInflater inflater = getMenuInflater();         //07 inserimento e visibilità file XML dell'OptionMenu nella activity
        inflater.inflate(R.menu.menu_db, menu);

        MenuItem anl = menu.findItem(R.id.primo);        //08 gestore per l'evento del click
        anl.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()    //08 evento del click che apre activity database anagrafica
        {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent anl = new Intent(imputdati.this, Anagraficalista.class);
                startActivity(anl);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        return super.onPrepareOptionsMenu(menu);
    }
    // 08-10 per gestire il click e visualizzare Toast di una singola voce di menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.primo:
                Intent anl = new Intent(imputdati.this, Anagraficalista.class);
                startActivity(anl);
                Toast.makeText(this, "Apertura Lista Database", Toast.LENGTH_LONG).show(); //08 messaggio toast alla pressione di voce di menu OptionMenu
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 716
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Persistenza dati da altra activity
« Risposta #5 il: 24 Dicembre 2014, 11:53:53 CET »
0
Un unico appunto: mi rendo conto solo ora che nel mio precedente post ho sctitto onStart ma intendevo onCreate.

In pratica il codice che hai scritto nella onStart puoi spostarlo alla fine della onCreate.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.