0

Я пытаюсь реализовать намерение поделиться фотографиями. У меня есть полноэкранная активность, которая расширяет ActionBarActivity и фрагмент, который реализует immersivemode, как объясняет руководство разработчика Android, поэтому пользователь может видеть изображение в полноэкранном режиме. Проблема в том, что даже если я вижу значок share на ActionBar, кажется, что его нельзя щелкнуть, по-видимому, потому, что метод onOptionsItemSelected никогда не вызывается.MenuItem on ActionBar не может быть нажата

Вот onCreateOptionsMenu:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_share, menu); 
    return true; 
} 

onOptionsItemSelected:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle presses on the action bar items 
    switch (item.getItemId()) { 
     case R.id.menu_share: 
      Intent i = getIntent(); 
      uriString = i.getStringExtra("uri"); 
      if(uriString != null) { 
       Uri uri = Uri.parse(uriString); 

       mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item); 
       mShareActionProvider.setShareIntent(createShareIntent(uri)); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

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

private Intent createShareIntent(Uri uri) { 
    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri); 
    shareIntent.setType("image/*"); 
    startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_image))); 
    return shareIntent; 
} 

menu_share.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/menu_share" 
     android:title="Share" 
     app:showAsAction="ifRoom" 
     android:icon="@drawable/abc_ic_menu_share_mtrl_alpha" 
     app:actionProviderClass="android.support.v7.widget.ShareActionProvider" 
     /> 
</menu> 

Я пробовал разные способы, например, с помощью setOnMenuItemClickListener или подобных вещей, которые рассматривают слушатель, но я вижу, что эти слушатели игнорируются при Я отлаживаю. Я также искал решение здесь и на других сайтах, но я не могу решить, как решить эту проблему, поэтому любая идея будет оценена по достоинству. Спасибо заранее!

ответ

0

В конце концов, я изменил свой подход, чтобы решить проблему, и теперь я могу вызвать метод onOptionsItemSelected(MenuItem item) и обмениваться изображениями из своего приложения с другими. Я поставил код ниже.

onCreateOptionsMenu (меню Menu):

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 

    menuItem = menu.add(Menu.NONE, R.id.action_share, Menu.NONE, R.string.action_share); 
    menuItem.setIcon(R.drawable.abc_ic_menu_share_mtrl_alpha); 
    menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    mShareActionProvider = new ShareActionProvider(this); 
    return true; 
} 

onOptionsItemSelected (MenuItem пункт):

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 

      case R.id.action_share: 
       Intent i = getIntent(); 
       uriString = i.getStringExtra("uri"); 

       if (uriString != null) { 
        Uri uri = Uri.parse(uriString); 

        MenuItemCompat.setActionProvider(item, mShareActionProvider); 
        createShareIntent(uri); 
        return true; 
       } 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

Мой метод для создания доли намерения, когда я нажимаю в правом меню:

private void createShareIntent(Uri uri) { 
    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri); 
    shareIntent.setType("image/*"); 
    if (mShareActionProvider != null) { 
     mShareActionProvider.setShareIntent(shareIntent); 
    } 

} 

Идентификатор элемента находится в ids.xml в папке значения:

<?xml version="1.0" encoding="utf-8"?> 
    <resources> 
     <item type="id" name="action_share"/> 
    </resources> 

strings.xml:

<!-- Actions --> 
    <string name="action_share">Share image</string> 

Как вы можете видеть, я больше не использую getMenuInflater().inflate(int menuRes, Menu menu), но я использую метод add() для создания моего меню, и он работает для меня.

2

Вы раздуваете неправильное меню. Так как файл меню называется menu.xml вы должны сделать

getMenuInflater().inflate(R.menu.menu, menu); 

вы не непосредственно раздувать запись, но в меню.

Также под вашим

switch (item.getItemId()) { 
    case R.id.menu_share: 

пишет: Log.d("mytag", "share menu clicked"); Затем вы можете проверить в вашем андроиде LogCat, что нет ничего плохого в том щелканье меню, но с Intent вы получаете от.

+0

Прошу прощения, я виноват, я написал menu.xml вместо menu_share.xml, это настоящее имя моего файла меню. Теперь я редактирую вопрос, спасибо! –

+0

Вам не нужно регистрировать слушателя. Я подозреваю, что ваш uriString возвращает null. После случая R.id.menu_share: напишите Toast.makeText (это, «общее меню щелкнуто», Toast.LENGTH_LONG) .show(); И расскажите, что вы видите. –

+0

Нет, uriString возвращает правильную строку, я уже проверял ее при попытке другого решения и Intent i = getIntent() и uriString = i.getStringExtra ("uri"); были в методе onCreateOptionsMenu (меню). Дело в том, что onOptionsItemSelected (MenuItem menuItem) никогда не вызывается ... Если я поставил точку останова в этом методе, когда я нажимаю на значок общего доступа, отладчик не видит его и ничего не происходит –

Смежные вопросы