저번 글에서 말했듯이 입력한 영어를 숫자로 바꿔 주는 아주쓸데없는 간단한 앱을 만들어 보겠다.
미리보기
텍스트 변환, 버튼 입력, 멀티윈도우를 배울 수 있다.
천지인 키보드에 따라 영어를 숫자로 바꾸고 그 숫자를 저장한다.
레이아웃
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 |
---|