본문 바로가기

프로그래밍/Android 짜투리 지식

[android] FragmentActivity - Fragment 에 하드웨어 키 리스너 가져오기

2015. 03. 12 추가.

이 문제에 대해.. 최근 ADT, android studio에서는 Fragment를 생성하면 CallbackListener를 필수로 생성해준다. 때문에 아래같은 고민은 덜 수 있다. 물론 직접 class 생성하고 Fragment를 생성하면 아래와 같은 고민이 필요하다.

최근 TabActivity에서 FragmentActivity의 사용이 빈번해졌다.

이유는 Honeycomb의 탄생으로,, 생략


그런데 여기서 속썩이는 문제가 있다.

FragmentActivity에서도 TabHost를 사용할 수 있다. 그리고 그 각각의 탭을 가질 수 있는데, (물론 이건 허니콤 이전에도 발생했다.) 하드웨어키가 안먹는다는 것이다.

그럼 각각의 탭에서 발생한 클릭이벤트는 어떻게 처리해줘야하지?

죄다 FragmentActivity를 가진 class에서 처리를 해줘야하나?

처음엔 그랬다. 코드가 아주 지저분하더라.

그래서 생각해봤다.

각각의 Fragment에서 발생한 이벤트는 여기서 처리해주자.

물론 Fragment내에서 view에 발생한 이벤트는 처리가 가능하다. 하지만 back key에 대해선 작동하지 않는 문제가 있었기 때분에,,

그런데 또 문제가 있었다. 어떻게 리스너를 전달해 주지?

TabHost를 사용해보면 알겠지만 각 tab은 (1. 새로운 activity, 2. view) 로 생성된다.

어떻게 전달하지? 그래서 생각한게 static getter/setter


좋지 않은 방법일 것 같은 느낌이 든다. 하지만 어쩔수 없다. 지금 내수준에서는 이게 최선이다.


요약하자면,

문제 : 서로 연관성이 없는 class 끼리의 리스너 전달

해결 : static getter/setter 로 리스너 전달.


FragmentActivity

임의의 클래스를 만들어 static getter/setter를 만들어 리스너를 전달했다.




# fragment.class

MainFragmentKeyEventHolder.setOrgObject(this);



#FragmentActivity.class

MainFragmentKeyEventHolder.MainFragmentKeyListener keyListener = MainFragmentKeyEventHolder.getListener();

keyListener.onKeyInFragment(keyCode, event);


# MainFragmentKeyEventHolder.class // listener

public class MainFragmentKeyEventHolder {

	private static MainFragmentKeyListener listener;

	public interface MainFragmentKeyListener extends OnKeyListener{

		public boolean onKeyInFragment(int keyCode, KeyEvent event);

//		@Override
//		public boolean onKey(View v, int keyCode, KeyEvent event);
	}

	public static void setOrgObject(MainFragmentKeyListener org) {

		listener = org;
	}

	public static MainFragmentKeyListener getListener() {
		return listener;
	}
}