Intereting Posts
Не удалось запустить Android Studio AdMob ", вы должны иметь adactivity, объявленный в androidmanifest.xml с configchanges" Я хочу, чтобы текстовое представление было кликабельным. Странное поведение с датчиком ориентации Android Android EditText с переносом слов, но без твердых возвратов При запутывании с помощью ProGuard, -keepattribтрибуты SourceFile, LineNumberTable делают результирующий apk проще для обратной инженерии? Понимание удаления и удаления отношений в greenDao Разница между getView & getDropDownView в SpinnerAdapter Загрузка JSON из String в JSONArray на Android Выпадающее заклинание вне панели действий? (IceCream Sandwich style, w / ActionBarSherlock) Как включить * .so библиотеку в Android Studio? Где можно загрузить более старую версию Android SDK? ActionLayout для элементов навигации отображается с правой стороны База данных не удаляется при удалении приложения Android Значения ткани возвращают нулевой объект phoneNumber после проверки OTP в приложении для Android

ShareActionProvider не доступен для кликов, а не для рендеринга

У меня есть ShareActionProvider вместе с некоторыми другими вариантами в моем ActionBar. Тем не менее, похоже, что у ShareActionProvider есть проблемы с рендерингом, когда сначала отображается в портретном режиме, и он не доступен для первого рендера. Изменение ориентации повторно отображает экран, а затем все параметры, которые должны быть видимыми, видны и при повороте назад снова активируется ActionBar, но на этот раз он правильно отображается в портретном режиме.

Я добавил изображение, описывающее ситуацию:

  1. Параметр «Совместный доступ» не отображается должным образом, он должен иметь значок рядом с ним, и если он не соответствует макету, он должен стать трехточечным меню.

  2. После ориентации все параметры видны, как ожидалось.

  3. Поворот назад к портрету повторно отображает ActionBar, и теперь появляется меню с тремя точками, и оно доступно для клика.

Любые идеи о том, что здесь происходит?

Описание ActionBar

Это мой XML:

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/item_delete" android:icon="@android:drawable/ic_menu_delete" android:showAsAction="ifRoom|withText" android:title="Delete" android:visible="false"/> <item android:id="@+id/item_edit" android:icon="@android:drawable/ic_menu_edit" android:showAsAction="ifRoom|withText" android:title="Edit" android:visible="false"/> <item android:id="@+id/item_share" android:actionProviderClass="android.widget.ShareActionProvider" android:showAsAction="ifRoom|withText" android:title="Share" android:visible="false"/> <item android:id="@+id/item_save" android:icon="@android:drawable/ic_menu_save" android:showAsAction="ifRoom|withText" android:title="Save" android:visible="false"/> <item android:id="@+id/menu_search" android:actionViewClass="android.widget.SearchView" android:icon="@android:drawable/ic_menu_search" android:showAsAction="ifRoom" android:title="@string/menu_search" android:visible="false"/> </menu> 

И так я обрабатываю меню опций в фрагменте:

  /** * Hook into the OptionsMenu and add an Edit, Delete and Share option. */ @Override public void onPrepareOptionsMenu(Menu menu) { MenuItem deleteItem = menu.findItem(R.id.item_delete); deleteItem.setVisible(true); MenuItem editItem = menu.findItem(R.id.item_edit); editItem.setVisible(true); MenuItem shareItem = menu.findItem(R.id.item_share); shareItem.setVisible(true); shareActionProvider = (ShareActionProvider) shareItem.getActionProvider(); shareActionProvider.setShareIntent(getShareIntent()); super.onPrepareOptionsMenu(menu); } /** * Builds an intent that takes the path for the image and passes it to * the sharing mechanism as a stream built on the URI of the image path. * @return the intent to share the image as a stream */ private Intent getShareIntent() { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + receipt.getPhoto())); shareIntent.setType("image/jpeg"); return shareIntent; } 

Solutions Collecting From Web of "ShareActionProvider не доступен для кликов, а не для рендеринга"

Это связано с тем, что вы должны добавить намерение к ShareActionPRovider сразу после раздувания меню, onCreateOptionsMenu .

Если вы это сделаете только в onPrepareOptionsMenu , вам придется вручную вызвать invalidateOptionsMenu() чтобы вызвать обновление ActionBar (как указывает выбранный ответ). Но это не способ сделать это.

Он отлично работает при изменении конфигурации, поскольку onPrepareOptionsMenu() , а затем ваша кнопка совместного onPrepareOptionsMenu() будет работать, так как теперь у нее есть намерение.

Чтобы это исправить, просто сделайте что-то вроде этого:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.YOUR_MENU_XML, menu); ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider(); if (provider != null) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, YOUR_TEXT); shareIntent.setType("text/plain"); provider.setShareIntent(shareIntent); } return true; } 

Таким образом, ShareActionProvider будет иметь Intent с самого начала и будет работать, как ожидалось.

Поэтому кажется, что вызов getActivity (). InvalidateOptionsMenu () в onCreateView в фрагменте делает переопределение меню так, как должно. Он должен отображаться правильно в первом прогоне, хотя, недействительность меню без внесения изменений в него не кажется правильным решением.

Это швы, как ошибка платформы. Вы можете проверить это http://code.google.com/p/android/issues/detail?id=25467 для получения дополнительной информации.

Я не думаю, что это ошибка. Это потому, что ваш титул изменился. Он был короче («Детали» вместо «ReceiptDetail») изначально, поэтому система должна была подумать, что больше места для показа большего количества элементов действия.

Также ширина ShareActionProvider динамическая (она может быть более чем в 2 раза больше обычной ширины).

Чтобы проверить вещь или две, я бы предложил вам переместить элемент действия share до первой позиции, удалить временное обходное решение и посмотреть, все ли это происходит. Вы также можете удалить элемент действия share и использовать три или более обычных элемента действия в качестве теста.