Android2010. 8. 9. 11:30

GridView에 View를 생성하여 넣으면 GridView가 보여질때 상하좌우에 여백이 있는 것을 보실수 있습니다.


이렇게 GridView의 background에 white color를 지정하여 보면 white color의 여백이 남는 것을 볼수 있습니다.
이 여백을 없에기 위해 margin이나 padding을 아무리 주어도 없어지지 않는데요 여백을 없에기 위해서 몇일을 찾아 본 결과 list selector에 padding이 지정되어 있어서 여백이 생기게 된다는 것을 알게 되었습니다.

혹시나 저 같이 GridView에 여백을 없에기위해 고민하시는 분을위해 여백을 없에는 방법을 공유합니다.
방법은 GridView에 listSelector에 있습니다.

GridView는 AbsListVIew를 상속받게 되어 있는데요 이 AbsListView에 기본으로 지정되어 있는 listSeletor에 padding이 들어가 있어서 GridView에 여백이 생기게 됩니다.
GridView에 여백을 없에기 위해서는 GridView에 listSelector속성에 padding을 제거한 selector를 지정하면 됩니다.

padding을 제거하기 위한 selector xml의 소스 입니다.

 <selector xmlns:android="http://schemas.android.com/apk/res/android"
 android:variablePadding="false">  
</selector>
위의 소스를 list_selector.xml로 저장하여 drawable 폴더에 넣으신 후
GridVIew의 listSelector 속성에 위에 XML을 지정하시면 됩니다.
http://developer.android.com/guide/topics/resources/drawable-resource.html 의 XMLBitmap 부분을 참조하시면 selector를 xml로 설정하는 것에 대한 설명이 나와있습니다.

GridView에 listSelcotr속성을 적용한 소스 입니다.
 <GridView
      android:id="@+id/anim_grid"   
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:stretchMode="columnWidth"
      android:listSelector="@drawable/list_selector"
      android:background="#ffff" />

이렇게 적용하여서 실제로 보게되면 여백이 없어지는 것을 확인할 수 있습니다.


안드로이드의 가장 좋은 공부방법은 풀소스 분석과 Developer 사이트의 Guide를 보는것과 Reference를 꾸준히 익히는 것이라고 생각되네요
-----------------------------------------------------------------------------------------------------------------

추가로 안드로이드 api를 직접 호출하여 여백을 없에는 방법입니다. (진작 올렸어야되었는데 많이 늦었네요.. ㅜ.ㅜ)

gridView.setSelector(new StateListDrawable()); 

GridView의 setSelector를 호출하시면 쉽게 여백을 제거 할수 있습니다.

Posted by 위푸
Android2010. 1. 3. 15:25
Android API에서는 데이터 베이스의 데이터 값이 변경되었을경우 Notifications을 제공해주는 ContentObserver라는 API를 제공하여 줍니다.  

- 사용법 예제 소스입니다.

public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");

// 해당 데이터베이스의 데이터값이 변경시에 onChange() method가 호출됩니다.
private ContentObserver bookmarksObserver = new ContentObserver(new Handler()) {
     @Override
     public void onChange(boolean selfChange) {
          super.onChange(selfChange);
          Log.d("Boookmarks", "onChanged : " + selfChange);
     }
};

// ContentObserver에 해당 데이터 베이스의 URI를 등록합니다.
private BookmarksManager(Context context) { 
     this.context = context;
     this.contentResolver = context.getContentResolver();
     contentResolver.registerContentObserver(BOOKMARKS_URI, true, bookmarksObserver );
}

// 해당 Manager Class가 소멸될경우 꼭 ContentObserver에서 해제 시켜주어야 합니다
public static void destroy() {
     if (instance != null && instance.contentResolver != null && instance.bookmarksObserver != null) {
          instance.contentResolver.unregisterContentObserver(instance.bookmarksObserver);
     }
     instance = null;
}
Posted by 위푸