Проблемы в оформлении всплывающего каталога

#codenameone

#codenameone

Вопрос:

Я широко использую showPopupDialog(...) функцию Dialog, и она работает нормально. Я помню, что в прошлом это не работало на Android или были проблемы на Android, но теперь это работает довольно хорошо на Android.

Но у меня проблема со стилем с Android. В принципе, я хочу, чтобы Компонент отображался в середине диалогового окна. Это самый простой случай, иногда я добавляю кнопки на южной стороне. Однако в обеих ситуациях я могу поместить содержимое всплывающего окна точно по центру только на iOS, в то время как на Android возникают проблемы.

Это мой текущий CSS:

 @media platform-and {
    PopupContentPane {
        margin: 0px;
        padding: 1.5mm;
        padding-bottom: 3.0mm;
    }
}

@media platform-ios { 
    PopupContentPane {
        margin: 0px;
        padding: 1.5mm;
        padding-top: 0px;
    }
}
  

Основное различие между iOS и Android заключается в том, что, хотя iOS корректно работает с этим CSS, независимо от того, направлена стрелка вверх или вниз, на Android, чтобы получить тот же результат, что и в iOS, мне понадобился бы CSS, созданный следующим образом:

 @media platform-and {
    PopupContentPane-ArrowTop {
        margin: 0px;
        padding: 1.5mm;
    }
    
    PopupContentPane-ArrowBottom {
        margin: 0px;
        padding: 1.5mm;
        padding-bottom: 3.0mm;
    }
}
  

Или что-то подобное (с еще несколькими изменениями).

Итак, на Android, когда стрелка находится внизу, мне нужно дополнительное заполнение снизу. Это все, но это невозможно, потому что в настоящее время нет UUID для PopupContentPane, когда стрелка находится вверху, и другого UUID, когда стрелка находится внизу.

Есть идея или обходной путь? Спасибо

(Добавлю, что пока это единственная ситуация, когда мне нужно использовать тег @media в CSS, чтобы отличать стили iOS от стилей Android.)

Ответ №1:

Изначально, когда мы писали всплывающее диалоговое окно, это была функция только для iOS, поскольку стиль был только на iOS. Мы использовали рамку изображения из 9 элементов для создания всплывающего окна, и мы не хотели копировать этот элемент темы в каждую из собственных тем, поэтому мы оставили это разработчику.

Позже мы придумали возможность показывать стрелку на RoundRectBorder . Другим преимуществом стал переход на iOS / Android к плоскому дизайну, который превратил ранее сложный стиль диалога в простое сплошное белое всплывающее окно. Итак, мы реализовали эту кроссплатформенную версию в белом цвете. Но поскольку iOS имеет уже существующую границу изображения, она все еще используется в iOS и не была удалена. Вероятно, нам следует удалить его и разобраться с возникающими незначительными проблемами совместимости.

Я недавно работал над этим в InteractionDialog здесь: https://github.com/codenameone/CodenameOne/blob/master/CodenameOne/src/com/codename1/components/InteractionDialog.java#L786-L815

Возможно, имеет смысл сделать что-то подобное для Dialog , у которого, похоже, нигде нет этого кода: https://github.com/codenameone/CodenameOne/blob/master/CodenameOne/src/com/codename1/ui/Dialog.java#L1209

Комментарии:

1. Вы дважды помещаете одну и ту же ссылку. В любом случае, я попробовал InteractionDialog вместо Dialog и не увидел никакого преимущества: проблемы с центрированием центрального компонента те же. Является ли идея наличия разных UUID, доступных в зависимости от положения стрелки, как я указал в вопросе, невыполнимой? Очевидно, без ущерба для функционирования уже существующего кода.

2. Я обязуюсь решить эту проблему: github.com/codenameone/CodenameOne/pull/3233