通过使用 android Xamarin 在自定义列表视图中单击文本视图来发送电子邮件
send email by clicking textview in customized listview with android Xamarin
我在尝试通过使用 Xamarin 单击列表视图中的文本视图字段来发送电子邮件时遇到错误,所有这些都与 activity 无法调用电子邮件 Intent 的实例有关。
我尝试了不同的方法,但都没有成功。
首先,我尝试在 activity 类中调用一个方法(我在适配器中使用了一个方法,但它没有用);
所以我改为尝试调用 textview 单击事件。在 java 中,使用表达式似乎很容易完成:
if (mContext instanceof MyActivity) { methodCall() };
在 C# 中,我尝试使用
if (mContext.GetType() == TypeOf(ListaVereadoresActivity))
但这不起作用,
而且,下面代码中提出的解决方案试图调用 StartActivity(email);
ERROR: Unhandled Exception:
Java.Lang.Exception: No Activity found to handle Intent {
act=android.intent.action.SEND typ=message/rfc822 flg=0x10000000 (has
extras) }
代码示例:
[Activity(Label = "Vereadores")]
public class ListaVereadoresActivity : Activity
{
List<Vereador> listaVer = new List<Vereador>();
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.listaVereadores_layout);
GenerateListaVereadores();
ListView vereadorListView = FindViewById<ListView>(Resource.Id.lstVereadores2);
vereadorListView.ItemClick += OnListItemClick;
VereadorAdapter adapter = new VereadorAdapter(this, listaVer, this.ApplicationContext);
vereadorListView.Adapter = adapter;
}
// 不再使用
public void SendEmail(String emailAdd)
{
var email = new Intent(Android.Content.Intent.ActionSend);
email.SetType("message/rfc822");
email.PutExtra(Android.Content.Intent.ExtraEmail, new string[] { emailAdd });
StartActivity(email);
}
private void GenerateListaVereadores()
{
var azuaite = new Vereador();
azuaite.Nome = "Azuaite";
azuaite.Foto = Resource.Drawable.azuaite;
azuaite.Email = "some@email.address";
listaVer.Add(azuaite);
var aleksander = new Vereador();
aleksander.Nome = "Aleksander";
aleksander.Foto = Resource.Drawable.aleksander;
aleksander.Email = "some@email.address";
listaVer.Add(aleksander);
var dhony = new Vereador();
dhony.Nome = "dhony";
dhony.Foto = Resource.Drawable.dhony;
dhony.Email = "other@email.address";
listaVer.Add(dhony);
}
void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
var listView = sender as ListView;
var t = listaVer[e.Position];
Toast.MakeText(this, t.Nome, ToastLength.Short).Show();
}
我的自定义适配器:
public class VereadorAdapter : BaseAdapter
{
private List<Vereador> vereadorList;
Activity activity;
protected Context mContext;
public VereadorAdapter(Activity act, List<Vereador> v, Context appContext)
{
activity = act;
vereadorList = v;
mContext = appContext;
}
public override int Count
{
get { return vereadorList.Count; }
}
class ViewHolder : Java.Lang.Object
{
public TextView nomeVereadorTxt { get; set; }
public TextView emailVereadorTxt { get; set; }
public ImageView fotoVereadorImg { get; set; }
}
public override Java.Lang.Object GetItem(int position)
{
var vereador = (Vereador)vereadorList[position];
return vereador;
}
public override long GetItemId(int position)
{
return 0;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = vereadorList[position];
ViewHolder holder;
var view = convertView;
if (view != null)
{
holder = view.Tag as ViewHolder;
}
else
{
holder = new ViewHolder();
view = activity.LayoutInflater.Inflate(Resource.Layout.CustomView, parent, false);
holder.nomeVereadorTxt = view.FindViewById<TextView>(Resource.Id.VereadorNome);
holder.fotoVereadorImg = view.FindViewById<ImageView>(Resource.Id.VereadorFoto);
holder.emailVereadorTxt = view.FindViewById<TextView>(Resource.Id.VereadorEmail);
view.Tag = holder;
}
//setar as propriedades dos componentes
holder.emailVereadorTxt.Text = item.Nome;
holder.fotoVereadorImg.SetImageResource(item.Foto);
holder.emailVereadorTxt.Text = item.Email;
holder.emailVereadorTxt.Click += EmailVereadorTxt_Click;
return view;
}
private void EmailVereadorTxt_Click(object sender, EventArgs e)
{
TextView tv = (sender as TextView);
string mailAddress = tv.Text;
Toast.MakeText(activity.BaseContext, mailAddress, ToastLength.Short).Show();
var email = new Intent(Android.Content.Intent.ActionSend);
email.AddFlags(ActivityFlags.NewTask);
email.SetType("message/rfc822");
email.PutExtra(Android.Content.Intent.ExtraEmail, new string[] { mailAddress });
Application.Context.ApplicationContext.StartActivity(email);
}
}
这里是我的自定义视图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@drawable/CustomSelector">
<ImageView
android:id="@+id/VereadorFoto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:src="@drawable/Icon" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/VereadorNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:paddingTop="5dp" />
<TextView
android:id="@+id/VereadorEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:paddingTop="5dp" />
</LinearLayout>
</LinearLayout>
那么,如何通过单击电子邮件文本来实现发送电子邮件操作的正确方法?
我认为您可能误解了所收到的错误。
当您尝试在 Android 上启动 activity 时,您发送了一个意图,操作系统会尝试以最佳方式响应该意图。如果您将意图设置为具有特定的 activity 子类,那么它将打开您的 activity 子类。但是,如果您将意图设置为具有更通用的内容(例如操作),则将其留给操作系统进行解释。通常,这意味着它将尝试查找已将自己注册为能够处理该操作意图的活动。
在这种情况下,您正在使用 ACTION_SEND 启动 activity 并且操作系统抛出错误,因为它找不到任何已将自己注册为能够处理 ACTION_SEND。通常这意味着您 运行 使用的设备(或模拟器)没有安装电子邮件应用程序。
如果你想先检查操作系统看它是否能找到一个 activity 的意图,你应该使用 resolveActivity(intent) 如果它找不到,它将 return null一.
希望这对您有所帮助。
我在尝试通过使用 Xamarin 单击列表视图中的文本视图字段来发送电子邮件时遇到错误,所有这些都与 activity 无法调用电子邮件 Intent 的实例有关。
我尝试了不同的方法,但都没有成功。 首先,我尝试在 activity 类中调用一个方法(我在适配器中使用了一个方法,但它没有用); 所以我改为尝试调用 textview 单击事件。在 java 中,使用表达式似乎很容易完成:
if (mContext instanceof MyActivity) { methodCall() };
在 C# 中,我尝试使用
if (mContext.GetType() == TypeOf(ListaVereadoresActivity))
但这不起作用,
而且,下面代码中提出的解决方案试图调用 StartActivity(email);
ERROR: Unhandled Exception: Java.Lang.Exception: No Activity found to handle Intent { act=android.intent.action.SEND typ=message/rfc822 flg=0x10000000 (has extras) }
代码示例:
[Activity(Label = "Vereadores")]
public class ListaVereadoresActivity : Activity
{
List<Vereador> listaVer = new List<Vereador>();
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.listaVereadores_layout);
GenerateListaVereadores();
ListView vereadorListView = FindViewById<ListView>(Resource.Id.lstVereadores2);
vereadorListView.ItemClick += OnListItemClick;
VereadorAdapter adapter = new VereadorAdapter(this, listaVer, this.ApplicationContext);
vereadorListView.Adapter = adapter;
}
// 不再使用
public void SendEmail(String emailAdd)
{
var email = new Intent(Android.Content.Intent.ActionSend);
email.SetType("message/rfc822");
email.PutExtra(Android.Content.Intent.ExtraEmail, new string[] { emailAdd });
StartActivity(email);
}
private void GenerateListaVereadores()
{
var azuaite = new Vereador();
azuaite.Nome = "Azuaite";
azuaite.Foto = Resource.Drawable.azuaite;
azuaite.Email = "some@email.address";
listaVer.Add(azuaite);
var aleksander = new Vereador();
aleksander.Nome = "Aleksander";
aleksander.Foto = Resource.Drawable.aleksander;
aleksander.Email = "some@email.address";
listaVer.Add(aleksander);
var dhony = new Vereador();
dhony.Nome = "dhony";
dhony.Foto = Resource.Drawable.dhony;
dhony.Email = "other@email.address";
listaVer.Add(dhony);
}
void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
var listView = sender as ListView;
var t = listaVer[e.Position];
Toast.MakeText(this, t.Nome, ToastLength.Short).Show();
}
我的自定义适配器:
public class VereadorAdapter : BaseAdapter
{
private List<Vereador> vereadorList;
Activity activity;
protected Context mContext;
public VereadorAdapter(Activity act, List<Vereador> v, Context appContext)
{
activity = act;
vereadorList = v;
mContext = appContext;
}
public override int Count
{
get { return vereadorList.Count; }
}
class ViewHolder : Java.Lang.Object
{
public TextView nomeVereadorTxt { get; set; }
public TextView emailVereadorTxt { get; set; }
public ImageView fotoVereadorImg { get; set; }
}
public override Java.Lang.Object GetItem(int position)
{
var vereador = (Vereador)vereadorList[position];
return vereador;
}
public override long GetItemId(int position)
{
return 0;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = vereadorList[position];
ViewHolder holder;
var view = convertView;
if (view != null)
{
holder = view.Tag as ViewHolder;
}
else
{
holder = new ViewHolder();
view = activity.LayoutInflater.Inflate(Resource.Layout.CustomView, parent, false);
holder.nomeVereadorTxt = view.FindViewById<TextView>(Resource.Id.VereadorNome);
holder.fotoVereadorImg = view.FindViewById<ImageView>(Resource.Id.VereadorFoto);
holder.emailVereadorTxt = view.FindViewById<TextView>(Resource.Id.VereadorEmail);
view.Tag = holder;
}
//setar as propriedades dos componentes
holder.emailVereadorTxt.Text = item.Nome;
holder.fotoVereadorImg.SetImageResource(item.Foto);
holder.emailVereadorTxt.Text = item.Email;
holder.emailVereadorTxt.Click += EmailVereadorTxt_Click;
return view;
}
private void EmailVereadorTxt_Click(object sender, EventArgs e)
{
TextView tv = (sender as TextView);
string mailAddress = tv.Text;
Toast.MakeText(activity.BaseContext, mailAddress, ToastLength.Short).Show();
var email = new Intent(Android.Content.Intent.ActionSend);
email.AddFlags(ActivityFlags.NewTask);
email.SetType("message/rfc822");
email.PutExtra(Android.Content.Intent.ExtraEmail, new string[] { mailAddress });
Application.Context.ApplicationContext.StartActivity(email);
}
}
这里是我的自定义视图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="@drawable/CustomSelector">
<ImageView
android:id="@+id/VereadorFoto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:src="@drawable/Icon" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/VereadorNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:paddingTop="5dp" />
<TextView
android:id="@+id/VereadorEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:paddingTop="5dp" />
</LinearLayout>
</LinearLayout>
那么,如何通过单击电子邮件文本来实现发送电子邮件操作的正确方法?
我认为您可能误解了所收到的错误。
当您尝试在 Android 上启动 activity 时,您发送了一个意图,操作系统会尝试以最佳方式响应该意图。如果您将意图设置为具有特定的 activity 子类,那么它将打开您的 activity 子类。但是,如果您将意图设置为具有更通用的内容(例如操作),则将其留给操作系统进行解释。通常,这意味着它将尝试查找已将自己注册为能够处理该操作意图的活动。
在这种情况下,您正在使用 ACTION_SEND 启动 activity 并且操作系统抛出错误,因为它找不到任何已将自己注册为能够处理 ACTION_SEND。通常这意味着您 运行 使用的设备(或模拟器)没有安装电子邮件应用程序。
如果你想先检查操作系统看它是否能找到一个 activity 的意图,你应该使用 resolveActivity(intent) 如果它找不到,它将 return null一.
希望这对您有所帮助。