11

ローカルデータベースからのテキストで最初に入力されるEditTextがあります。ユーザーが画面を離れると(onPause)、更新されたテキストはローカルデータベースに保存されます。ShareActionProviderもあります(ActionBarSherlockを使用)。

ユーザーがShareActionProviderを使用すると、古いテキストがターゲットアプリケーションに送信されます。ユーザーがメニュー項目を押したときに、アクションプロバイダーを介して送信されるテキストを更新するにはどうすればよいですか?

@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;
}

ユーザーがmenu-itemを押したときに、onOptionsItemSelected()が呼び出されていないようです。だから私は運がなくて次のonPause()を試しました:

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

ところで:このコードはすべてフラグメントに含まれています。

4

3 に答える 3

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) {
        }});
于 2012-10-17T20:09:07.423 に答える
2

私は同じ問題に遭遇し、自分のアクティビティのメンバー変数として共有インテントを設定することで解決しました。で共有インテントとして設定するとShareActionProvideronCreateOptionsMenuアクティビティのどこからでもインテントを更新できます。インテントを再作成してダブルエントリを含める必要がないように、更新をに入れてBundle、インテントのエクストラをに置き換えることができますIntent.replaceExtras(Bundle extras)。これは私のために働いた。幸運を。

于 2013-07-05T10:25:08.033 に答える
1

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でこのクラスを使用します。

于 2012-10-16T21:20:48.800 に答える