Sfondo
Il Activity
dietro un Acivity
viene disegnato se il tema della attività di primo piano in base alla sua AndroidManifest.xml
è una finestra; in caso contrario, il sistema operativo Android sarà non disegnare il Activity
dietro di esso (probabilmente per risparmiare memoria poiché di solito non verrà visualizzato comunque).
Per sfruttare questa, abbiamo impostato il tema del nostro Acitvity
ad una finestra nel manifesto, rendendo il sistema operativo Android disegnare la Activity
dietro di esso, ma in seguito, programmaticamente impostare il nostro tema l' Activity
a tutto ciò che ci piace in fase di esecuzione.
Tutorial
Fase 1: creare due temi personalizzati per l'applicazione in styles.xml
. Uno per le normali attività e un altro per le attività di dialogo. È importante che il tema della finestra di dialogo personalizzato erediti da un tema di base che è anche una finestra di dialogo. Nel mio caso, il tema principale è Base.Theme.AppCompat.Light.Dialog.FixedSize
). Qui è la mia styles.xml
:
<resources>
<!-- custom normal activity theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
</style>
<!-- custom dialog activity theme -->
<style name="AppTheme.Dialog" parent="Base.Theme.AppCompat.Light.Dialog.FixedSize">
<!-- removing the dialog's action bar -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
</resources>
Fase 2: nel AndroidManifest.xml
, impostare il tema del Activity
in questione a qualsiasi tema di dialogo. Questo fa sì che il sistema operativo Android pensi che Activity
sia una finestra di dialogo, quindi disegnerà il Activity
dietro di esso e non lo oscurerà. Nel mio caso, ho usato Theme.AppCompat.Dialog
. Qui di seguito è il mio AndroidManifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.eric.questiondialog_artifact">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".DialogActivity"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Dialog"> <-- IMPORTANT!!! -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Fase 3: nell'attività reale, impostare il tema programatically a uno il tema per le normali attività, o il tema per le finestre di dialogo.Il mio DialogActivity.java
è qui sotto:
package com.example.eric.questiondialog_artifact;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class DialogActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
setTheme(R.style.AppTheme_Dialog); // can either use R.style.AppTheme_Dialog or R.style.AppTheme as deined in styles.xml
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
}
Forse duplicato: http://stackoverflow.com/questions/1979369/android-activity-as-a-dialog. Potresti essere interessato anche a questo: https://github.com/pingpongboss/StandOut –
@NguyenDoanTung grazie. Ho visto anche quel post, ma la maggior parte di quelle risposte riguarda la modifica di 'AndroidManifest.xml' che non voglio fare. Ho provato il primo metodo menzionato in http://stackoverflow.com/a/22216966/2898715, ma non ha prodotto risultati soddisfacenti come menzionato nella mia domanda. Inoltre, grazie per il link Github, l'ho verificato, tuttavia spero davvero che ci sia una soluzione più semplice. – Eric