Autore Topic: Deprecated & Api level  (Letto 600 volte)

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Deprecated & Api level
« il: 15 Dicembre 2015, 17:09:43 CET »
0
Salve, sono a chiedervi come posso far coesistere una istruzione deprecata ed una nuova nello stesso codice; se faccio una condizione come quella sottostante utilizzando un codice deprecato per le API <21 e il codice nuovo per le API => 21 se metto nel manifest minSdkVersion=18 mi segna in rosso la nuova istruzione. Io vorrei utilizzare il vecchio codice deprecato quando ho le API < 21 ed il nuovo codice con le API > 20.

Codice: [Seleziona]
                if(android.os.Build.VERSION.SDK_INT < 21) {
                        The method xxxx from the type yyyyy is deprecated (se indico API21 nel manifest)
                } else {
                        - Call requires API level 21 (current min is 18): android.xxxxx.yyyyy#zzzzzz (se indico API18 nel manifest)
                }

Grazie.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Deprecated & Api level
« Risposta #1 il: 16 Dicembre 2015, 00:35:37 CET »
0
Ma cosi è corretto. Però se queste linee sono all'interno di un metodo che viene chiamato solo se hai le api 21 allora è sbagliato

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Deprecated & Api level
« Risposta #2 il: 16 Dicembre 2015, 10:38:23 CET »
0
Se non l'hai già fatto, devi mettere android:targetSdkVersion maggiore o uguale a 21
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 wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Deprecated & Api level
« Risposta #3 il: 16 Dicembre 2015, 14:48:24 CET »
0

Ho già targetSdkVersion maggiore di a 21; il metodo viene eseguito indipendentemente dalla versione delle API, deve eseguirlo sia per dispositivi con API < 21 che => 21, a seconda della versione del dispositivo eseguirebbe le relative righe di codice più adatte.

Se dichiarando minSdkVersion=18 nel manifest mi mette la crocetta rossa sul codice ( Call requires API level 21 (current min is 18): android.xxxxx.yyyyy#zzzzzz) e non mi compila il codice dovrei compilare due progetti separati, uno per le vecchie versioni API e uno con le nuove versioni?
A cosa serve allora controllare la android.os.Build.VERSION.SDK_INT ed eseguire codice diverso in base alla versione se poi non si può compilare il progetto? :(

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Deprecated & Api level
« Risposta #4 il: 16 Dicembre 2015, 15:00:57 CET »
0
Prova ad aggiungere l'annotazione

Codice (Java): [Seleziona]
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
alla dichiarazione del metodo
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 wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Deprecated & Api level
« Risposta #5 il: 12 Febbraio 2016, 12:00:05 CET »
0
Prova ad aggiungere l'annotazione

Codice (Java): [Seleziona]
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
alla dichiarazione del metodo

Ho provato e funzionicchia ... perlomeno non mi da più errore nella compilazione ...
Se però eseguo il codice su uno smartphone 4.3 mi da subito errore in partenza! :(

Questo perché nel codice ho un paio di callback, una per smartphone < 21 ed una dalla 21 in poi; in fase di caricamento le carica entrambe quindi mi da errore al caricamento di quella per la 21! :(

Non posso toglierle perché sono dentro ad una ListActivity e in questa visualizzo dei dati che vengono caricati dalla callback.


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Deprecated & Api level
« Risposta #6 il: 12 Febbraio 2016, 12:19:01 CET »
0


Abstracting the New APIs | Android Developers

Qui è spiegato come creare componenti che supportano differenti API.

In soldoni crei una classe wrapper che al suo interno istanzia una classe differente in base alla versione del SO. Visto che il codice "incompatibile" è in classi differenti e visto che queste classi non sono mai inizializzate se non supportate, non viene generato alcun errore.

Includo come esempio la classe per la gestione della clipboard che uso.

Codice (Java): [Seleziona]
public abstract class CompatClipboard {

        private static CompatClipboard mClipboard = null;
       
        public static CompatClipboard getInstance(Context context) {
                if (mClipboard == null) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                                mClipboard = new CompatClipboardHoneycomb(context);
                        } else {
                                mClipboard = new CompatClipboardEclair(context);
                        }
                }
                return mClipboard;
        }

        /**
         * Sets the contents of the clipboard to the specified text.
         * @param label User-visible label for the clipboard data.
         * @param text The actual text to be set to the clipboard.
         */

        public abstract void setText(CharSequence label, CharSequence text);
       
       
        @SuppressWarnings("deprecation")
        @TargetApi(Build.VERSION_CODES.ECLAIR)
        private static class CompatClipboardEclair extends CompatClipboard {

                //Context mContext;
                android.text.ClipboardManager mClipboardManager;

                public CompatClipboardEclair(Context context) {
                        //mContext = context;
                        mClipboardManager = (android.text.ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
                }

                @Override
                public void setText(CharSequence label, CharSequence text) {
                        mClipboardManager.setText(text);
                }

        }
       
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        private static class CompatClipboardHoneycomb extends CompatClipboard {

                //Context mContext;
                android.content.ClipboardManager mClipboardManager;
               
                public CompatClipboardHoneycomb(Context context) {
                        //mContext = context;
                        mClipboardManager = (android.content.ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
                }

                @Override
                public void setText(CharSequence label, CharSequence text) {
                        ClipData clip = ClipData.newPlainText(label, text);
                        mClipboardManager.setPrimaryClip(clip);
                }

        }

}

Si usa così:

Codice (Java): [Seleziona]
CompatClipboard.getInstance(this).setText("Clip01", "Testo da inserire nella clipboard")
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 wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Deprecated & Api level
« Risposta #7 il: 12 Febbraio 2016, 16:13:11 CET »
0
Nel mio caso non riesco a cavarmela con una classe astratta chiamata dentro alla ListActivity. :(

Perché i due metodi diversi chiamati hanno delle callback che a loro volta alimentano la lista caricata sulla listview e notificano che il dataset è cambiato quindi non riuscirei a variare la lista e notificare che il dataset è cambiato ... :(

Forse ho trovato una alternativa senza classe astratta, senza broadcast receiver e passaggio di dati serializzati ... :)
Bastava non istanziare le due callback ma farlo direttamente nella chiamata.
« Ultima modifica: 12 Febbraio 2016, 17:21:09 CET da wlf »