Domanda

Per mostrare le finestre di dialogo con contenuti ricchi e elementi di input, utilizzo il AlertDialog.Builder di Android per creare un oggetto di AlertDialog e quindi utilizzo il LayoutInflater del sistema per impostare il contenuto (setView(...)) su un file di layout XML.

Sembra perfetto su Android 2.x (Sfondo scuro, testo bianco):

Inserisci Descrizione dell'immagine qui

Ma su Android 4.x non è affatto leggibile:

Inserisci Descrizione dell'immagine qui

Nota: queste finestre di dialogo non sono le stesse, ovviamente, ma il problema si verifica per entrambe le finestre di dialogo.

Allora, cosa sto facendo male? Sto usando Theme.Light sul livello API <11 e Theme.Holo.Light on>= 11.

Modifica 1: E questo è il codice che uso per il gonfiaggio:

private LayoutInflater mGlobalInflater; // in Activity class
mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); // in Activity's onCreate()
mGlobalInflater.inflate(R.layout.input_dialog, null); // when needed
.

Modifica 2: ed ecco l'XML gonfiato per la vista "Scegli data":

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:padding="15dp">
    <DatePicker
        android:id="@+id/input_date"
        android:startYear="1900"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:text="@string/hint" />
</LinearLayout>
.

Modifica 3: Come ho scoperto ora, il contenuto di dialogo gonfiato è reso correttamente su Android <= 2.3.3 quando si utilizza mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); ed è reso correttamente su Android>= 3.0 quando si utilizza mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);. Quindi il Context fa la differenza. Perché?

Modifica 4:

La finestra di dialogo viene creata e gonfiata all'interno del onContextItemSelected() di Activity:

AlertDialog.Builder dialogPoup = new AlertDialog.Builder(MainActivity.this);
dialogPoup.setTitle("abc123");
final View inputDialog = mGlobalInflater.inflate(R.layout.input_dialog, null);
// setting some properties of the view and its child views
dialogPoup.setView(inputDialog);
.

è corretto? Oppure devo sostituire MainActivity.this da una variabile mContext (ad esempio) che il contesto del Activity è stato assegnato in onCreate()?

È stato utile?

Soluzione 3

L'unica soluzione di lavoro che ho trovato è la seguente:

    LayoutInflater mInflater, mGlobalInflater;
    mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= 11) {
        mGlobalInflater = mInflater;
    }
    else {
        mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    }
.

Ora è possibile utilizzare mInflater per il gonfiaggio normale (come: righe all'interno di un ListView) e mGlobalInflater per gonfiare le viste all'interno di un AlertDialog (utilizzando setView()).Questo funzionerà quindi su tutti i livelli API.

Altri suggerimenti

Invece di ottenere la layoutinflater usando getApplicationContext() come nel tuo codice sopra, usa invece quello della tua attività:

    mGlobalInflater = LayoutInflater.from(this); // in Activity's onCreate()
.

Questo dovrebbe usare il tema corrispondente per la finestra di dialogo.

Quando dici che stai usando Theme.Light e Theme.Holo.Light, conta ciò su cui stai applicando questo tema.

differisce se è il suo Application o il tuo Activity.Se lo stai applicando sul livello Application, se si ottiene il Context dall'applicazione, gonfiando con quel tema (allo stesso modo per Activity).Noteresti la differenza se entrambi i temi sono diversi per l'applicazione vs attività.

Basta tenerlo a mente quando vai attraverso la risposta di @ Joe sopra.Hai detto che la risposta di @ Joe ha risolto il problema per API11 + ma rotto per coloro che precedono.

Quindi dai un'occhiata al tuo AndroidManifesto e vedere cosa hai per i temi per <application> e quel particolare <activity> che stai gonfiando il dialogo da.

Spero che aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top