2017-02-17 1 views
0

Ich stehe vor Fehler beim Versenden von E-Mails durch Klicken auf ein Textfeld in einem Listenansicht mit Xamarin, alle im Zusammenhang mit der Instanz der Aktivität nicht verfügbar, um die E-Mail-Absicht aufrufen.senden Sie E-Mail durch Klicken auf Textansicht in angepasster Listenansicht mit Android Xamarin

Ich habe verschiedene Ansätze ausprobiert, aber keinen Erfolg. zuerst Ich habe versucht, eine Methode innerhalb der Aktivität Clas aufzurufen (ich habe eine Methode dafür in Adapter verwendet, aber es hat nicht funktioniert); Ich habe also geändert, um das Click-Ereignis von textview aufzurufen. In Java scheint es leicht mit dem Ausdruck getan:

if (mContext instanceof MyActivity) { methodCall() }; 

in C#, habe ich versucht,

if (mContext.GetType() == TypeOf(ListaVereadoresActivity)) 

zu verwenden, aber das funktioniert nicht, Und auch die vorgestellte Lösung in Code unten, versucht, die 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) }

Codebeispiele zu nennen:

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

// Verwendung nicht mehr

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

meinen benutzerdefinierten Adapter:

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

hier meine benutzerdefinierte Ansicht:

<?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> 

Also, wie ist der richtige Weg, um eine Sende zu implementieren E-Mail-Aktion durch Klicken auf den E-Mail-Text?

Antwort

0

Ich denke, Sie könnten den Fehler, den Sie bekommen, falsch interpretieren.

Wenn Sie versuchen, eine Aktivität unter Android zu starten, senden Sie eine Absicht, und das Betriebssystem versucht, auf diese Absicht so gut wie möglich zu reagieren. Wenn Sie die Absicht festlegen, eine bestimmte Aktivitätsunterklasse zu berücksichtigen, wird Ihre Aktivitätsunterklasse geöffnet. Wenn Sie jedoch beabsichtigen, etwas allgemeineres wie eine Aktion zu verwenden, überlassen Sie es der Interpretation des Betriebssystems. Normalerweise bedeutet das, dass es versuchen wird, Aktivitäten zu finden, die sich selbst registriert haben, um mit dieser Aktionsabsicht umgehen zu können.

In diesem Fall starten Sie eine Aktivität mit ACTION_SEND, und das Betriebssystem gibt einen Fehler aus, da es keine Aktivitäten finden kann, die sich selbst als ACTION_SEND-Benutzer registriert haben. Normalerweise bedeutet dies, dass auf dem Gerät (oder Emulator), auf dem Sie arbeiten, keine E-Mail-App installiert ist.

Wenn Sie zuerst mit dem Betriebssystem überprüfen möchten, ob es eine Aktivität für eine Absicht finden kann, sollten Sie resolveActivity (intent) verwenden, die null zurückgibt, wenn sie keine finden kann.

Hoffe, das hilft.

+0

Hallo. Danke. habe es durch eine kleine Änderung behoben: in der benutzerdefinierten Adapterklasse: (Aktivität als ListaVereadoresActivity) .SendEmail (mailAddress); und in der zugehörigen Aktivität: public void SendEmail (String emailAddress) {//} –

Verwandte Themen