10

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

Когда пользователь использует 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: Этот код все в фрагменте.

ответ

8

Возможно, немного перебор, но я получил его работу, установив настройку совместного использования каждый раз при изменении поля 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

его не перехитрить - это просто правильный способ сделать это. –

1

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

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

mActionProvider.setShareIntent(createShareIntent()); 

Edit: Попробуйте

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.

+0

Спасибо за ответ, но, к сожалению, это не сработало :( –

+0

проверить изменения. – nandeesh

+1

Я пробовал это, только в качестве первого теста я поставил сообщение журнала внутри onPrepareSubMenu. Не регистрируется, поэтому кажется, что это не прошел этот метод при нажатии элемента меню ShareActionProvider. –

2

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

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