Перейти к содержанию
Fire Monkey от А до Я

Рекомендуемые сообщения

  • Модераторы
Опубликовано
1 минуту назад, Abdi Pranoto сказал:

very nice,
but how to change the navbar color to default?

put into Content new TRectangle with align := MostBottom and color := claBlack

OnResize: Content.Margins.Bottom := 0;

 

  • 1 месяц спустя...
Опубликовано

ZuBy,

у меня почему-то цвет статус-бара темнее, чем цвет фона кнопок.

А еще возникает вопрос, как изменить цвет иконок статус-бара, потому что на белом фоне белые иконки не очень хорошо смотрятся?

 

  • Модераторы
Опубликовано
7 часов назад, Pax Beach сказал:

у меня почему-то цвет статус-бара темнее, чем цвет фона кнопок.

нам из делфи доступно сделать только полупрозрачный цвет

7 часов назад, Pax Beach сказал:

А еще возникает вопрос, как изменить цвет иконок статус-бара, потому что на белом фоне белые иконки не очень хорошо смотрятся?

никак, не используйте светлые цвета для окраски

Пока лучшего результата не смог достичь

  • 2 недели спустя...
Опубликовано (изменено)
if not TJKeyCharacterMap.JavaClass.deviceHasKey(TJKeyEvent.JavaClass.KEYCODE_BACK) then

Хотелось бы уточнить по данной проверке, ведь она не на всех смартфонах срабатывает. Да и вообще нет надежного способа проверить есть ли navigationbar.

На Android 5.1 (без navigationbar), c аппаратными кнопками, условие if not работает, бар не показывается, потому что его нет, но на Android 6.0 (с navigationbar), без аппаратный кнопок, это условие уже не работает, navigationbar не заливается, хотя он есть в системе.

5.1.jpg 6.0.jpg

Если изменить проверку на if (без not), на Android 6.0 navigationbar заливается, однако, navigationbar становится виден и на Android 5.1 (если обновить форму), хотя в системе он не поддерживается (естественно, потому что проверка не верна). 

 5.1.jpg 6.0.jpg

Можно попробовать проверять значение config_showNavigationBar, что-то вроде этого:

resourceID:=TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('config_showNavigationBar'),  StringToJString('bool'), StringToJString('android'));

Строка возвращает следующий набор значений:

Значение: "17956965" если navigationbar есть, "17956955", если его нет. Как можно сконвертировать в привычные 0 или 1?

Изменено пользователем Satellite
Опубликовано (изменено)
10 минут назад, ZuBy сказал:

что за девайс?

Sony Xperia XA (Android 6.0), на нём и проблемки.

Всё прекрасно работает с проверкой значения config_showNavigationBar, правда на Android 5.1 проблема с обновлением (только после смены ориентации экрана - закрашивается статус-бар).

Изменено пользователем Satellite
  • Модераторы
Опубликовано
16 минут назад, Satellite сказал:

Sony Xperia XA (Android 6.0), на нём и проблемки.

Всё прекрасно работает с проверкой значения config_showNavigationBar, правда на Android 5.1 проблема с обновлением (только после смены ориентации экрана - закрашивается статус-бар).

да проверил на своём Nexus'e - работает

 resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('config_showNavigationBar'), StringToJString('bool'), StringToJString('android'));
    if (resourceID > 0) and (TAndroidHelper.Activity.getResources.getBoolean(resourceID)) then
    begin
      resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'),
        StringToJString('dimen'), StringToJString('android'));
      if resourceID > 0 then
        NavigationBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);
    end;

 

  • Модераторы
Опубликовано
26 минут назад, Satellite сказал:

правда на Android 5.1 проблема с обновлением

мне кажется я знаю в чем проблема, но пока решения не нашел.

есть два пути установки флагов

Window.addFlags и Window.setFlags 

и они по разному работают, проверьте на андроид 5.1 вариант с Window.addFlags

Опубликовано (изменено)
21 минуту назад, ZuBy сказал:

проверьте на андроид 5.1 вариант с Window.addFlags

Проверил чисто с Window.addFlags, проблема на месте. Также пробовал и с Window.addFlags, и с Window.setFlags вместе.

З.Ы.: Также меня интересует, какое значение возвращается с getIdentifier (resourceID) на nexus? По идеи должно вернуть 17956965. Просто на Android 5.1, getBoolean(resourceID) возвращает true. :huh:

Изменено пользователем Satellite
  • Модераторы
Опубликовано (изменено)
6 минут назад, Satellite сказал:

ZuBy, тогда я в смятении, что за ерунда творится. 

есть еще один вариант (но не нашел его в интерфейсах, не объявлен)

