AlertAlogs gonfiati illeggibili su Android 4.x mentre sembra perfetto su Android 2.x
-
13-12-2019 - |
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):
Ma su Android 4.x non è affatto leggibile:
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()
?
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