Какова лучшая практика, чтобы установить тему моего CustomDialog, которая расширяет Dialog реализует OnClickListener - PullRequest
1 голос
/ 27 декабря 2011

У меня сейчас большая проблема в приложении. Я использую Theme.Light во всем приложении. Результат отличный, но я заметил, что в ICS диалог имеет белый фон, а в предыдущих версиях фон был черным (см. Скриншот ниже)

Моей первой идеей было использование другого макета для элементов и использование layout-v14 с темным текстом и папки с белым текстом.

Это будет работать, но я действительно хотел бы установить тему диалога, как я делаю с классическим диалогом:

return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_TRADITIONAL)
.create();

Проблема теперь в том, что мой пользовательский диалог расширяет диалог, и у меня больше нет возможности играть со сборщиком:

public class MyCustomDialog extends Dialog implements OnClickListener {

    int THEME=AlertDialog.THEME_TRADITIONAL;

    public MyCustomDialog(Activity plannerActivity) {
        super(plannerActivity);
        View myView=//Something;
        setContentView(myView);
    }
}

и в моем основном коде:

new MyCustomDialog(getActivity()).show();

Поскольку у меня больше нет доступа к сборщику, я не могу изменить тему моего CustomDialog, и я полностью застрял в своем приложении.

Большое спасибо за любую помощь!

enter image description here

РЕДАКТИРОВАТЬ, ДОБАВИТЬ БОЛЬШЕ ИНФОРМАЦИИ

По совету Вине Шуклы я попробовал новый DialogYour (Activity.this, android.R.style.Theme_Translucent_NoTitleBar), но конструктор DialogYour (Activity, int) не определен.

Я не могу переопределить DialogYour с темой, так как некоторые вещи являются внутренними для Android!

Когда я смотрю в код диалога:

Dialog(Context context, int theme, boolean createContextWrapper) {
    if (theme == 0) {
        TypedValue outValue = new TypedValue();
        context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme,
                outValue, true);
        theme = outValue.resourceId;
    }

    mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context;
    mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    Window w = PolicyManager.makeNewWindow(mContext);
    mWindow = w;
    w.setCallback(this);
    w.setWindowManager(mWindowManager, null, null);
    w.setGravity(Gravity.CENTER);
    mUiThread = Thread.currentThread();
    mListenersHandler = new ListenersHandler(this);
}

Я не могу переопределить, потому что PolicyManager принадлежит com.android.internal

1 Ответ

2 голосов
/ 27 декабря 2011

Я пытался custom dialog, но не так.У меня есть overridden onCreateDialog в activity, как это с темой android.R.style.Theme_Translucent_NoTitleBar

protected Dialog onCreateDialog(int id) {
Dialog dialog = new DialogYour(Activity.this, android.R.style.Theme_Translucent_NoTitleBar);
if(id == YOUR_ID){
    dialog.setContentView(R.layout.layout);
    //initialize your views here ...
}

return dialog;  
}

Вы можете попробовать этот способ, и вы получите желаемый макет для пользовательского макета.

Примечание: Вы также можете попробовать использовать тему android.R.style.Theme_Translucent_NoTitleBar в своем коде.

Edit1:

Я не пробовал, но доустановить тему в вашем случае вы можете попробовать так:

ConnectionDialog dialog = new ConnectionDialog(getActivity()); 
dialog.getWindow().getAttributes().windowAnimations = android.R.style.Theme_Translucent_NoTitleBar;
dialog.show();

Edit2: Я проверил ваш код, и проблема была в вашем constructor.

public class MyCustomDialog extends Dialog implements OnClickListener {

    int THEME=AlertDialog.THEME_TRADITIONAL;

    public MyCustomDialog(Context context, int theme) {
        super(context, theme);
        View myView=//Something;
        setContentView(myView);
    }
}

теперь вызовите вышеприведенное диалоговое окно так:

 MyCustomDialog dialog = new MyCustomDialog (this, android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();
...