후아아, Android 개발하는데 이 그림정도는 환벽히 머리속에 넣고 있어야 하지,

onPause와 onStop의 의 혼동으로 잠깐 삽질.

GOAL 
  • ListActivity 에서 ContextMenu를 띄운다.
  • ContextMenuItem을 선택하여 특정 Position의 ListViewItem에 대한 작업을 수행한다.
Try 1.

ListView를 ContextMenu에 등록하여, LongClick Event발생시 ContextMenu를 띄우게 한다.registerForContextMenu(getListView());  

Result : Failed

이방법은 LongClick을 받은 Item Position을 알아낼 방법이 없다.
( 아시는 분 손좀? ^^ )

Try 2.


ListView setOnItemLongClickEventListener() 에서, 
openContextMenu(view) 를 통해서 ContextMenu를 Open 하고, 그 View를 이용해 Position을 가져 온다. 

Result : Failed

openContextMenu의 파라미터가 되기 위해서는 registerContextMenu를 통해서 registering을 해야 하는데,
Adapter에서 View를 만들때 register를 한다고 해도, unregister를 해야 하는 시점이 불분명하고,
비직관적이다. 

Try 3.
 

registerForContextMenu(getListViewI()) 를 통해 ListView의 ContextMenu를 Open
getListView().setOnItemLongClickListener를 등록하여, Last Long Clicked Position을 저장
ContextMenuItemSelected가 호출 될때 저장된 Position을 사용하여 Task 수행

Result : Success


그래도 뭔가 찜찜하다. 뭔가 좋은 방법이 있을것 같은데.. 아시는 분 없나요? ㅎㅎ



 

CursorAdapter adapter = (CursorAdapter) getListAdapter();

adapter.getCursor().requery();

adapter.notifyDataSetChanged();


CursorAdapter를 가져와서
거기에서 다시 Cursor를 가지고 오고 requery();

그리고 adapter에 notifyDataSetChanged() 해주면 된다.  

