Domanda

Sono un po 'nuovo per lo sviluppo Android, questa è la mia prima volta cercando di fornire un elenco delle applicazioni installate in una schermata delle preferenze. Il valore selezionato in questa lista non verrà successivamente utilizzato per lanciare un app della scelta dell'utente.

Ho creato la classe seguente:

public class AppSelectorPreference extends ListPreference {

public AppSelectorPreference(Context context, AttributeSet attrs) {
    super(context,attrs);

    PackageManager pm = context.getPackageManager();
    List<PackageInfo> appListInfo = pm.getInstalledPackages(0); 
    CharSequence[] entries = new CharSequence[appListInfo.size()];
    CharSequence[] entryValues = new CharSequence[appListInfo.size()];

    try {
        int i = 0;
        for (PackageInfo p : appListInfo) {
            if (p.applicationInfo.uid > 10000) {
                entries[i] = p.applicationInfo.loadLabel(pm).toString();
                entryValues[i] = p.applicationInfo.packageName.toString();              
                Log.d(BT,"Label: " + entries[i]);
                Log.d(BT,"PName: " + entryValues[i]);
                i++;
            }         
        }
    } catch (Exception e) {
        Log.e(BT,"ER> Put descriptive error message here");
        e.printStackTrace();
    }   

    setEntries(entries);
    setEntryValues(entryValues);
}

}

Questo si aggiunge alla mia PREFERENCE con il seguente codice XML:

        <PreferenceCategory android:title="Launch Application">
        <CheckBoxPreference
            android:title="Launch Application"
            android:summary="Launch an application"
            android:defaultValue="false"
            android:key="pref_connect_launch_enable"
            android:dependency="pref_connect_enable"/>
        <com.nirsoftware.AppSelectorPreference
            android:title="Select Application"
            android:summary="Select application to launch"
            android:key="pref_connect_package_name"
            android:dependency="pref_connect_launch_enable"/>
    </PreferenceCategory>

Sembra tutto funziona correttamente, fino a quando cliccando sul AppSelectorPreference, che getta un NPE a android.preference.ListPreference.findIndexOfValue (ListPreference.java:169). Eventuali suggerimenti?

È stato utile?

Soluzione

Ho provato il codice, e funziona bene per me, sia aggiungendo il prefence programatically in questo modo:

  AppSelectorPreference pref2 = new AppSelectorPreference(this, null);
  getPreferenceScreen().addPreference(pref2);

e utilizzando XML come hai scritto. Quale è la linea 169 in cui l'errore viene visualizzato?

Inoltre, lo si guarda attraverso logcat per vedere se qualcuno dei nomi delle app o le etichette sta dando qualcosa di simile a nulla? L'unica cosa che posso pensare è che il vostro Android ha applicazioni diverse dalle mie.

Edit: Scusa, ho provato di nuovo e ora ho ottenuto lo stesso errore, come si. Non sei sicuro di quello che ho fatto di diverso, diverso da selezionare un valore

Tuttavia, ho fissato l'override del metodo di findIndexOfValue. Ho appena fatto questo per prova:

@Override
public int findIndexOfValue(String value) {
    return 0;
    //return super.findIndexOfValue(value);
}

, ma, naturalmente, è necessario implementare ritrovare i l'indice per quel valore. Potrebbe essere un bug di Android per molto grandi voci array?

Altri suggerimenti

I suggerirebbe di rimuovere la condizione di se, perché è ciò che causa un errore di puntatore nullo dal momento che la condizione sarà falsa in grado di eseguire i comandi apertura null voci un valore

 try {
            int i = 0;
            for (PackageInfo p : appListInfo) {
                    entries[i] = p.applicationInfo.loadLabel(pm).toString();
                    entryValues[i] = p.applicationInfo.packageName.toString();              
                    Log.d(BT,"Label: " + entries[i]);
                    Log.d(BT,"PName: " + entryValues[i]);
                    i++;
            }
        } catch (Exception e) {
            Log.e(BT,"ER> Put descriptive error message here");
            e.printStackTrace();
        }   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top