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

[Android] Как отключить программную кнопку Меню?


Евгений Корепов

Вопрос

На HTC One M7 нет аппаратной кнопки Меню, вызов меню делается долгим нажатием на кнопку Home. Раньше в настройках телефона можно было выбрать показывать программную кнопку или нет. После обновления аппарата на Lollipop, эта настройка не работает, круглая кнопка с тремя точками болтается по экрану.

Причем кнопка видна только в приложениях написанных на Delphi (перепробовал два десятка известных мне).

Как кнопку можно отключить? Заранее благодарю за советы.

Тупик какой то :-( Скачал стороннее приложение, сравнил манифесты (думал в нем собака порылась), ничего не нашел.

Вот скриншот с этой кнопкой

Screenshot_resize.png

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

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

  • 0
  • Администраторы

Добрый день,

 

Эта кнопка считается устаревшей в версиях андроида начиная с 14 (Ice Cream). Система читает ваш манифест и смотрит на MinSdkLevel. Если он меньше 14, то она пытается сэмулировать (Lolipop) и добавить эту кнопку. 

 

Чтобы ее убрать, нужно поднять нижнюю границу или таргет версию до 14 в манифесте:

<android xmlns:android="http://schemas.android.com/apk/res/android">
    <tool-api-level>14</tool-api-level>
    <manifest>
        <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
    </manifest>
</android>
В вашем приложении:
  • Открываете файл AndroidManifest.template.xml. Он лежит в папке с вашим проектным файлом (появляется при первой попытке компиляции на Андроид)
  • Меняем значения в теге uses-sdk

    Было:

    <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
    
    Стало:

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
    
Собираем приложение. Теперь кнопка меню пропадет на новых версиях Андроида.

Чтобы при повороте приложение не вылетало на версиях среды до XE8 включительно дополнительно нужно добавить в манифест.

Начиная с XE10 правок вносить не надо.

Было:

        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden"
                android:launchMode="singleTask">
Стало:

<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                android:launchMode="singleTask">
Изменено пользователем Brovin Yaroslav
Добавлено исправление ошибки крэша после поворота при изменении версии с 9 на 14
Ссылка на комментарий
  • 0

Все отлично сработало, спасибо! Но появился не приятный побочный эффект - при повороте экрана приложение вылетает. Т.е. Поворачиваю экран, ориентация начинает менятся и тут же приложение закрывается. Попробовал на чистом примере из "Samples\Object Pascal\Mobile Samples\User Interface\MultiView", изменил манифест - вылет присутствует.

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

Все отлично сработало, спасибо! Но появился не приятный побочный эффект - при повороте экрана приложение вылетает. Т.е. Поворачиваю экран, ориентация начинает менятся и тут же приложение закрывается. Попробовал на чистом примере из "Samples\Object Pascal\Mobile Samples\User Interface\MultiView", изменил манифест - вылет присутствует.

Этот досадный глюк наблюдался в версиях XE5-XE6, в версии XE7 он помоему исправлен (правда сам не проверял). В любом случае где-то в инете встречал обход этой проблемы, но ссылки к сожалению дать не могу. Кстати она встречается начиная с версии minAPI 13, на 12 все нормально. Попробуйте, может в 12 версии не будет кнопки меню.

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

 

Все отлично сработало, спасибо! Но появился не приятный побочный эффект - при повороте экрана приложение вылетает. Т.е. Поворачиваю экран, ориентация начинает менятся и тут же приложение закрывается. Попробовал на чистом примере из "Samples\Object Pascal\Mobile Samples\User Interface\MultiView", изменил манифест - вылет присутствует.

Этот досадный глюк наблюдался в версиях XE5-XE6, в версии XE7 он помоему исправлен (правда сам не проверял). В любом случае где-то в инете встречал обход этой проблемы, но ссылки к сожалению дать не могу. Кстати она встречается начиная с версии minAPI 13, на 12 все нормально. Попробуйте, может в 12 версии не будет кнопки меню.

 

Благодарю за совет, но не помогло. Delphi XE7 Update1, поведение следующее:

12 - кнопка не исчезает, смена ориентации проходит нормально

13 - кнопка не исчезает, смена ориентации приводит к закрытию приложения

14 - кнопка исчезает, смена ориентации приводит к закрытию приложения

 

Видимо надо смириться...

Ссылка на комментарий
  • 0
  • Модераторы

а чем она мешает?

сделай обработку этой кнопки и чтобы отображала форму "about"

и полезно будет и напрягать не будет

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

Видимо надо смириться...

 

Вот решение из StackOverflow:

you must change in manifest android:configChanges="orientation|keyboardHidden"> to: android:configChanges="orientation|keyboardHidden|screenSize">

then you can set minsdk, maxsdk, targetsdk as you want, and application will not crash

Сам не пробовал, но судя по тексту должно помочь.

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

Ура! "screenSize" в сочетании с android:minSdkVersion="9" android:targetSdkVersion="14" помогло! Все работает отлично. Всем огромное спасибо. Привожу измененных темплейт манифеста, вдруг кому пригодится.

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="%package%"
        android:versionCode="%versionCode%"
        android:versionName="%versionName%">
    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14" /> 
<%uses-permission%>
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:installLocation="%installLocation%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%">
        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="%libNameValue%" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
        </activity>
        <%activity%>
        <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
        <%receivers%>
    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0

Поздравляю! А с сочетании TargetSDK=14 не пробовали? Я думаю тут лучше будет использовать именно его, чтобы не ограничивать количество устройств, на которых будет запускаться программа.

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

Поздравляю! А с сочетании TargetSDK=14 не пробовали? Я думаю тут лучше будет использовать именно его, чтобы не ограничивать количество устройств, на которых будет запускаться программа.

Спасибо! Не совсем понял вопрос, и так стоит android:targetSdkVersion="14"

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

 

Поздравляю! А с сочетании TargetSDK=14 не пробовали? Я думаю тут лучше будет использовать именно его, чтобы не ограничивать количество устройств, на которых будет запускаться программа.

Спасибо! Не совсем понял вопрос, и так стоит android:targetSdkVersion="14"

Я имел ввиду оставить minSDK=9 а TargetSDK =14.  Теоретически это должно дать возможность запускаться программе на старых устройствах, версии андроид ниже 4.0.3, но убрать кнопку меню на устройствах где версия выше. (просто интересно сработает ли это, т.к. самому не на чем проверить эту кнопку)))

Ссылка на комментарий
  • 0
  • Администраторы

Чтобы при повороте приложение не вылетало на версиях среды до XE8 включительно дополнительно нужно добавить значение screenSize для атрибута android:configChanges в манифест. Так как 14 версия требует обязательного наличия этого значения.

"orientation" The screen orientation has changed — the user has rotated the device.

Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersionattributes), then you should also declare the "screenSize"configuration, because it also changes when a device switches between portrait and landscape orientations.

Начиная с XE10 правок вносить не надо.
Было:

        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden"
                android:launchMode="singleTask">

Стало:

<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                android:launchMode="singleTask">
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...