Меню опций блокируется на Galaxy S4

В моем приложении используется меню параметров в старом стиле. В настоящее время мы ориентируемся на API 9. На Galaxy S4 я заметил следующее поведение:

  1. Пользователь нажимает на кнопку меню. Меню отображается, как и ожидалось.
  2. Пользователь нажимает «еще», чтобы получить доступ к дополнительному разделу. Раздел переполнения отображается, как и ожидалось.
  3. Пользователь нажимает кнопку «Назад», чтобы вернуться в исходное меню параметров. Исходное меню отображается, как и ожидалось.

На данный момент нажатие на любой элемент в меню параметров (включая параметр «Дополнительно»), похоже, не дает никакого эффекта. Однако система на самом деле кэширует эти нажатия. Если пользователь коснется меню пять раз (без видимого эффекта), затем коснется кнопки «Назад», чтобы скрыть меню, а затем коснется кнопки меню, чтобы отобразить меню еще раз, все кешированные нажатия выполняются сразу. onOptionsMenuItemSelected() вызывается один раз каждый раз, когда пользователь нажимает на этот пункт меню.

Это происходит только на S4 (и, возможно, на других устройствах Samsung). Примечательно, что я не вижу такого поведения при использовании стоковой версии Galaxy Nexus 4.2.2.

Является ли это ошибкой с настройкой Samsung Android, или, скорее всего, я делаю что-то не так в своем приложении, а стандартный код Android просто более щадящий?


person jph    schedule 19.06.2013    source источник
comment
Следует отметить, что я создаю меню самым простым способом, который только могу себе представить: в onCreateOptionsMenu() я просто вызываю Menu.add() восемь раз с заголовками от 1 до 8. Кажется, не имеет значения, вызываю ли я через к супер методу; поведение одинаково в любом случае.   -  person jph    schedule 22.06.2013
comment
я использую меню параметров в старом стиле в своем приложении и протестировано на Galaxy S3 с версией 4.2.1, и все идеально, к сожалению, у меня нет S4, если это будет полезно, я опубликую свой код   -  person Android Stack    schedule 23.06.2013
comment
Я создал тему в группе разработчиков Android, связанную с этой проблемой: groups. google.com/d/msg/android-developers/OEhu886jLho/ Один комментатор запустил предоставленный мной пример кода и сказал, что он правильно работает на модели GT-I9505 S4, тогда как устройство, на котором я заметил ошибки, было Модель SGH-I337.   -  person jph    schedule 08.08.2013


Ответы (1)


Приведенный ниже код для индивидуального меню и протестирован с Galaxy S3, работающим с Jelly Bean 4.2.1, и работает отлично,

К сожалению, у меня нет S4, но вы также можете проверить это без дополнительной кнопки:

 public class CustomMenu extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public boolean onCreateOptionsMenu(android.view.Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.cool_menu, menu);
    getLayoutInflater().setFactory(new Factory() {
        public View onCreateView(String name, Context context,
                AttributeSet attrs) {

            if (name.equalsIgnoreCase(
                    "com.android.internal.view.menu.IconMenuItemView")) {
                try {
                    LayoutInflater li = LayoutInflater.from(context);
                    final View view = li.createView(name, null, attrs);
                    new Handler().post(new Runnable() {
                        public void run() {
                            // set the background drawable if you want that
                            //or keep it default -- either an image, border
                            //gradient, drawable, etc.
                            view.setBackgroundResource(R.drawable.myimage);
                            ((TextView) view).setTextSize(20); 

                            // set the text color
                            Typeface face = Typeface.createFromAsset(
                                    getAssets(),"OldeEnglish.ttf");     
                            ((TextView) view).setTypeface(face);
                            ((TextView) view).setTextColor(Color.RED);
                        }
                    });
                    return view;
                } catch (InflateException e) {
                    //Handle any inflation exception here
                } catch (ClassNotFoundException e) {
                    //Handle any ClassNotFoundException here
                }
            }
            return null;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.AboutUs:
        Intent i = new Intent("com.test.demo.ABOUT");
        startActivity(i);
        break;
    case R.id.preferences:
        Intent p = new Intent("com.test.demo.PREFS");
        startActivity(p);
        break;
    case R.id.exit:
        finish();
        break;
    }
    return false;
  }
 }

Не забудьте создать папку с именем menu в папке res и внутри папки меню создать XML для вашего меню (например, cool_menu.xml), например:

  <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
   <item  android:title="about"android:id="@+id/AboutUs" /> 
   <item android:title="Prefs" android:id="@+id/preferences" /> 
   <item android:title="Exit" android:id="@+id/exit" /> 
 </menu>

Надеюсь, это поможет.

person Android Stack    schedule 23.06.2013
comment
В понедельник попробую. Из любопытства, вы устанавливаете пользовательскую фабрику для надувания макета только для того, чтобы вы могли изменить внешний вид меню по умолчанию? Это не то, чем я занимаюсь в настоящее время. Интересно, в конечном итоге ваши действия обойдут проблемный код Samsung. - person jph; 23.06.2013
comment
@user190758 user190758 да, и результат хороший - person Android Stack; 23.06.2013
comment
Ради интереса, не могли бы вы добавить несколько дополнительных пунктов меню, чтобы Android создавал меню переполнения, и посмотреть, наблюдаете ли вы то же плохое поведение, что и я на S4? При наличии более шести пунктов меню должно создаваться дополнительное меню. - person jph; 23.06.2013
comment
Нет любви на S4. Я протестировал ваш код на S4, и он показал такое же ошибочное поведение. Затем я протестировал его на S3, и он работал нормально; нет глючного поведения. Похоже, это проблема, характерная для S4, а не для всех устройств Samsung. На S3 работает 4.1.1. На S4 работает 4.2.2. Galaxy Nexus (который не проявляет ошибок) работает под управлением 4.2.2. Так что это не проблема с 4.2.2. как таковой, но конкретно с S4. - person jph; 24.06.2013