2013-10-29 15 views
6

Wie kann ich OnClick-Ereignis eines ShareActionProvider-Menüelements erhalten?Handle ShareActionProvider onClick-Ereignis

Meine Anwendung zeigt einige Bilder in einer Galerie (Fragmente mit ImageView) und ich brauche das OnClick-Ereignis, um das aktuelle Bild aus dem Cache zu laden, eine temporäre Datei zu generieren und zu teilen.

Meine Share-Taste:

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

Ich habe versucht:

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

Und

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

Jeden anderen Vorschlag ?? Danke!

Antwort

0

Ich habe es nicht überprüft, aber ich würde OnMenuItemClickListener Ereignis statt

+0

es hat nicht funktioniert ... menuShare = menu.findItem (R.id.menu_item_share); \t \t menuShare.setOnMenuItemClickListener (neu OnMenuItemClickListener() { \t \t \t \t \t \t @Override \t \t \t public boolean onMenuItemClick (MenuItem Artikel) { \t \t \t \t/* sollte hier aufhören */ \t \t \t \t Rückgabe false; \t \t \t} \t \t}); –

1

Ihr vorgeschlagene Fluss nicht durch ShareActionProvider unterstützt wird versuchen. Sie müssen es abzweigen oder eine andere Lösung zum Teilen finden.

Oder, noch besser, implementieren ein ContentProvider, die das Bild dienen kann, so dass man eine richtige Intent mit ShareActionProvider an erster Stelle verwenden können und nicht ändern sie müssen basierend auf der Auswahl des Benutzers Ziel des Teilens. Wenn Sie Ihre eigene ContentProvider verwenden, können Sie die temporäre Datei wahrscheinlich vollständig vermeiden. Abhängig davon, wo Ihre Bilder gespeichert sind, FileProvider may be sufficient for your needs.

0

Sie können die OnShareTargetSelectedListenener der ShareActionProvider verwenden und dann das Bild auf Ihre Absicht hinzufügen es (Sie sind nicht erlaubt Ihr itent hier zu ändern):

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

So ist die andere Lösung wäre, dass Sie Ihre Absicht aktualisieren, wenn Sie das aktuelle Bild ändern:

mShareActionProvider.setShareIntent(createIntentForCurrentImage()); 
8

Speichern Sie das Bild, das Sie den Benutzer klicken Sie auf den ShareActionProvider jedes Mal auf die SD-Karte teilen möchten, vollständiges Beispiel:

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

Das hat funktioniert !!!! –