2016-09-24 2 views
0

간단한 Xamarin.Android 모바일 앱에 입력 된 사용자 제공 정보에서 이메일을 작성하여 보내려고합니다 (Gmail 앱 사용). Xamarin.Android를 처음 사용하고 온라인에서이 문제에 대한 명확한 지침을 찾을 수 없었습니다.이메일 본문 텍스트 추가 및 Xamarin.Android App의 이메일 전송

아래 코드를 사용하여 텍스트를 수집하고 사용자 제공 전자 메일 주소 및 하드 코딩 된 제목 줄을 사용하는 전자 메일 인 텐트를 만들 수 있습니다. 그러나 전자 메일에 본문 텍스트를 추가하는 코드가 작동하지 않습니다. Gmail 응용 프로그램이 열리고 전자 메일 주소와 제목은 정확하지만 전자 메일 본문은 비어 있습니다.

[Activity(Label = @"HelloWorld-TestMobileApp", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    public int ClickCount { get; set; } = 0; 
    public string EmailAddress { get; set; } 
    public string EmailText { get; set; } 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     // Get our buttons from the layout resource, 
     // and attach a events to them 
     Button clickIncrementerButton = FindViewById<Button>(Resource.Id.ClickIncrementer); 
     Button sendEmailButton = FindViewById<Button>(Resource.Id.sendEmailButton); 
     EditText enterEmailAddressButton = FindViewById<EditText>(Resource.Id.editEmail); 
     EditText enterEmailTextButton = FindViewById<EditText>(Resource.Id.emailText); 

     clickIncrementerButton.Click += delegate 
     { 
      ClickCount++; 
      clickIncrementerButton.Text = string.Format("{0} clicks!", ClickCount); 
     }; 

     enterEmailAddressButton.TextChanged += delegate 
     { 
      EmailAddress = enterEmailAddressButton.Text; 
     }; 

     enterEmailTextButton.TextChanged += delegate 
     { 
      EmailText = enterEmailTextButton.Text; 
     }; 

     sendEmailButton.Click += delegate 
     { 
      List<string> emailBody = new List<string> 
      { 
       "Hello from Xamarin.Android!\n", 
       "Number of clicks = " + ClickCount + "\n", 
       EmailText 
      }; 

      var email = new Intent(Intent.ActionSend); 

      email.PutExtra(Intent.ExtraEmail, new string[] {EmailAddress}); // Working 09/24/2016 
      email.PutExtra(Intent.ExtraSubject, "Hello World Email");  // Working 09/24/2016 
      email.PutStringArrayListExtra(Intent.ExtraText, emailBody);  // NOT Working 09/24/2016 

      email.SetType("message/rfc822"); 

      try 
      { 
       StartActivity(email); 
      } 
      catch (Android.Content.ActivityNotFoundException ex) 
      { 
       Toast.MakeText(this, "There are no email applications installed.", ToastLength.Short).Show(); 
      } 
     }; 
    } 

는 아무도 내가 미리 포맷하는 방법을 나에게 보여주고 몸 전체의 텍스트 문자열을 하드 코딩없이 이메일 의도에서 전자 메일 본문 텍스트를 포함 할 수 있습니다? (Xamarin.Android 앱에 대한 다른 이메일 전송 비평 및 안내도 환영합니다!)

사용자가 앱에 입력하는 정보를 포함 할 수 있기를 원합니다. 본문 텍스트 (나는 본문 텍스트를 하드 코딩하고 싶지 않다).

감사합니다.

답변

1

문제는 본문이 텍스트 여야한다는 것입니다. 단지에 라인을 변경하여 하나의 문자열로 문자열 목록을 결합 :

email.PutExtra(Intent.ExtraText, string.Join("", emailBody)); 

을 BTW : 당신은 TextViews의 변화에 ​​등록 할 필요가 없습니다. 인 텐트를 열 때 값을 직접 읽을 수 있습니다. 나는이처럼 써서 : 나는 전자 메일 본문을 만들 StringBuilder을 사용하고

[Activity(Label = @"HelloWorld-TestMobileApp", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity2 : Activity 
{ 
    private Button _incrementerButton; 
    private Button _emailButton; 
    private EditText _addressField; 
    private EditText _emailField; 
    public int ClickCount { get; set; } = 0; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     // Get our buttons from the layout resource, 
     // and attach a events to them 
     _incrementerButton = FindViewById<Button>(Resource.Id.ClickIncrementer); 
     _emailButton = FindViewById<Button>(Resource.Id.sendEmailButton); 
     _addressField = FindViewById<EditText>(Resource.Id.editEmail); 
     _emailField = FindViewById<EditText>(Resource.Id.emailText); 
    } 

    protected override void OnStart() 
    { 
     base.OnStart(); 
     // register event handlers 
     _incrementerButton.Click += IncrementerButtonOnClick; 
     _emailButton.Click += SendEmailButtonOnClick; 
    } 

    protected override void OnStop() 
    { 
     //deregister event handlers 
     _emailButton.Click -= SendEmailButtonOnClick;    
     _incrementerButton.Click -= IncrementerButtonOnClick; 
     base.OnStop(); 
    } 

    private void IncrementerButtonOnClick(object sender, EventArgs eventArgs) 
    { 
     ClickCount++; 
     _incrementerButton.Text = string.Format("{0} clicks!", ClickCount); 
    } 

    private void SendEmailButtonOnClick(object sender, EventArgs eventArgs) 
    { 
     // build the body 
     var emailText = new StringBuilder(); 
     emailText.AppendLine("Hello from Xamarin.Android!"); 
     emailText.AppendFormat("Number of clicks = {0}", ClickCount); 
     emailText.AppendLine(); 
     emailText.Append(_emailField.Text); 

     // build the intent 
     var email = new Intent(Intent.ActionSend); 
     email.PutExtra(Intent.ExtraEmail, new string[] { _addressField.Text }); 
     email.PutExtra(Intent.ExtraSubject, "Hello World Email"); 
     email.PutExtra(Intent.ExtraText, emailText.ToString()); 

     email.SetType("message/rfc822"); 

     try 
     { 
      StartActivity(email); 
     } 
     catch (Android.Content.ActivityNotFoundException ex) 
     { 
      Toast.MakeText(this, "There are no email applications installed.", ToastLength.Short).Show(); 
     } 
    } 
} 

. 그리고 익명 대리자 대신 메서드에서 이벤트 처리기를 구현하십시오. 그 이유는 -=을 통해 OnStop에 이벤트 처리기를 등록 취소 할 수 있기를 원하기 때문입니다. 등록 취소 된 이벤트 처리기가 메모리 누수를 유발하지 않기 때문에 항상 중요합니다.

+0

귀하의 제안이 저에게 효과적이었습니다. 메모리 누수를 막기 위해 메서드와 이벤트 핸들러를 사용하는 것에 대한 조언도 감사드립니다. 고맙습니다! – TechAust10