2016-03-07 20 views
7

Pytanie

Jak można programowo (bez dotykania AndroidManifext.xml) ustawić motyw w Activityso that it looks like a dialog?jak zaprogramować temat działania jako okno dialogowe?

Uwaga: Zmianie dokonano modyfikacji AndroidManifext.xml, o ile nie trzeba jej modyfikować, aby przełączać się między wyglądaniem normalnego działania lub dialogiem.

Co Próbowałem tak daleko

Próbowałem następujących zgodnie 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 
    } 
} 

Ale kończy się blacking out everything in the background.

Widziałem też this stackoverflow answer i spróbował:

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

ale kończy się dokonywania everything black.

Co zrobić? Dziękuję Ci.

+0

Prawdopodobnie duplikat: http://stackoverflow.com/questions/1979369/android-activity-as-a-dialog. Może być również zainteresowany: https://github.com/pingpongboss/StandOut –

+0

@NguyenDoanTung dziękuję. Widziałem też ten post, ale większość z tych odpowiedzi wymaga modyfikacji "AndroidManifest.xml", którego nie chcę robić. Próbowałem pierwszej metody wspomnianej w http://stackoverflow.com/a/22216966/2898715, ale nie dało zadowalających wyników, jak wspomniano w moim pytaniu. Ponadto, dziękuję za link github, sprawdziłem to, jednak mam nadzieję, że istnieje prostsze rozwiązanie. – Eric

Odpowiedz

8

Tło

Activity za jeden Acivity uwagę jeśli tematyka pierwszym tle Activity w zależności od jego AndroidManifest.xml jest dialog; w przeciwnym razie Android OS będzie nie narysować za nim Activity (prawdopodobnie w celu zaoszczędzenia pamięci, ponieważ zwykle nie będzie widoczna).

Aby to wykorzystać, ustawiamy temat naszej Acitvity do dialogu w manifeście, dzięki Android OS narysować Activity za nim, ale później, programowo ustawić naszego tematu Activity „s do tego, co nam się podoba w czasie wykonywania.

Tutorial

Krok 1: utworzyć dwa niestandardowe tematy dla aplikacji w styles.xml. Jeden dla zwykłych czynności, a drugi dla działań dialogowych. Ważne jest, aby niestandardowy motyw okna dziedziczył z motywu podstawowego, który również jest dialogiem. W moim przypadku tematem nadrzędnym jest Base.Theme.AppCompat.Light.Dialog.FixedSize). Oto moja 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> 

Krok 2: w AndroidManifest.xml ustaw tematem Activity mowa z każdym tematem dialogowego. To sprawia, że ​​Android OS myśli, że Activity jest oknem dialogowym, więc narysuje za nim Activity, a nie go zamazuje. W moim przypadku użyłem Theme.AppCompat.Dialog. Poniżej jest moje 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> 

Krok 3: w rzeczywistej aktywności ustawić motyw programowo albo do tematu normalnej działalności lub tematu dla okien dialogowych.Moja DialogActivity.java jest poniżej:

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

świetny !!! 'setTheme (R.style.AppTheme_Dialog);' jest naprawdę ważne dzięki! – Phoenix

1

jeśli to, co szukasz jest tylko motyw z przezroczystego tła podczas aktywności, wystarczy użyć tego:

<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> 

zastosować ten styl do swojej aktywności w AndroidManifest złożyć i to jest to

0

spróbować tych kodu przed 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 

Spróbuj to dla starych tematu Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_TRADITIONAL);

Spróbuj tych dla KitKat tematu

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


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

Spróbuj tych kodów dla pragmatycznie

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);