리플렉션(Reflection)을 활용한 안드로이드 위젯 매핑(Mapping) 간소화 하기(1)

1. 리플렉션(Reflection)을 활용한 안드로이드 위젯 매핑(Mapping) 간소화 하기(1)
2. 리플렉션(Reflection)을 활용한 안드로이드 위젯 매핑(Mapping) 간소화 하기(2)

안드로이드 어플을 만들다보면 안드로이드 위젯(Widget)을 매핑하는 코드를 작성합니다.
위젯이 3~4개 정도면 쉽게 작성할 수 있지만 복잡한 액티비티(Activity)의 경우는 십여개가 넘는 위젯이 존재하고 아래와 같은 코드의 반복이 일어납니다.
자바의 리플렉션을 활용하면 아래의 코드를 간소화 할 수 있습니다.

EditText trackEditText = (EditText) findViewById(R.id.title);
EditText artistEditText = (EditText) findViewById(R.id.artist);
EditText albumEditText = (EditText) findViewById(R.id.album);
TextView pathTextView = (TextView) findViewById(R.id.path);

리플렉션을 활용하여 자바 객체의 필드를 모두 가져온 후 activity.getResources().getIdentifier(identifierString, “id”, activity.getPackageName()) 메소드를 활용하여 R.java 에 정의된 id 값을 추출 후 이 값으로 다시 findViewById 메소드로 View를 다시 조회하여 해당 객체를 필드에 값을 주입(Injection)하는 단계를 거칩니다.

이 방법의 전제는 위젯의 id 값과 필드의 이름이 일치한다는 규칙을 정한 것이여서 사용하려면 유의해야 합니다. 하단의 XML의 id값과 필드명을 유심히 살펴보세요~

src/org/softwaregeeks/needletagger/Editor.java

private EditText trackEditText;
private EditText artistEditText;
private EditText albumEditText;
private TextView pathTextView;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.editor);
  UIHelper.mappingViews(this);
}

res/layout/editor.xml

<?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">
  <EditText android:id="@+id/trackEditText"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" />
  <EditText android:id="@+id/artistEditText"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" />
  <EditText android:id="@+id/albumEditText"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" />
  <TextView android:id="@+id/pathTextView"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" />
</LinearLayout>

실제 리플렉션을 활용하여 매핑하는 메소드는 다음과 같습니다. 그럼 도움이 되셨길 바랍니다~😀

org/softwaregeeks/framework/android/util/UIHelper.java

package org.softwaregeeks.framework.android.util;

import java.lang.reflect.Field;

import android.app.Activity;
import android.view.View;
import android.widget.TextView;

public class UIHelper
{
  public static void mappingViews(Object object)
  {
    if( !(object instanceof Activity) )
      return;
    
    Activity activity = (Activity)object;
    Field[] fields = activity.getClass().getDeclaredFields();
    for (Field field : fields)
    {
      String identifierString = field.getName();
      int identifier = activity.getResources().getIdentifier(identifierString, "id", activity.getPackageName());
      if( identifier == 0 )
        continue;
      
      View findedView = activity.findViewById(identifier);
      if( findedView == null )
        continue;
      
      if( findedView.getClass() == field.getType() ) {
        try
        {
          field.setAccessible(true);
              field.set(object, findedView);
        }
        catch (IllegalArgumentException e)
        {
          e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
          e.printStackTrace();
        }
      }
    }
  }
}

실제로 어떻게 적용하는지 눈으로 보고 싶으신 분들을 위해서 스크린 캐스트를 제공합니다.

리플렉션(Reflection)을 활용한 안드로이드 위젯 매핑(Mapping) 간소화 하기(1)”에 대한 2개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중