jQuery UI를 이용한 대화상자(Dialog) 표시하기

jQuery 라이브러리를 이용한 UI, 즉 jQuery UI에는 기본적인 Button에서부터 Accordion까지 다양한 UI를 제공합니다. 그 중 대화상자(Dialog)에 대해 살펴 보도록 하겠습니다.

흐름은 3가지입니다. 첫째는 Dialog의 기능을 담을 DIV를 선언하고, 두번째는 jQuery와 jQuery UI에 대한 자바스크립트 라이브러리를 추가하고, 세번째는 앞서 선언한 DIV에 대해 dialog() 함수를 호출해 주는 것이 기본적인 내용의 전부입니다.

아래는 jQuery UI를 이용한 다이얼로그에 대한 화면입니다.

위의 화면을 구성하기 위한 전체 코드는 아래와 같습니다.




    
    jQuery UI - DialogBox

    
    
    
    

    


    

Message

앞서 언급한 세가지 흐름에 해당하는 코드는, 첫째인 Dialog의 기능을 담을 DIV를 선언은 20번, 두번째로 jQuery와 jQuery UI에 대한 자바스크립트 라이브러리를 추가는 10번과 11번, 세번째인 앞서 선언한 DIV에 대해 dialog() 함수를 호출해 주는 것은 15번입니다.

jQuery UI는 자바스크립트와 HTML 테그를 이용하여 매우 직관적이고 간단하게 원하는 UI로써의 기능(생명력)을 불어 넣을 수 있는 좋은 라이브러리라고 생각됩니다.

[Android] Spinner 또는 ListView에 Adapter 지정 후 바로 setSelection 호출 제대로 하기

제목도 참 길어 거시기 합니다. 안드로이드에서 Spinner나 ListView에 항목에 대한 목록을 지정하기 위해서는 Adapter 객체를 생성 및 구성해서 setAdapter 함수를 호출하여 지정합니다. 이렇게 지정하고 난 뒤에 바로 n번째 항목을 선택하도록 setSelection(n-1)과 같은 함수를 호출하게 됩니다. 예를 들어 아래와 같은 코드처럼 말입니다.

Spinner spRi = (Spinner)findViewById(R.id.spRi);
ArrayAdapter adp = new ArrayAdapter( ... );

...

spRi.setAdapter(adpr);

int n = ...;

...

spRi.setSelection(n-1);

그러나 이렇게 하면 n번째 항목은 선택되지 않고 항상 첫번째 항목이 선택되어 있습니다. 사용자 인터페이스(UI)에 대한 표현은 다른 연산보다 가장 나중에 처리되는 OS 정책 때문인데요. 이럴때는 아래와 같은 코드로 대신해야 합니다.

Spinner spRi = (Spinner)findViewById(R.id.spRi);
ArrayAdapter adp = new ArrayAdapter( ... );

...

spRi.setAdapter(adpr);

new Handler().postDelayed(new Runnable() {        
    public void run() {
        int n = ...;

        ...

        spRi.setSelection(n-1);
    }
}, 100);

즉, UI의 표현이 될때까지 기다렸다가 n-1 번째 항목을 선택하라는 것인데요.. 기다린다는 것이 100ms라는 애매한 시간으로 지정했다는 것이 걸리지만 잘 작동합니다. 않되면 이 애매한 시간을 더 늘려주세요. 개인적으로 Delay나 Sleep와 같은 기능을 하는 함수 호출을 싫어하지만… 근데 어디선가 지금 바로 UI를 업데이트 하라는 함수를 본 것 같은데 기억이 않난단 말입니다. 메모를 해 뒀어야 했는데 말입니다.

[Android] ListView의 선택 항목에 대한 하이라이팅(Hilighting) 또는 배경색 변경

안드로이드에서 ListView 위젯에 데이터 목록을 표시하고 사용자가 데이터 항목을 터치하면 어떤 항목이 터치가 되었는지에 대한 피드백이 있어야 합니다. 그러나 안드로이드에서는 기본적으로 이러한 피드백을 제공해 주지 않습니다. 이러한 피드백을 제공해주기 위한 절차입니다. 아래는 사용자가 항목을 터치했을 때 앞서 언급한 피드백에 대한 효과에 대한 이미지입니다.

먼저 ListView가 아래처럼 정의되어 있습니다. 항목 선택에 대한 피드백을 위해 특별히 해준 것은 없습니다.

...



...

ListView는 채워질 항목을 위한 레이아웃을 정의하게 되는데요. 이 레이아웃의 배경을 Selector로 지정하는게 키포인트입니다. 바로 아래처럼 말입니다.



    


위의 코드에서 중요한 것은 바로 3번 코드입니다. background를 selector_listview_item으로 지정하고 있는데, 이 selector_listview_item에 대한 XML 코드는 아래와 같습니다.


    
    

위의 코드에서 중요한 부분은 4번과 5번인데요. 5번에서 항목에 대한 상태가 만족될 경우, 즉 state_pressed가 참(true)일 경우에 4번 코드에서 지정한 Drawable를 이용해 그리라는 것입니다. 4번 코드에서 지정한 drawable인 ItemSelectedColor는 color.xml에 다음처럼 정의되어 있습니다.



    #8EE2FB

위의 코드 중 3번에서 지정한 웹 컬러 표현값인 #8EE2FB로 지정됩니다.

항목 선택하면 사용자에게 피드백을 주는 것이 당연한데, 안드로이드는 그렇지 않다는 점.. 분명히, 상당히 불편한 것이 틀림없지만.. 기능에 대한 넓은 확장성과 높은 응용성을 위해 이러한 방식을 취했다.. 생각합니다.

[C#] 관리자 권한으로 실행하기

관리자 권한이 없는 상태에서 시스템의 정보를 읽거나 쓰려고 할때 프로그램이 올바르게 작동하지 않습니다. 이럴때 프로그램이 실행되면서, 관리자 권한으로 상승시키는 것이 필요한데요. C#에서 이러한 내용에 대한 코드를 정리합니다. 모든 코드는 Program.cs에서 이루어집니다. 먼저 using 절에 다음과 같은 네임스페이스를 추가합니다.

using System.Security.Principal;
using System.Diagnostics;

그리고 현재 관리자 권한 상태인지의 여부를 파악하는 함수를 추가합니다.

public static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();

    if (null != identity)
    {
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }

    return false;
}

Program.cs 파일의 Main 함수의 시작 부분에 다음의 코드를 추가합니다.

if (IsAdministrator() == false)
{
    try
    {
        ProcessStartInfo procInfo = new ProcessStartInfo();
        procInfo.UseShellExecute = true;
        procInfo.FileName = Application.ExecutablePath;
        procInfo.WorkingDirectory = Environment.CurrentDirectory;
        procInfo.Verb = "runas";
        Process.Start(procInfo);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString());
    }

    return;
}

[C#] Text 파일 쓰기

C#에서 텍스트에 대한 인코딩을 지정하면서 텍스트 파일을 생성하고 텍스트를 기록하는 코드에 대해 정리해 봅니다.

using (System.IO.StreamWriter file = 
    new System.IO.StreamWriter(
        GeodataFileName, false, Encoding.GetEncoding("EUC-KR")))
{
    file.WriteLine("안녕하세요.");
}

위의 코드는 인코딩을 EUC-KR로 하기 위해 StreamWriter의 생성자에의 세번째 인자에 인코딩 정보를 전달했으며 두번째 인자를 false로 하여 텍스트 파일이 새롭게 생성되도록 하고 있습니다. 만약 두번째 인자를 true로 지정하면 기존의 파일에 텍스트 값을 덧붙여(Append) 기록하게 됩니다.