for api 14 and up

boolean PermanentMenuKey = ViewConfiguration.get(this).hasPermanentMenuKey(); // true if physical, false if virtual

for lower api:

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);

if (hasBackKey && hasHomeKey) {
    // no navigation bar, unless it is enabled in the settings
} else {
    // 99% sure there's a navigation bar
}

источник

 

укороченный вариант

описание 

Цитата

Took me some time but I've found a more reliable way than relying on hasPermanentMenuKey()which doesn't work for newer phones like the HTC One which have no menu key but do have home & back keys so don't need (or show) the soft navigation bar. To get around this try the following code which checks for a back button too:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);

if(!hasMenuKey && !hasBackKey) {
    // Do whatever you need to do, this device has a navigation bar
}

источник

Изменено пользователем ZuBy
Опубликовано
2 минуты назад, ZuBy сказал:

есть еще один вариант (но не нашел его в интерфейсах, не объявлен)

Встречал одно независимое решение: Ищем разницу между realSize.y и screenSize.y, сравниваем разницу с высотой navigationbar'a. Если (difference == navBarHeight), то navigationbar в системе есть.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public boolean hasNavBar(Context context) {
    Point realSize = new Point();
    Point screenSize = new Point();
    boolean hasNavBar = false;
    DisplayMetrics metrics = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
    realSize.x = metrics.widthPixels;
    realSize.y = metrics.heightPixels;
    getWindowManager().getDefaultDisplay().getSize(screenSize);
    if (realSize.y != screenSize.y) {
        int difference = realSize.y - screenSize.y;
        int navBarHeight = 0;
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0) {
            navBarHeight = resources.getDimensionPixelSize(resourceId);
        }
        if (navBarHeight != 0) {
            if (difference == navBarHeight) {
                hasNavBar = true;
            }
        }

    }
    return hasNavBar;

}

Источник

Опубликовано (изменено)

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

To determine the presence of a hardware keys, this method is the easiest:

.
.
uses
  Androidapi.KeyCodes,
  Androidapi.JNI.GraphicsContentViewText,
.
.
  TJKeyCharacterMap.JavaClass.deviceHasKey(AKEYCODE_BACK) //To detect hardware BACK
  TJKeyCharacterMap.JavaClass.deviceHasKey(AKEYCODE_MENU) //To detect hardware MENU
.
.

Result for deviceHasKey is Boolean.

All keycode constants can be found in unit Androidapi.KeyCodes.

Источник

З.Ы. Остаётся лишь написать проверку и тестить. 

Изменено пользователем Satellite
  • Модераторы
Опубликовано
1 минуту назад, Satellite сказал:

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

я хотел вытащить вот это значение 

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
Опубликовано (изменено)
if (TJKeyCharacterMap.JavaClass.deviceHasKey(AKEYCODE_BACK)) and (TJKeyCharacterMap.JavaClass.deviceHasKey(AKEYCODE_MENU)) then

Всё равно значение true передаётся, но navigationbar'a помине нет в системе. :huh:

Изменено пользователем Satellite
  • Модераторы
Опубликовано
function hasNavbar: Boolean;
// uses Androidapi.JNI.Util,
{$IFDEF ANDROID}
var
  Window: JWindowExt;
  realSize: JPoint;
  screenSize: JPoint;
  metrics: JDisplayMetrics;
  difference, navBarHeight, resourceID: Integer;
{$ENDIF}
begin
  Result := false;
{$IFDEF ANDROID}
  metrics := TJDisplayMetrics.Create;
  realSize := TJPoint.Create;
  screenSize := TJPoint.Create;

  Window := GetWindowExt;
  Window.getWindowManager.getDefaultDisplay.getRealMetrics(metrics);
  realSize.x := metrics.widthPixels;
  realSize.y := metrics.heightPixels;

  Window.getWindowManager.getDefaultDisplay.getSize(screenSize);
  if realSize.x <> screenSize.y then
  begin
    difference := realSize.y - screenSize.y;
    resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'),
      StringToJString('dimen'), StringToJString('android'));
    if resourceID > 0 then
      navBarHeight := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID));

    if navBarHeight > 0 then
      Result := difference = navBarHeight;
  end;
{$ENDIF}
end;

вот проверьте

Опубликовано (изменено)

Исправление проблемы с обновлением бара на Android 5.1:

В настройках проекта выбираем No TitleBar:

Project -> Options -> Version Info -> Theme: No TitleBar.

Код события Onresize необходимо переместить в конец Onshow, т.к. в Onresize перестанет возвращаться высота бара. D:

После выполнения этих действий, должно работать нормально на любом устройстве.

Изменено пользователем Satellite

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...