【问题标题】:Handle ShareActionProvider onClick event处理 ShareActionProvider onClick 事件
【发布时间】:2013-10-29 11:41:21
【问题描述】:

如何获取 ShareActionProvider 菜单项的 onClick 事件?

我的应用程序在图库中显示了一些图像(带有 imageView 的片段),我需要获取 onClick 事件以从缓存中加载当前图像,生成一个临时文件并共享它。

我的分享按钮:

<item android:id="@+id/menu_item_share"
    android:showAsAction="ifRoom"
    android:title="@string/menu_share"
    android:actionProviderClass="android.widget.ShareActionProvider" />

我试过了:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    case R.id.manage_keywords:
        startActivity(new Intent(this, KeywordActivity.class));
        return true;
    case R.id.menu_item_share:
        /*it should handle share option*/
        return true;
    }
    return super.onOptionsItemSelected(item);
}

    menuShare = menu.findItem(R.id.menu_item_share);
    menuShare.setOnActionExpandListener(new OnActionExpandListener() {

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // TODO Auto-generated method stub
            return false;
        }
    });

还有什么建议吗?? 谢谢!

【问题讨论】:

    标签: android menu shareactionprovider


    【解决方案1】:

    每次用户点击 ShareActionProvider 时,将要分享的图片保存到 SDCard,完整示例:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.menu, menu);
    
        ShareActionProvider shareActionProvider = (ShareActionProvider) menu.findItem(R.id.shareactionprovider).getActionProvider();
        shareActionProvider.setShareIntent(getShareIntent());
        shareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() {
            @Override
            public boolean onShareTargetSelected(ShareActionProvider actionProvider, Intent intent) {
                saveImageToSD();
                return false;
            }
        });
    
        return true;
    }
    
    
    
    
    private Intent getShareIntent() {
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
    
        File sdCard = Environment.getExternalStorageDirectory();
    
        File sharedFile = new File(sdCard+"/yourPath/yourImage.jpg");
        Uri uri = Uri.fromFile(sharedFile);
    
        shareIntent.setType("image/*");
        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
        return shareIntent;
    }
    
    
    private void saveImageToSD() {
    
        Bitmap bm = BitmapFactory.decodeResource( getResources(), R.drawable.yourimage);
    
        OutputStream outStream = null;
        try {
            outStream = new FileOutputStream(getTempFile());
            bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
            outStream.flush();
            outStream.close();
            bm.recycle();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private File getTempFile() {
    
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    
            File directory = new File(Environment.getExternalStorageDirectory() + "/yourPath/");
            directory.mkdirs();
    
            File file = new File(directory ,"yourImage.jpg");
    
            try  {
                file.createNewFile();
            }  catch (IOException e) {}
    
            return file;
        } else  {
            return null;
        }
    } 
    

    【讨论】:

      【解决方案2】:

      ShareActionProvider 不支持您建议的流程。您将需要分叉它或提出其他一些共享解决方案。

      或者,更好的是,实现一个可以提供图像的ContentProvider,这样您就可以首先使用正确的IntentShareActionProvider,而无需根据用户选择的共享来更改它目标。通过使用您自己的ContentProvider,您可以完全避免使用临时文件。根据您的图像存储位置,FileProvider may be sufficient for your needs

      【讨论】:

        【解决方案3】:

        我没有检查它,但我会尝试 OnMenuItemClickListener 事件

        【讨论】:

        • 它不起作用... menuShare = menu.findItem(R.id.menu_item_share); menuShare.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { /*应该停在这里*/ return false; } });
        【解决方案4】:

        您可以使用 ShareActionProvider 的 OnShareTargetSelectedListenener 然后将图片添加到您的意图中(您不能在此处修改您的意图):

        mShareActionProvider = (ShareActionProvider) menuItemShare.getActionProvider();
        mShareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() {
                @Override
                public boolean onShareTargetSelected(ShareActionProvider actionProvider, Intent intent) {
                    return false;
                }
            });
        

        因此,另一种解决方案是,在更改当前图像时更新您的意图:

        mShareActionProvider.setShareIntent(createIntentForCurrentImage());
        

        【讨论】:

          猜你喜欢
          • 2017-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 2014-02-01
          • 2015-04-15
          • 1970-01-01
          相关资源
          最近更新 更多