Перейти к содержанию
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;

 

Ссылка на комментарий
31 минуту назад, ZuBy сказал:

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

OnResize: Content.Margins.Bottom := 0;

 

i had analyzed your code,
and its use Android API as well....
you're good....

Ссылка на комментарий
  • 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
Ссылка на комментарий
  • Модераторы

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

корректно (ведет себя так как ожидается) на девайсах:

  • 6.0 - Nexus 5, HTC M8, Samsung S5
  • 5.0 - Nexus 7
  • 5.0.1 - Nexus 9, LG Leon
  • 5.1.1 - Samsung J7
Ссылка на комментарий
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
Ссылка на комментарий
  • Модераторы

 

12 минуты назад, Satellite сказал:

Также меня интересует, какое значение возвращается с getIdentifier (resourceID) на nexus?

17956962

Ссылка на комментарий
  • Модераторы
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;

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

Ссылка на комментарий
  • Модераторы
Только что, Satellite сказал:

Действительно работает, думаю, лучше использовать эту функцию. ;)

в обоих случаях?

Ссылка на комментарий

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

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

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

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

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

Изменено пользователем Satellite
Ссылка на комментарий

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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