【问题标题】:ShareActionProvider refresh textShareActionProvider 刷新文本
【发布时间】:2012-10-16 21:12:28
【问题描述】:

我有一个 EditText,它最初填充了来自本地数据库的文本。当用户离开屏幕(onPause)时,更新的文本存储在本地数据库中。我还有一个 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());
}

顺便说一句:这段代码都在一个片段中。

【问题讨论】:

    标签: android android-fragments actionbarsherlock shareactionprovider


    【解决方案1】:

    也许有点矫枉过正,但我​​通过在每次更改 EditText 字段时设置共享 Intent 来让它工作。我添加了一个 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】:

      我偶然发现了同样的问题,我通过将我的共享意图作为我的活动中的成员变量来解决。我将其设置为onCreateOptionsMenu 中的ShareActionProvider 中的共享意图,然后我可以从活动中的任何位置更新意图。为避免重新创建您的意图并在其中包含重复条目,您可以将更新放在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 中使用这个类。

        【讨论】:

        • 感谢您的回答,但不幸的是这不起作用:(
        • 我试过这个,只是作为第一次测试,我在 onPrepareSubMenu 中放了一条日志消息。没有记录,所以按下 ShareActionProvider 菜单项时似乎没有通过此方法。
        • 是的,我有:schemas.android.com/apk/res/android">
        • 我可以确认,使用 ActionBarSherlock 永远不会调用 onPrepareSubMenu() 方法。
        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2013-07-08
        • 2012-03-07
        • 2015-11-22
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多