728x90
반응형

저번 글에서 말했듯이 입력한 영어를 숫자로 바꿔 주는 아주쓸데없는 간단한 앱을 만들어 보겠다.

 

미리보기

텍스트 변환, 버튼 입력, 멀티윈도우를 배울 수 있다.

천지인 키보드에 따라 영어를 숫자로 바꾸고 그 숫자를 저장한다.

 

레이아웃

Resources - layout - activity_main.axml 파일을 연다.


툴박스에서 TextView를 추가 후 속성에서 text를 Enter a Phoneword: 로 바꾼다.

 

EditText를 추가 후 속성에서 text를 1-855-XAMARIN으로, id를 @+id/PhoneNumberText로 바꾼다.

추가 할때 방금 추가했던 TextView의 밑에 맞추어 추가한다.

 

같은 방법으로

Button를 추가 후 속성에서 text를 Translate로, id를 @+id/TranslateButton로 바꾼다.

TextView를 추가 후 속성에서 text를 공백문자(스페이스바)로, id를 @+id/TranslatedPhoneNumber로 바꾼다.

 

추가한 것들 모두 layout_width="match_parent"로 만든다.

match_parent는 부모객체(이때는 화면전체)에 맞춘다.

 

레이아웃

 

마지막으로 AndroidManifest.xml의 android:theme를 "@style/Theme.AppCompat"로 바꾼다. (선택)

 

코드 작성

프로젝트에 PhoneTranslator.cs 파일을 추가하고 다음과 같이 작성

using System.Text;
using System;

namespace Core
{
    public static class PhonewordTranslator
    {
        public static string ToNumber(string raw)
        {
            if (string.IsNullOrWhiteSpace(raw))
                return "";
            else
                raw = raw.ToUpperInvariant();

            var newNumber = new StringBuilder();
            foreach(var c in raw)
            {
                if(" -0123456789".Contains(c))
                {
                    newNumber.Append(c);
                }
                else
                {
                    var result = TranslateToNumber(c);
                    if (result != null)
                        newNumber.Append(result);
                }
                //otherwise we've skipped a non-numeric char
            }
            return newNumber.ToString();
        }
        static bool Contains (this string keyString, char c)
        {
            return keyString.IndexOf(c) >= 0;
        }
        static int? TranslateToNumber(char c)
        {
            if ("ABC".Contains(c))
                return 2;
            else if ("DEF".Contains(c))
                return 3;
            else if ("GHI".Contains(c))
                return 4;
            else if ("JKL".Contains(c))
                return 5;
            else if ("MNO".Contains(c))
                return 6;
            else if ("PQRS".Contains(c))
                return 7;
            else if ("TUV".Contains(c))
                return 8;
            else if ("WXYZ".Contains(c))
                return 9;
            return null;
        }
    }
}

MainActivity.cs를 다음과 같이 수정

namespace Phoneword
{
    [Activity(Label = "@string/app_name",  MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        static readonly List<string> phoneNumbers = new List<string>();
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

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

            EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
            TextView translatedPhoneWord = FindViewById<TextView>(Resource.Id.TranslatedPhoneNumber);
            Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);

            //Add code to translate number
            string translatedNumber = string.Empty;
            translateButton.Click += (sender, e) =>
            {
                //Translate user's alphanumeric phone number to numeric
                translatedNumber = Core.PhonewordTranslator.ToNumber(phoneNumberText.Text);
                if(string.IsNullOrWhiteSpace(translatedNumber))
                {
                    translatedPhoneWord.Text = "";
                }
                else
                {
                    translatedPhoneWord.Text = translatedNumber;
                    phoneNumbers.Add(translatedNumber);
                }
            };
        }
    }
}

 

코드 해설

MainActiviy.cs

각각 FindViewById로 컴포넌트를 할당한다

 

변환된 문자열을 담을 변수를 만든다.

 

문자를 숫자로 바꾸고 translatedPhoneWord의 text속성에 추가

(문자를 숫자로 바꾸는 건 PhoneTranslator.cs에서 작성)

 

PhoneTranslator.cs

ToNumber 함수

c라는 문자열에 숫자가 있으면 newNumber에 추가하고 string으로 반환

 

Contains 함수

문자가 들어있는지 확인

 

TranslateToNumber 함수

각각 대응되는 알파벳을 숫자로 변환

 

실행

메뉴의 Andoroid_Accelrated_x86...를 눌러 실행하고 잠시 기다린다.

TRANSLATE 버튼을 누르면 XAMARIN이라는 문자가 9262746이라는 숫자로 변환된 것을 볼 수 있다.

 

멀티윈도우 만들기

activity_main.axml에서 TranslatedPhoneNumber 밑에 Button 추가

id를 @+id/TranslationHistoryButton으로 변경

text를 @string/translationHistory로 변경

 

strigns.xml를 다음과 같이 수정

 

TranslaionHistoryAcitivity.cs 작성

using System;
using System.Collections.Generic;
using Android.App;
using Android.OS;
using Android.Widget;
namespace Phoneword
{
    [Activity(Label = "@string/translationHistory")]
    public class TranslationHistoryActivity : ListActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            // Create your application here
            var phoneNumbers = Intent.Extras.GetStringArrayList("phone_numbers") ?? new string[0];
            this.ListAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, phoneNumbers);
        }
    }
}

 

MainActivity.cs 수정

Button translationHistoryButton = FindViewById<Button>(Resource.Id.TranslationHistoryButton) 추가

translateButton 이벤트 수정

translateButton.Click += (sender, e) =>
{
  //Translate user's alphanumeric phone number to numeric
  translatedNumber = Core.PhonewordTranslator.ToNumber(phoneNumberText.Text);
  if(string.IsNullOrWhiteSpace(translatedNumber))
  {
    translatedPhoneWord.Text = "";
  }
  else
  {
    translatedPhoneWord.Text = translatedNumber;
    phoneNumbers.Add(translatedNumber);
    translationHistoryButton.Enabled = true;
  }
};

 

버튼 클릭 이벤트 추가 

translationHistoryButton.Click += (sender, e) =>
{
    var intent = new Intent(this, typeof(TranslationHistoryActivity));
    intent.PutStringArrayListExtra("phone_numbers", phoneNumbers);
    StartActivity(intent);
};

 

실행

같은 방법으로 메뉴의 Andoroid_Accelrated_x86...를 눌러 실행하고 잠시 기다린다.

Transate 버튼을 누르고 TranslationHistory 버튼이 활성화되고

버튼을 누르면 화면이 전환되면서 전에 변환했던 숫자들이 나온다.

 

 

다음에는 본격적으로 헬테이커 앱을 만들어보자.

'작업일지 > Xamarin' 카테고리의 다른 글

Xamarin 공부하기(1) - 설치 및 둘러보기  (0) 2020.07.11