본문 바로가기

Android/ViewGroup

안드로이드/Android AddRule을 이용한 RelativeLayout 코드로 재배치 하기

안드로이드/Android AddRule을 이용한 RelativeLayout 코드로 재배치 하기

▒ ▒  ▒  ▒  ▒  ▒  ▒  전체 소스 입니다.  ▒ ▒  ▒  ▒  ▒  ▒  ▒
package arabiannight.tistory.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;

public class TestRelativeLayoutCodeActivity extends Activity {
	
	private static final int BTN_TOLEFT = 0;
	private static final int BTN_TORIGHT = 1;
	private static final int BTN_ABOVE = 2;
	private static final int BTN_BELOW = 3;
	private static final int BTN_CELAR = 4;
	private static final int BTN_BASIC2 = 5;
	
	private Button[] mButtons;
	private RelativeLayout mRelativeLayout;
	
	private int[] soksungType;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        setLayout();
        
        mButtons[BTN_BASIC2].setId(2); // ID 부여하기
        
        mButtons[BTN_BASIC2].setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 사용 안함
			}
		});
        
        setButtonAddRule(mButtons[BTN_BASIC2], R.id.btn_basic , RelativeLayout.ALIGN_PARENT_BOTTOM
        		, RelativeLayout.CENTER_HORIZONTAL);
        
    }
    
    public void onClickButton(View v){
    	switch (v.getId()) { 
		case R.id.btn_toleft:
			soksungType = new int[]{ RelativeLayout.LEFT_OF , RelativeLayout.ALIGN_BOTTOM };
			break;
		case R.id.btn_toright:
			soksungType = new int[]{ RelativeLayout.RIGHT_OF , RelativeLayout.ALIGN_BOTTOM };
			break;
		case R.id.btn_above:
			soksungType = new int[]{ RelativeLayout.ABOVE , RelativeLayout.ALIGN_LEFT };
			break;
		case R.id.btn_below:
			soksungType = new int[]{ RelativeLayout.BELOW , RelativeLayout.ALIGN_RIGHT };
			break;
		case R.id.btn_clear:
			soksungType = new int[]{ RelativeLayout.ALIGN_PARENT_BOTTOM , 
					RelativeLayout.CENTER_HORIZONTAL};
			break;
		}
    	setButtonAddRule(mButtons[BTN_BASIC2], R.id.btn_basic , soksungType);
    }
    
    public void setLayout(){
    	mButtons = new Button[]{
    			(Button)findViewById(R.id.btn_toleft),
    			(Button)findViewById(R.id.btn_toright),
    			(Button)findViewById(R.id.btn_above),
    			(Button)findViewById(R.id.btn_below),
    			(Button)findViewById(R.id.btn_clear),
    			new Button(TestRelativeLayoutCodeActivity.this),
    	};
    	
    	mRelativeLayout = (RelativeLayout) findViewById(R.id.rl_main);
    }
    
    public void setButtonAddRule(Button btn, int id , int... ruleTypes){
    	 mRelativeLayout.removeView(btn);
    	 RelativeLayout.LayoutParams rlParams = new RelativeLayout.LayoutParams(80,80);
    	 for (int ruletype : ruleTypes) {
    		 rlParams.addRule(ruletype,id);
    	 }
    	 btn.setLayoutParams(rlParams);
    	 
    	 mRelativeLayout.addView(btn);
    }
} 

▒ ▒  ▒  ▒  ▒  ▒  ▒  디테일 설명 입니다.  ▒ ▒  ▒  ▒  ▒  ▒  ▒
 .


▒ 1.  
레이아웃 부분 입니다. 코드에서 사용하는 사용하는 버튼들을 하나의 배열로 묶어서 관리하고 있습니다.
그럼 불필요한 변수사용도 적어지고 관리하는 측면에서도 훨씬 간편 합니다.
new Button(TestRelativeLayoutCodeActivity.this) = 요부분은 코드상에서 버튼의 이동을 위해 코드상에서 버튼을 생성해주는 부분입니다.

배열이 아니라면 ,
Button bt = findViewById(R.id.btn_toleft) ,
Button bt2 = new Button(TestRelativeLayoutCodeActivity.this);


