2012-05-14 4 views
39

Я переключу свои старые Dialogs на DialogFragment, но темы и стили, похоже, не работают.Тема не применяется к DialogFragment на Android

Я использую DialogFragment из библиотеки совместимости v4, а в методе onCreate, который я пробовал, вызывается setStyle (стиль, тема); с множеством разных тем, но диалог всегда отображается как «старый» диалог в эмуляторе под управлением Android 4.0.3 (т. е. он не отображается в теме Голо).

Есть ли что-нибудь еще, что я должен делать? Использует ли библиотека совместимости тему Holo или что-то еще? Если это так, следует создать два диалоговых окна DialogFragments, один для более старых версий и один для более новых версий?

Спасибо!


Это код (упрощенный) для моего диалога. Я пробовал как Theme_Holo_Dialog_NoActionBar, так и Theme_DeviceDefault_Dialog_NoActionBar, но эмулятор Android 4 всегда показывает диалог как «старый» диалог вместо использования темы Holo. Что я делаю не так? :(

[...] 
import android.support.v4.app.DialogFragment; 
[...] 

public class AlertDialogFragment extends DialogFragment { 

    public static AlertDialogFragment newInstance(int id) { 

    AlertDialogFragment f = new AlertDialogFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("id", id); 
    f.setArguments(args); 

} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    int style = DialogFragment.STYLE_NORMAL, theme = 0; 
    theme = android.R.style.Theme_Holo_Dialog_NoActionBar; 
    setStyle(style, theme);  
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

    mId = getArguments().getInt("id"); 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
     .setTitle(mTitle) 
     .setMessage(mMessage) 
     .setPositiveButton(getString(R.string.btn_ok), new DialogInterface.OnClickListener() {  
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dismiss();     
      } 
     }); 
     return builder.create(); 
    } 
+0

Какой стиль вы наследующий, показывают нам также styles.xml, что ваш targetSdk? он должен быть более 11 – Blundell

+0

Я нацелился на SDK 14, и я даже не использую файл styles.xml, я просто вызываю setStyle (стиль, тема); в методе onCreate диалогового окна DialogFragment, который пытается использовать несколько комбинаций стиля и темы. Например, в моем «старом» диалоговом окне я использовал android.R.style.Theme_DeviceDefault_Dialog_NoActionBar, и он был показан как Holo в эмуляторе ICS, но теперь с использованием той же темы это не так. – LuTHieR

+0

Попробуйте неявно использовать Holo: 'android.R.style.Theme_Holo_Dialog' – Blundell

ответ

25

Я считаю, что вам нужно, чтобы установить тему на фактическое Диалог, а не фрагмент

Используйте этот конструктор для создания AlertDialog:

AlertDialog.Builder(Context context, int theme) 

т.е.

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme) 
+0

Я пробовал и, кажется, работает, спасибо :) Мне нужно только сделать еще несколько тестов, а затем я опубликую результаты и пометьте ваш ответ как принятый , Спасибо! – LuTHieR

+0

@LuTHieR Это решило проблему? –

+0

Не совсем ... в конце концов я создал разные файлы макета XML для каждой версии Android, и это, казалось, сделало трюк ... – LuTHieR

47

Вы не используете конструктор AlertDialog.Builder (Context, int) с библиотекой поддержки, потому что это только доступны с API 11.

Для настройки темы для вашего диалога, используйте вместо этого ContextThemeWrapper так:

ContextThemeWrapper context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Dialog_NoActionBar); 
AlertDialog.Builder builder = new AlertDialog.Builder(context); 
+5

Кто-нибудь пробовал это с пользовательскими стилями? Когда я перехожу в предопределенный стиль андроида, он работает, но не в том случае, если я перехожу в моем собственном стиле .. (мой пользовательский стиль - это ребенок Theme.Dialog) – ashutosh

+0

Если вы вообще не используете строитель альтернативным способом (который работал для меня с пользовательскими стилями): http://stackoverflow.com/questions/13469084/dialogfragment-in-android-with-theme – Almer

-4

Вы должны написать эти коды в «onCreateView».

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    View view = inflater.inflate(R.layout.dialog_your_theme, container); 
    return view; 
} 
+0

Хотя этот блок кода может ответить на вопрос, было бы лучше, если бы вы могли предоставить мало объясняет, почему это так. – David

17

Я просто потерял много времени, но я наконец нашел способ сделать это целиком в xml.

В теме приложения диалоги на самом деле являются тематическими. Так стиле все DialogFragments с зелеными кнопками и зелеными EditText намеков, вы бы стиль, как это:

<style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog"> 
    <item name="android:buttonStyle">@style/button_green</item> 
    <item name="android:textColorHint">@color/green</item> 
</style> 

Затем добавьте эту тему в тему применения в качестве dialogTheme

<style name="MyTheme" parent="android:Theme.Holo.Light"> 
    <item name="android:dialogTheme">@style/DialogTheme</item> 
</style> 

Большое спасибо тому, кто написал this post за то, что показал мне путь к тому, что я искал!

2

Вот более актуальный ответ, используя целевой SDK с 23 и мин SDK 14, этот код отлично работает для меня.

Главное изменение кода в вопросе заключается в установке темы в конструкторе, только переопределение onCreateDialog() и использование класса AlertDialog из библиотеки поддержки v7.

Используя этот код, зеленые текстовые плоские (без полей) кнопки показаны в 4.4.4 в отличие от серых кнопок по умолчанию с границами.

import android.support.v7.app.AlertDialog; 
import android.app.Dialog; 
import android.support.v4.app.DialogFragment; 
import android.content.DialogInterface; 
import android.os.Bundle; 

public class MyDialog extends DialogFragment { 

    String message; 

    public MyDialog(String m) { 
     message = m; 
     int style = DialogFragment.STYLE_NORMAL, theme = 0; 
     theme = android.R.style.Theme_Holo_Dialog_NoActionBar; 
     setStyle(style, theme); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     return new AlertDialog.Builder(getActivity()) 
       .setMessage(message) 
       .setPositiveButton("OK", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((EnterPhoneNumberActivity)getActivity()).doPositiveClick(); 
         } 
        } 
       ) 
       .setNegativeButton("EDIT", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((EnterPhoneNumberActivity)getActivity()).doNegativeClick(); 
         } 
        } 
       ) 
       .create(); 
    } 
} 

Использование в AppCompatActivity:

String message = "test"; 
    if (message != null) { 
     DialogFragment newFragment = new MyDialog(message); 
     newFragment.show(getSupportFragmentManager(), "dialog"); 
    } 
Смежные вопросы