Android 개발 Tip - 5. GestureListener

Mobile Programming/Android Tip 2010. 11. 11. 18:17

더블클릭 입력을 받을때는 어떻게 해야할까 ?

OnTouchEvent로 Down이 발생했을때 타이머를 봐서 몇초안에 다시 눌리면 ...
아아. 생각만해도 현기증난다.

안드로이드는 꽤나 세심하게 더블클릭에 대한 리스너도 만들어 두었다.

바로 GestureListener가 그것.

java 소스에서 GestureDetector.SimpleOnGestureListener 를 상속한 리스너 클래스를 만들고
GestureDetector 형 객체 선언,
해당 객체를 사용한 클래스의 생성자부분에서 new GestureDetector(context,new GestureListener());를 호출해준다.
그 객체의 리스너를 포함한 정보를 제공하는 문장으로 보인다 ^^

이제 GestureDetector를 등록한 해당 클래스에서 더블클릭이 발생했을때 GestureListener클래스로 자동 호출이되고,
그 클래스내의 오버라이딩 함수로 이벤트가 전달된다.

class GestureListener extends GestureDetector.SimpleOnGestureListener{
		
		AnimationDrawable ani;
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            // doubletap이 발생할때 할일.
        }
}


GestureDetector mGesture;
mGesture = new GestureDetector(context,new GestureListener());

if(mGesture.onTouchEvent(event))
      return true;

Android 입문자를 위한 Tutorial - 7. 탭뷰의 이용

Mobile Programming/Android 2010. 11. 10. 18:49

프로젝트하면서 이용했던 탭뷴데 , 다시 정리해둬야 할 것 같아서!

탭뷰는 조금 조잡하다 .
XML에서 탭뷰의 구성요소는 크게 3가지.
<TabHost>, <TabWidget> , <Layout>이다.

TabHost는 Tab을 보유한 레이아웃이며 ,
TabWidget은 흔히들 생각하는 탭,
Layout은 탭에따라 전환되는 "뷰"이다.
보통 전환할 수 있도록 FrameLayout안에 Linear등의 일반 레이아웃을 배치하는 것이 일반적이다.

Java에서 탭뷰 연결방법은 다음과 같다.

1. TabHost를 얻어온다 (findViewById)
2. Host의 setup함수 호출 ( 탭들을 add하기 위한 준비작업 )
3. Host의 newTabSpec을 통해 탭메뉴들을 생성.
4. TabSpec.setIndicater로 탭에 표시될 내용 지정
5. setContent로 XML에서 선언한 전환 뷰 지정
6. Host에 add
7. 3~6을 원하는 탭 메뉴 수만큼 추가
8. setCurrentTab으로 처음 탭뷰 진입했을때의 화면 지정.

탭뷰의 높이 또한 지정 가능하다.
모두 추가한뒤(7)에


for(int tab = 0; tab < tab_host.getTabWidget().getChildCount(); ++tab){
			tab_host.getTabWidget().getChildAt(tab).getLayoutParams().height= 50;
		}

와 같이 for문을 작성하면 해당 height가 변경된다.

다음은 위에서 설명한 과정의 Java 소스 예이다.
TabHost tab_host = (TabHost)findViewById(R.id.tab_host);
		tab_host.setup();
		
		
		TabSpec ts1 = tab_host.newTabSpec("TAB_HOME");
		ts1.setIndicator("home");
		ts1.setContent(R.id.home);
		tab_host.addTab(ts1);



다음은 XML코드의 일부분이다. 

여기서 전환뷰의 아이디로 home이라고 지정했기때문에 setcontent에서 home으로 지정이 가능하다.
;; 사진은 우리 캠퍼스의 상징물. 암튼 탭뷰만을 보실때 실행화면은 다음과 같다.






Android 입문자를 위한 Tutorial - 6. 커스텀 위젯

Mobile Programming/Android 2010. 11. 9. 14:46

위젯을 사용자가 정의하고 이를 사용한다.

package geng.mm.jnu;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;



public class ch9 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

class Editlength extends LinearLayout implements TextWatcher{
	
	EditText mEdit;
	TextView mText;
	
	public Editlength(Context context) {
  	  
		super(context);
		init();
	}
	public Editlength(Context context,AttributeSet attrs) {
	  	  
		super(context,attrs);
		init();
	}
			
	void init() {
  	
		setOrientation(LinearLayout.VERTICAL);
		mEdit = new EditText(getContext());
		mText = new TextView(getContext());
		mText.setText("Now Length : 0 Char");
		
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		
		addView(mEdit,params);
		addView(mText,params);
		mEdit.addTextChangedListener(this);
	}
	
	@Override
	public void afterTextChanged(Editable arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		mText.setText("Now Length : " + s.length() + "Characters");
	}
}

class EditEcho extends LinearLayout implements TextWatcher{

	EditText mEdit;
	TextView mText;
	
	public EditEcho(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		init();
	}
	
	public EditEcho(Context context,AttributeSet attrs) {
	  	  
		super(context,attrs);
		init();
	}

	void init() {
	  	
		setOrientation(LinearLayout.VERTICAL);
		mEdit = new EditText(getContext());
		mText = new TextView(getContext());
		mText.setText("Now Length : 0 Char");
		
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		
		addView(mEdit,params);
		addView(mText,params);
		mEdit.addTextChangedListener(this);
	}

	@Override
	public void afterTextChanged(Editable s) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		mText.setText("Now Length : " + s + "Characters");
	}
	
}

 

외부 클래스로 만들고자 하는 위젯을 만들어야 한다.
본 예제에서의 위젯은 리니어 레이아웃을 기반으로한 텍스트뷰 위젯이므로 먼저 linearlayout을 상속하고, 위젯이 사용해야하는 두 생성자를 사용, 그리고 초기화 함수를 호출하여 위젯을 구성한다.
 두 리니어 레이아웃 모두 텍스트 에디트 + 텍스트뷰이기 때문에 init함수에서 에디트와 텍스트뷰를 add하고 있다.
Text뷰의 변화 감지를위해 addTextChangedLister를 호출하고,
역시 implements 되어있기 때문에 현재 클래스에서 찾을 수 있도록 (this)를 넘겨주었다.