이런 식의 형태가 되겠죠?
그리고 xml에 정의된 메인 RelativeLayout을 정의해서 코드로 기존의 RelativeLayout의 속성들을 수정할 수 있는 준비작업을 마칩니다. mRelativeLayout = (RelativeLayout) findViewById(R.id.rl_main)

public void setLayout(){
        mButtons = new Button[]{
                (Button)findViewById(R.id.btn_toleft),
                (Button)findViewById(R.id.btn_toright),
                (Button)findViewById(R.id.btn_above),
                (Button)findViewById(R.id.btn_below),
                (Button)findViewById(R.id.btn_clear),
                new Button(TestRelativeLayoutCodeActivity.this),
        };
         
        mRelativeLayout = (RelativeLayout) findViewById(R.id.rl_main);
    }


▒ 2.   
AddRule 메서드를 사용하는 부분 입니다.  

setButtonAddRule 이란 메서드를 만들어서 매개인자로 (Button btn, int id , int... ruleTypes)를 인자로 받습니다.

btn은 화면상에(RelativeLayout) 추가될 Button을 받는 것이고,
int id 는 RelativeLayout에 속성을 추가할때 기준이 되게 하는 ID값을 말 합니다.


즉, xml에서 코드를 짤때 2를 1에 toleft에 위치시켜라 할때 기준이 되는 1을 말합니다.

그리고 ruleTypes는 1에 toleft에 위치시켜라 할때 toleft라는 명령이 되겠구요.

setButtonAddRule메서드를 자세히 살펴보면
일단 mRelativeLayout.removeView(btn); 명령을 수행합니다.
왜냐하면 버튼이 새로운 add를 해줄때마다 버튼이 추가되기때문에 새로운 속성을 적용하면서 기존의 버튼을 지우기 위해 사용합니다.

그리고 알아볼 녀석이 바로 이녀석 입니다.
참 보기는 많이 봐왔던 녀석인데요..
한마디로 표현한다면 "속성" 정도로 표현 할 수 있겠습니다.

RelativeLayout.LayoutParams
java.lang.Object
   ↳ android.view.ViewGroup.LayoutParams
     ↳ android.view.ViewGroup.MarginLayoutParams
       ↳ android.widget.RelativeLayout.LayoutParams
 

안드로이드 Developers에 Class Overview를 보시면

Per-child layout information associated with RelativeLayout. 라고 나와있습니다.
"각각의 차일드 레이아웃 정보를 RelativeLayout에 연관시킨다" 정도로 해석할 수 있겠는데요.

즉, RelativeLayout에 사용 할 차일드 뷰 의 속성들을 정의 하는 기능을 합니다.

그래서 새로운 레이아웃 파람을 생성할때 차일드의 크기를 지정해 줄수 있고,
새로운 레이아웃 파람에 생성된 속성들을  btn.setLayoutParams(rlParams) 를 통해 버튼으로
적용 시킬 수 있습니다.
그리고 이렇게 적용된 버튼을  mRelativeLayout.addView(btn); 릴레이 티브 레이아웃에 add 시켜 주면
코드로 작성한 Button 을 기존의 레이아웃에 적용 시킬 수 있는 것 입니다.

public void setButtonAddRule(Button btn, int id , int... ruleTypes){
         mRelativeLayout.removeView(btn);
         RelativeLayout.LayoutParams rlParams = new RelativeLayout.LayoutParams(80,80);
         for (int ruletype : ruleTypes) {
             rlParams.addRule(ruletype,id);
         }
         btn.setLayoutParams(rlParams);
          
         mRelativeLayout.addView(btn);
    }


▒ 3.   
그리고 마지막으로
AddRule 메서드를 호출 하는 부분 입니다.
여기에서는 지금 여기에서는 R.id.btn_basic(리소스ID) 를 직접 사용해서 호출을 하였는데요,
지금 코드에서 사용하지는 않지만 mButtons[BTN_BASIC2].setId(2); 이부분 처럼 ID를 적용해서
리소스ID 대신 사용 할 수 가 있습니다.
setButtonAddRule(mButtons[BTN_BASIC2], R.id.btn_basic , soksungType);


▒ 4. 파일첨부 및 스크린샷.   

TestRelativeLayoutCode.zip