안드로이드/Android AddRule을 이용한 RelativeLayout 코드로 재배치 하기
▒ ▒ ▒ ▒ ▒ ▒ ▒ 전체 소스 입니다. ▒ ▒ ▒ ▒ ▒ ▒ ▒
▒ ▒ ▒ ▒ ▒ ▒ ▒ 디테일 설명 입니다. ▒ ▒ ▒ ▒ ▒ ▒ ▒ .
▒ 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)
▒ 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
안드로이드 Developers에 Class Overview를 보시면
Per-child layout information associated with RelativeLayout. 라고 나와있습니다.
"각각의 차일드 레이아웃 정보를 RelativeLayout에 연관시킨다" 정도로 해석할 수 있겠는데요.
즉, RelativeLayout에 사용 할 차일드 뷰 의 속성들을 정의 하는 기능을 합니다.
그래서 새로운 레이아웃 파람을 생성할때 차일드의 크기를 지정해 줄수 있고,
새로운 레이아웃 파람에 생성된 속성들을 btn.setLayoutParams(rlParams) 를 통해 버튼으로
적용 시킬 수 있습니다.
그리고 이렇게 적용된 버튼을 mRelativeLayout.addView(btn); 릴레이 티브 레이아웃에 add 시켜 주면
코드로 작성한 Button 을 기존의 레이아웃에 적용 시킬 수 있는 것 입니다.
▒ 3.
그리고 마지막으로 AddRule 메서드를 호출 하는 부분 입니다.
여기에서는 지금 여기에서는 R.id.btn_basic(리소스ID) 를 직접 사용해서 호출을 하였는데요,
지금 코드에서 사용하지는 않지만 mButtons[BTN_BASIC2].setId(2); 이부분 처럼 ID를 적용해서
리소스ID 대신 사용 할 수 가 있습니다.
▒ 4. 파일첨부 및 스크린샷.
▒ ▒ ▒ ▒ ▒ ▒ ▒ 전체 소스 입니다. ▒ ▒ ▒ ▒ ▒ ▒ ▒
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 |
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. 파일첨부 및 스크린샷.
'Android > ViewGroup' 카테고리의 다른 글
안드로이드/Android 자바(Java) 코드로 RelativeLayout 구현 하기~! (0) | 2013.01.18 |
---|