난 또 순진했을 뿐이고 :(

 ClickListener 같은 경우 setOnClickListener를 사용하기 때문에, 당연히 난 setTextBlahBlah가 있을줄 알았는데, 
그런게 없어서,

setKeyListener를 사용해봤는데, SoftKey를 잡지 못하고, Hardware Key만 잡았다.

아 이런게 없을 수 있나 싶었는데.. :(

addTextChangedListener가 존재 했다.. 

public void addTextChangedListener (TextWatcher watcher)


mDialogEditText.addTextChangedListener(new TextWatcher() {

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

Log.d(TAG,"Count = " + count);

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count,

int after) {

}

@Override

public void afterTextChanged(Editable s) {

}

});

 

위와 같이, before, changed, after 등의 event를 detecting 할 수 있다. 


 

Interface Builder에서 Custom Class 를 사용할때, Unknown Class Error가 발생할 때,

 
이 문제가 발생하는 원인은, Objective-C에서 정적 library를 사용의 고질적인 문제 인데,

static library가 RunTime에 제대로 로드 되지 않아서 이다.

실제로 코드 상의 문제가 있다기 보다는 Objective-C 자체 버그 인 셈이다.

이 문제를 해결하기 위해선

Other Linker Flags , -all_load를 해주면 해결이 된다.

이러면 어플리케이션이 Load될때, Dependency 가 걸려 있는 모든 Static Library를 강제로 로드 한다.
이것말고도 Static Library에서의 Category 등 Side-Effect가 꽤 많다.

이것좀 고쳐 달라고 Apple님들아 :(

 

ListView Background  세팅하기.

이게 Blog에 포스팅 할 꺼리가 될까? android:background 세팅 해주면 끝이 아닌가?

나도 그러길 기대했지만, 이것 때문에 꽤나 고생했습니다 :(


위의 스크린샷은 ListView에 android:background="#777777" 로 회색으로 줬습니다.
잘 나옵니다. 그런데, Drag를 하면 아래와 같이 검은 색으로 바뀌어 버립니다. 



이것 참 난감한일이 아닐수가 없습니다. 실제로 Scrolling이 되지 않는 뷰임에도 불구 하고, 
Dragging을 하면 검은색으로 바뀌어 버립니다. 다시 터치를 해주면 원래대로 들어옵니다.

그 이유는 바로 여기 있습니다.


android:cacheColorHint가 black으로 되어 있기 때문인데요, 

Scrolling (혹은 Drag)가 일어 나면, 성능 최적화를 위해 저 ColorHint를 사용하는데, 
Drag시에 검은색으로 노출 되는것이 cacheColorHint값과 동일 한것이지요. 

해당 값을 background와 동일하게 세팅해주면, Drag에 색이 변하는 문제가 해결됩니다.

후.. 안드로이드 아직 수련이 많이 부족한가 봅니다 ㅎㅎ


iOS Device( iPod Touch, iPhone, iPad 등등)  외부 출력 Accessory를 찾아 봤는데, 
위의 2종이 있습니다.

개인적으로 D-Sub를 선호 하는데,  D-sub는 iPhon4 와 iPad만 된답니다.
애플의 이런 정책은 정말 맘에 안드는데, D-sub가 최소한 iPhone 3GS 라도 지원해야 하는 거 아닌가 싶습니다 ;ㅂ;

개발 토이로 하나 들여야 하는데, 뭘로 살까 고민이 심하군요 ;ㅂ; 둘다 사긴 그렇고;;







SVN Commit시에 귀찮아서, 로그 메세지를 누락하는 경우가 있는데,  
이럴 경우 나중에 로그를 뒤져야 할때 난처한 일이 생긴다.

이런일을 프로그래밍 적으로 방지 하기 위해서 Commit 로그를 강제 할 수 있다. 

SVN 자체내부적으로 특정 Event 시점에 Hooking하여 Script를 실행할 수 있는 구조로 되어 있기 떄문에, 이를 이용하면 쉽게 할 수 있다. 

{svn_repo_root}/ 폴더에 들어 가면 hooks라는 폴더가 있는데, 폴더의 내용은 아래와 같다. 


이들은 현재 .tmpl 이 붙어 있는 것들은 현재 실행되는 Script가 아니라, Template정도라면 생각하면 된다.

우리가 할 일은 Commit 전의 Log Checking임으로 pre-commit.tmpl 을 이용하면 된다.

Step 1 . cp pre-commit.tmpl commit.tmpl

Step 2 . Check script file

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" |   grep "[a-zA-Z0-9]" > /dev/null || exit 1

위와 같이 Script를 작성해주면  Commit전에 이 스크립트를 실행하여 Filtering한다. 

SnowLeopard에는 미리 정의 되어 있다. 



오늘 제가 해볼 것은 Preference Category를 Customizing 해보는것입니다. 
우선 결과 부터 보여드리면, 


이런식으로 Category Title을 변경해보는것이죠.

위와 같은 Layout의 Preference XML은 아래와 같습니다. 

<?xml version="1.0" encoding="utf-8"?>


<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"

        android:title="@string/app_name">

    <PreferenceCategory

    android:title="@string/category_name">

    <Preference android:key="app_name"

        android:persistent="false"

        android:title="@string/app_name"

    />

    </PreferenceCategory>  

</PreferenceScreen>


PreferenceScreen에 PreferenceCategory를 추가하고, 
PreferenceCategory에 Preference Item이 하나 있는 형태 이지요, 

여기서, PreferenceCategory의 Layout을 Customizing하는게 목적입니다.

Preference Item의 Layout을 변경할때 사용하는것은,  android:layout 속성을 정의 하는것입니다. 


android:layout="@layout/my_preference_category" 뭐 이런식으로 추가 해주는것지요 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="horizontal"

  android:layout_width="fill_parent"

  android:layout_height="25dip"

  android:gravity="center_vertical"

  android:paddingLeft="5dip"

  android:background="#323331">

  

  <ImageView 

  android:layout_width="wrap_content"

  android:layout_height="fill_parent"

  android:src="@android:drawable/ic_menu_info_details"/>

  <TextView

  android:textStyle="bold"

  android:id="@android:id/title"

  android:layout_width="wrap_content"

  android:layout_height="fill_parent" 

  android:text="test"

  android:gravity="center"

  android:textColor="#FF0000"

  />

  

</LinearLayout>


여기서 부터, 안드로이드 개발의 짜증나는 점이 나타나는데, 
PreferenceCategory에서 지정한 title 값과, 내가 만든 Layout의 TextView가 연결되어야 하는데, 
id값을 어떻게 지정해주어야 한다는 정보가, developer.android.com을 아무리 뒤져 봐도 없습니다.

결국 Android Source코드를 보고 나서야 
@android:id/title로 줘야 한다는걸 알게 되었고,  이렇게 해주고 나니 정상적으로  동작합니다.

android:layout은 PreferenceCategory의 XML Attribute가 아니라, Preference 아이템 클래스들의 최상위 클래스인 Preference Class의 
XML Attribute입니다. 

즉, PreferenceCategory뿐 아니라, CheckBoxPreference 등등 모든 Preference들을 이와 같은 원리로 Customizing할 수 있습니다. 

이 방법은 AppStore에서는 확인해보지 않았습니다. 

1. InfoPlist.string 파일 추가

info.plist 파일을 Localizing해야 할것이라고, 최초에 생각하였지만, 그게 아니었습니다.
info.plist 파일에서 localize 된 값을 위해서는,  NSLocalizedString에서 사용하듯이, InfoPlist.strings파일을 추가 해야 합니다. 




2. Localize 


3. 앱 이름 지정하기 

Info.plist파일에서 AppName을 결정하는것은 "CFBundleDisplayName" 입니다. 

위와 같이 적절하게 값을 채워주고 앱을 실행하면 됩니다 ! ^^

+ Recent posts