Пользовательский диалог, независимый от версии платформы, со стандартным значком, заголовком и кнопками - PullRequest
3 голосов
/ 18 декабря 2011

То, что я пытаюсь заархивировать: я хочу диалог с пользовательским представлением в нем, но я хочу стандартный значок, заголовок, кнопки из AlertDialog.

Что я делаюэтот пользовательский класс диалога:

public class CustomDialog extends AlertDialog.Builder {

    private Activity activity;
    private View root;

    public CustomDialog(Activity context) {
        super(context);
        this.activity = context;
    }

    public void setView(int layoutResID) {
        LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        root = inflater.inflate(layoutResID, (ViewGroup) activity.findViewById(R.id.dialog_root), false);
        ScrollView scroller = new ScrollView(activity);
        scroller.addView(root);
        setView(scroller);
    }

    public void setCustomView(View v) {
        ScrollView scroller = new ScrollView(activity);
        scroller.addView(v);
        setView(scroller);
    }

    public View getRoot() {
        return root;
    }

    @Override
    public AlertDialog create() {
        AlertDialog dialog = super.create();

        dialog.getWindow().getAttributes().width = LayoutParams.MATCH_PARENT;

        return dialog;
    }
}

Это работает довольно хорошо, ожидайте, что цвета TextView не будут правильными на устройствах до Сота и Сота.Я использую тему Holo.Light, поэтому стандартный цвет текста - черный, но цвет фона диалогов на устройствах, предшествующих Honeycomb, тоже.А на сотовых устройствах фон диалога белый.Поэтому я добавил dialogTextColor=white в styles.xml в папке values и dialogTextColor=black в папке values-v11.Затем мне пришлось добавить атрибут style к каждому TextView, который я использую в пользовательском диалоге.Это работало до ICS и понятно почему -> v11.Я мог бы изменить его, но я хочу иметь собственный диалог, который делает все правильно: цвет текста на предварительных сотах, Honeycomb, ICS (и все, что будет в будущем) в зависимости от темы приложения, ширины диалога,стандартные кнопки, заголовок, значок от AlertDialog.

1 Ответ

11 голосов
/ 18 декабря 2011

Хитрость в том, что контекст связан с темой. Эта тема определяет все виды вещей, такие как цвета текста по умолчанию и т. Д.

Раньше у «Сотовых диалогов» всегда была одна и та же тема, независимо от того, были ли они созданы из темных или светлых тем, и, за исключением списков, диалоги были темным фоном, светлым передним планом. В «Соте» и более поздних версиях диалоги имеют разные темы, определяемые активностью, которая их порождает.

При накачивании содержимого в диалоге всегда используйте контекст, возвращаемый методом Dialog#getContext(), вместо действия, которое породило диалог. Вместо строки кода, которую вы используете, чтобы получить LayoutInflater выше, попробуйте:

LayoutInflater inflater = LayoutInflater.from(getContext());

Edit: похоже, что вы используете AlertDialog.Builder вместо диалога. AlertDialog.Builder для этой цели добавил метод getContext() в API 11 (Android 3.0, a.k.a. Honeycomb), но до этого его не было. Вы можете создать свой собственный тематический контекст с ContextThemeWrapper для старых устройств. Просто убедитесь, что вы никогда не пытаетесь вызвать этот метод на более старой версии платформы. Вы можете защитить его с помощью простой проверки:

Context themedContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    themedContext = getContext();
} else {
    themedContext = new ContextThemeWrapper(activity, android.R.style.Theme_Dialog);
}
LayoutInflater inflater = LayoutInflater.from(themedContext);
...