티스토리 뷰




 < 개발 환경 >  
   작성일 : 2013.01.17
   OS 설치 버전 : Windows7 32bit  
   SDK 설치 버전 : 안드로이드 SDK 4.2 (젤리빈) / API LEVEL : 17  
   ADT 설치 버전 : 21   
   Java 설치 버전 : JDK 1.6.0_20 / JRE6 
   이클립스 설치 버전 : Indigo
   테스트단말 : 삼성 갤럭시 S2 4.0.4 (아이스크램 샌드위치)   

 < 프로젝트 적용 > 
   API LEVEL : 8  
   minSdkVersion : 8 
   targetSdkVersion : 8  
   Java Compiler Level : 1.6  
   Text file encoding : UTF-8






안드로이드/Android 가려진 View를 최상위로 끌어 올리자~!





안드로이드 프로젝트를 진행하다 보면 여러개를 View와 ViewGroup을 사용해서 개발을 진행하게 됩니다. 그렇게 되면 View와 ViewGroup 또는 View와 View등 서로 이벤트를 받아야 하는 View들이 엉키게 됩니다.


심지어 사이즈가 큰 View에 의해 이벤트를 받아야할 작은 View가 가려지기도 하는데요 이럴 경우를 대비해서 아래의 있는 View를 최상위로 끌어 올리는 메서드가 있습니다. 바로 View가 제공하는 bringToFront() 메서드를 사용 하시면 됩니다.


View.bringToFront() ;


자 그럼 간단한 예제와 함께 사용법에 대해 살펴 보겠습니다.


package arabiannight.tistory.com.bringtofront;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity {

	boolean isFocus = false;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		setLayout();
		
	}
	
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_focus_changer:
			
			if (!isFocus) { 
				mFocus.setText("Focus is Button!!");
				mClick.bringToFront(); 
				
				isFocus = true;
				
			} else {
				mFocus.setText("Focus is LinearLayout!!");
				mLayout.bringToFront();
				
				isFocus = false;
			}
			
			setViewInvalidate(mClick, mLayout);
			
			break;
			
		case R.id.btn_click:
			
			Toast.makeText(MainActivity.this, "Button 클릭!!", Toast.LENGTH_SHORT).show();
			
			break;
			
		case R.id.ll_layout:
			
			Toast.makeText(MainActivity.this, "Layout 클릭!!", Toast.LENGTH_SHORT).show();
			
			break;

		default:
			break;
		}
	}
	
	/**
	 * View를 다시 그려 준다.
	 * @param views
	 */
	private void setViewInvalidate(View... views) {
		
		for (View v : views) {
			v.invalidate();
		}
		
	}
	
	/**
	 * Layout
	 */
	private Button mFocus = null;
	private Button mClick = null;
	private LinearLayout mLayout = null;
	
	private void setLayout() {
		mFocus = (Button) findViewById(R.id.btn_focus_changer);
		mClick = (Button) findViewById(R.id.btn_click);
		mLayout = (LinearLayout) findViewById(R.id.ll_layout);
	}

}




일단 첫 화면은 앱 실행 화면 입니다. 설명에는 최상위에 위치한 View를 가리켜서 Focus가 맞춰 졌다고 표현을 하겠습니다. 일단 앱 실행시 LinearLayout에 Focus가 맞춰져 있습니다. LinearLayout을 클릭하면 LinearLayout 토스트 메시지가 뜨는군요.



자 그럼 상단의 버튼을 클릭해 볼까요? 버튼을 클릭 했더니 버튼이 생성 되었습니다. LinearLayout의 큰사이즈 때문에 아래에 깔려 있었던 Button이 위로 올라왔습니다. 그렇습니다. 바로 bringToFront() 메서드를 사용한 것 입니다. 이렇게 되면 버튼이 최상위가 되고 아래에 LinearLayout 에 존재 하게 됩니다. 바로 버튼에 Foucs가 맞춰진 것이겠죠? ㅎㅎ!!




하지만!! 주의 하실 점이!!  View가 최상위로 올라왔다고 해서 하위에 있는 View들을 전부 사용하지 못하는 것이 아닙니다. 최상위 View에 가려 졌지만 화면에 보여지고 있는 View(LinearLayout)을 클릭했을 경우 그래도 이벤트를 받을 수 있습니다. 아래처럼 말이죠!!


 


자 그럼 다시한번 버튼을 클릭해 보겠습니다. 다시 처음 화면으로 돌아 오게 됩니다. 여기서 또 하나 중요한 점은 View가 아래위로 이동할 경우 View.invalidate() 메서드를 호출해 주셔야 합니다. View를 다시 그려주는 기능으로 생각 하시면 됩니다. 꼭 호출 하셔야 됩니다. 아니면 bringToFront() 호출해도 View가 최상위로 올라와 보이지 않게 됩니다.





파일첨부 : 

TestBringToFront.zip




감사합니다.








댓글
  • 프로필사진 easy 정말 감사합니다. 이것 때문에 밤 샜습니다.

    같은 기능 하는놈인데 버튼을 일일히 만들 수도 없고 정말 잘 보고 갑니다.
    2013.09.11 23:41
댓글쓰기 폼