Файл обновления ShareActionProvider

У меня есть EditText, который изначально заполняется текстом из локального db. Когда пользователь покидает экран (onPause), обновленный текст сохраняется в локальном db. У меня также есть ShareActionProvider (с помощью ActionBarSherlock).

Когда пользователь использует ShareActionProvider, старый текст отправляется в целевое приложение. Как я могу обновить отправку текста через actionprovider, когда пользователь нажимает на пункт меню?

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.share_action_provider, menu);
    MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
    mActionProvider = (ShareActionProvider) actionItem.getActionProvider();
    mActionProvider.setShareIntent(createShareIntent());
}

private Intent createShareIntent() {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_TEXT, editText.getText().toString());
    return shareIntent;
}

Кажется, onOptionsItemSelected() не вызывается, когда пользователь нажимает на элемент меню. Поэтому я попробовал следующее onPause(), без везения:

@Override
public void onPause() {
    super.onPause();
    mActionProvider.setShareIntent(createShareIntent());
    // save to db:
    getActivity().saveText(editText.getText().toString());
}

BTW: этот код находится во Фрагменте.

Ответ 1

Возможно, немного перебор, но я получил его, установив настройку share каждый раз, когда изменилось поле EditText. Я добавил слушателя TextWatcher:

    editText.addTextChangedListener(new TextWatcher(){
        @Override
        public void afterTextChanged(Editable s) {
             if(mActionProvider!=null) {
                    mActionProvider.setShareIntent(createShareIntent());
             }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }});

Ответ 2

Я наткнулся на одну и ту же проблему, и я решил, что моя доля в качестве переменной-члена в моей деятельности. Я установил его как намерение доли в ShareActionProvider в onCreateOptionsMenu, а затем я могу обновить намерение из любой точки действия. Чтобы избежать необходимости воссоздать свое намерение и иметь двойные записи в нем, вы можете поместить свои обновления в Bundle и заменить дополнения в намерении с помощью Intent.replaceExtras(Bundle extras). Это сработало для меня. Удачи.

Ответ 3

Чтобы обновить shareIntent, я думаю, вам придется переопределить onPrepareOptionsMenu тоже

Итак, в OnPrepareOptionsMenu. OnPrepareOptionsMenu вызывается каждый раз перед отображением меню. снова вызовите setshareintent

mActionProvider.setShareIntent(createShareIntent());

Изменить: Попробуйте это

 private class  MyActionProvider extends ShareActionProvider{

    public MyActionProvider(Context context) {
        super(context);

    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        setShareIntent(createshareintent());
        super.onPrepareSubMenu(subMenu);
    }

 }

И используйте этот класс в файле R.id.menu_item_share_action_provider_action_bar.