'Share Intent text using Kotlin on Android
I want to share text in my CardView using share Intent using kotlin but there is a problem with last line in the code in kotlin the code
val shareIntent = Intent()
shareIntent.action = Intent.ACTION_SEND
shareIntent.putExtra(Intent.EXTRA_STREAM, "ali")
shareIntent.type = "text/plain"
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)))
here is the problem in the code
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)))
please help me
see the images to understand me
images
the adapter full code
class MyAdapter(context: Context, listItem: ArrayList<com.EliteTeam.comedytaste.Model.Movie>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
var Context = context
var movieList = listItem;
var layoutInflator = LayoutInflater.from(context)
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
var inflateView = layoutInflator.inflate(R.layout.single_item, parent, false)
return MyViewHolder(inflateView)
}
override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
holder?.moviewTitle?.text = movieList[position].name
holder?.movieDescription!!.text= movieList[position].description
//holder!!.cardImageView!!.background= movieList[position].image
holder?.onclick(Context, position)
holder!!.cardImageView.setBackgroundResource(movieList[position].image)
}
override fun getItemCount(): Int {
return movieList.size
}
class MyViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
var moviewTitle: TextView = itemView?.findViewById(R.id.movieTitleTextView)!!
var movieDescription: TextView = itemView!!.findViewById(R.id.movieDescriptionTextView)
var cardImageView: CardView = itemView!!.findViewById(R.id.imageCard)
var share: ImageButton = itemView!!.findViewById(R.id.share)
fun onclick(context: Context, position: Int) {
cardImageView.setOnClickListener {
}
share.setOnClickListener {
val shareIntent = Intent()
shareIntent.action = Intent.ACTION_SEND
shareIntent.putExtra(Intent.EXTRA_TEXT, "ali")
shareIntent.type = "text/plain"
startActivity(Intent.createChooser(shareIntent,"send to"))
}} }}
Solution 1:[1]
Try this :-
Use Intent.EXTRA_STREAM
only when you have to send Binary data like images , if you want to sent text use Intent.EXTRA_TEXT
val shareIntent = Intent()
shareIntent.action = Intent.ACTION_SEND
shareIntent.type="text/plain"
shareIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
startActivity(Intent.createChooser(shareIntent,getString(R.string.send_to)))
if using this code in adapter then last line should be
context.startActivity(Intent.createChooser(shareIntent,getString(R.string.send_to)))
Solution 2:[2]
Share text in activity
val intent = Intent(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_TEXT, "shareTextHere")
intent.type = "text/plain"
startActivity(Intent.createChooser(intent, "Share Via"))
Share text in adapter
val intent = Intent(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_TEXT, "shareTextHere")
intent.type = "text/plain"
context.startActivity(Intent.createChooser(intent, "Share Via"))
Solution 3:[3]
Just use
context.startActivity
Insted of
startActivity
Solution 4:[4]
You can use these function directly:
fun showSharingDialogAsKotlin(text: String) {
val intent = Intent()
intent.action = Intent.ACTION_SEND
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_TEXT, text)
startActivity(Intent.createChooser(intent, "Share with:"))
}
Also, if you want to show your image and if you have a link:
fun showSharingDialogAsKotlinWithURL(text: String, url: String) {
val intent = Intent()
intent.action = Intent.ACTION_SEND
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_TEXT, "$text: $url")
startActivity(Intent.createChooser(intent, "Share with:"))
}
Solution 5:[5]
You can certainly go to definition of the Start Activity and view the overloads as you are not passing one of the acceptable parameters.
What I like to do, in order to have navigation code all over the place, is to create an IntentFactory like this:
public class IntentFactory {
/**
*
* @param context
* @return intent
*/
public static Intent getLoginIntent(Context context, boolean launchedFromNotification, boolean isApproveNotify, String idOfDetailToOpen, NewsModel notificationModel){
Intent intent = new Intent(context, LoginActivity.class);
intent.putExtra(Globals.INTENT_KEYS.KEY_FROM_BADGE_ACCESS, launchedFromNotification);
intent.putExtra(Globals.INTENT_KEYS.KEY_ID_OF_DETAIL_TO_OPEN, idOfDetailToOpen);
intent.putExtra(Globals.INTENT_KEYS.KEY_IS_APPROVE_NOTIFY, isApproveNotify);
intent.putExtra(Globals.INTENT_KEYS.KEY_ALERT_NOTIFICATION_FOR_APPROVAL, notificationModel);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
return intent;
}
/**
*
* @param filePath
* @param subject
* @param body
* @return
*/
public static Intent getSendImageIntent(String filePath, String subject, String body){
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + filePath));
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, body);
return Intent.createChooser(intent, "Share File");
}
/**
*
* @param toEmailAddresses
* @param subject
* @param body
* @param uris
* @return
*/
public static Intent getEmailIntent(String[] toEmailAddresses, String subject, String body, ArrayList<Uri> uris) {
Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_EMAIL, toEmailAddresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, body);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if(uris != null) {
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
}
return Intent.createChooser(intent, "Send mail...");
}
/**
* Used to launch to app details screen for toggling of permissions or other things
* @param context
* @return
*/
public static Intent getShowAppDetailSettingsIntent(Context context){
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:" + context.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
return intent;
}
}
Then you can easily manage using your StartActivity calls with
String email = SharedPreferencesManager.getInstance(getContext()).getSecuredPreference(REMEMBER_ME_USER_KEY);
String subject = getString(R.string.message) + " " + model.getFirstName() + " " + model.getLastName();
String body = getString(R.string.subject) + model.getFirstName() + " " + model.getLastName() + "\n" + model.getShootKeyUrl();
startActivity(IntentFactory.getEmailIntent(new String[]{email}, subject, body, null));
So if you align the proper parameters you will be good, but I would still recommend extracting it for ease of updating to a factory like this.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Pooja |
Solution 2 | Sumit Ojha |
Solution 3 | Yogesh Choudhary Paliyal |
Solution 4 | Nameless |
Solution 5 | Sam |