2016-03-07 13 views
7

Domanda

Come si fa a programatically (senza toccare il AndroidManifext.xml) impostare il tema di un Activityso that it looks like a dialog?come programmare a tema un'attività come una finestra di dialogo?

Nota: è possibile modificare lo AndroidManifext.xml a condizione che non sia necessario modificarlo per consentire di passare da un'attività normale a una finestra di dialogo.

Quello che ho provato finora

Ho provato quanto segue come da this stackoverflow answer:

public class DialogActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     setTheme(android.R.style.Theme_DeviceDefault_Dialog); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dialog); 
     Log.d(TAG,"Build.VERSION.SDK_INT: "+Build.VERSION.SDK_INT); // 23 
    } 
} 

ma finisce per blacking out everything in the background.

Ho visto anche this stackoverflow answer, e ha cercato:

public class DialogActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     setTheme(android.R.style.Theme_DeviceDefault_Dialog); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dialog); 
     getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    } 
} 

ma finisce per fare everything black.

Cosa fare? Grazie.

+0

Forse duplicato: http://stackoverflow.com/questions/1979369/android-activity-as-a-dialog. Potresti essere interessato anche a questo: https://github.com/pingpongboss/StandOut –

+0

@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

risposta

8

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); 
    } 
} 
+1

awsome !!! 'setTheme (R.style.AppTheme_Dialog);' è davvero importante grazie! – Phoenix

1

se quello che state cercando è solo un tema con sfondo trasparente per voi l'attività, basta usare questo:

<style name="Theme.Transparent" parent="android:Theme"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
</style> 

applicare questo stile al vostro attività nella vostra AndroidManifest il file e questo è

0

Prova questi codice prima dailog.setMessage(...);

Dialog id = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_DARK); 

Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); 

//Default theme 

Prova questo per Old tema Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_TRADITIONAL);

provare questi per KITKAT tema

Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_DARK); //Dark 


Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_HOLO_LIGHT); 

Prova questi codici per Pragmaticamente

Exmaple

dialog = new AlertDialog.Builder(this); 
      dialog = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_DARK); 
      dialog.setTitle("HAI"); 
      dialog.setMessage("look"); 
      dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
Toast toast= Toast.makeText(getApplicationContext(), "This is exmaple theme", Toast.LENGTH_LONG); 
Problemi correlati