2017-02-17 7 views
0

Я столкнулся с ошибками, пытаясь отправить электронную почту, щелкнув поле textview внутри списка с помощью Xamarin, все связанные с экземпляром активности, которая не может быть вызвана электронной почтой Intent.отправьте электронное письмо, нажав textview в настраиваемом списке с помощью android Xamarin

Я пробовал разные подходы, но никакого успеха вообще не было. Сначала я попытался вызвать метод внутри класса активности (я использовал метод для этого в адаптере, но он не работал); , поэтому я изменился, чтобы попытаться вызвать событие click для текстового просмотра. В 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 = "[email protected]"; 
     listaVer.Add(azuaite); 

     var aleksander = new Vereador(); 
     aleksander.Nome = "Aleksander"; 
     aleksander.Foto = Resource.Drawable.aleksander; 
     aleksander.Email = "[email protected]"; 
     listaVer.Add(aleksander); 

     var dhony = new Vereador(); 
     dhony.Nome = "dhony"; 
     dhony.Foto = Resource.Drawable.dhony; 
     dhony.Email = "[email protected]"; 
     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> 

Итак, как правильно реализовать посыла по электронной почте, нажав на текст электронной почты?

ответ

0

Я думаю, вы можете неправильно интерпретировать ошибку, которую вы получаете.

При попытке начать работу с Android вы отправляете намерение, и операционная система пытается ответить на это намерение наилучшим образом. Если вы настроили намерение иметь подкласс определенного действия, тогда он откроет ваш подкласс активности. Однако, если вы настроите намерение иметь нечто более общее, например, действие, вы оставите его в интерпретации операционной системы. Обычно это означает, что он попытается найти действия, которые зарекомендовали себя как способные справиться с этим действием.

В этом случае вы начинаете акцию с ACTION_SEND, и операционная система выдает сообщение об ошибке, поскольку не может обнаружить никаких действий, которые зарегистрировались как способные обрабатывать ACTION_SEND. Обычно это означает, что устройство (или эмулятор), на котором вы работаете, не имеет установленного приложения электронной почты.

Если вы хотите сначала проверить операционную систему, чтобы узнать, может ли она найти действие для намерения, вы должны использовать resolveActivity (намерение), которое вернет null, если оно не сможет найти его.

Надеюсь, это поможет.

+0

Hi. Спасибо. исправлено с помощью небольшого изменения: в пользовательском классе адаптера: (активность как ListaVereadoresActivity) .SendEmail (mailAddress); и в связанной с ним деятельности: public void SendEmail (String emailAddress) {//} –

Смежные вопросы