본문 바로가기

프로그래밍/안드로이드

[안드로이드] 레이아웃 파라미터(Layout Parameter)

※ 저는 안드로이드 프로그래밍 정복(김상형 著, 한빛미디어) 책을 이용해 공부하고 있으며

예제와 코드는 이 책을 통해 공부중임을 밝힙니다.

개인적인 공부를 하면서 정리한 형식이기 때문에 심각한 오류가 있을 수 있습니다. 피드백 주시면 정말 감사하겠습니다.


※ 안드로이드 프로그래밍 정복(207p~216p) 참조


<레이아웃 파라미터>



일반속성은 text, gravity, src 등 뷰 자체의 성질을 지정함. 즉, 텍스트, 이미지, 여백, 텍스트 색상, 텍스트 크기 등 외부와는 상관없는 뷰 "혼자만의 속성"을 의미한다.


반면에, 레이아웃 파라미터(Layout Parameter)는 뷰가 배치되는 부모, 즉 레이아웃에 소속되는 속성이며 부모에게 차일드 뷰를 배치할 방법을 지시한다.


1. 소속

2. 적용시점

3. 변경방법 


일반 속성(text, gravity, src 등)은 위젯에 따라 적용가능 한 종류가 달라진다.


text 속성은 TextView에서만, src속성은 ImageView에서만 쓸 수 있다.


반면, 레이아웃 파라미터 종류는 위젯이 아니라 소속되어 있는 부모 레이아웃에 따라 달라진다.


void setText(CharSequence Text)

void setText Color(int color)

void setTextSize(float size)

(O)


일반 속성의 경우에는 set을 통해 속성값을 변경할 수 있지만, 

레이아웃 파라미터를 변경하는 메서드는 제공하지 않는다


void TextView.setLayoutWidth()

void TextView.setLayoutWeight()

void TextView.setLayoutX()

(X)


왜냐하면 자신이 어떤 레이아웃에 놓일 것인지 알 수 없기 때문이다.




코드로만 레이아웃을 짜본건데, linear를 수직 + Center로 설정했지만

화면에 출력되는 결과는 글자는 Center가 아닌 왼쪽으로 붙어서 나온다.


그 이유는 "수직 리니어의 레이아웃 파라미터"의 디폴트값이 높이는 WRAP_CONTENT, 넓이는 MATCH_PARENT이기 때문이다. 


따라서 원하는 출력을 위해서는 addView에 또 다른 인수를 전달해줘야 한다.

그 인수가 바로 "레이아웃 파라미터 객체" 이다.


그러면 레이아웃 파라미터 객체를 생성해보자! (아래)



"코드"로 레이아웃을 배치할 경우, 레이아웃 파라미터을 관리해야 한다.


리니어와 텍스트뷰를 관계를 맺어주는 addView 함수를 주목해보자.

인자(paramtext)를 전달하고 있다. 다만 함수 특성상 한 개의 인자밖에 전달하지 못한다.


  [ 복 습 ]  addView 메서드로 전달되는 인수는 최대 두 개 밖에 없다.

void addView(View child) 

void addView(View child, int index)

void addView(VIew child, VIewGroup.LaoyutParams params) // 위 예제에서 쓰인 메서드



그렇다면, 두 개 이상의 파라미터를 전달하려고 하면 어떻게 해야 할까?


객체를 일단 생성한 뒤, setMargins 메서드로 마진을 설정한 뒤에 addView의 두번째 인수로 전달해버린다.



<레이아웃 파라미터 변경>


레이아웃 파라미터는 한 번 결정되면 웬만해서 바꿀일이 없지만, 꼭 변경해야 한다면 다음 메서드로 가능하다.


ViewGroup.LayoutParams getLayoutParams () // : 현재 설정되어 있는 레이아웃 파라미터를 조사 

void setLayoutParams ( ViewGroup.LayoutParams params) // 새로운 파라미터를 적용



왼쪽 버튼을 누르면 LEFT폭을 오른쪽 버튼의 3배로 만들어보자.

또는 오른쪽 버튼을 누르면 RIGHT폭을 왼쪽 버튼의 3배로 만들어보자.




아래 void setParm(int left, int right) 를 살펴보자


위에서 설명했듯이, get을 통해 레이아웃 파라미터 조사를 한번 실시하고, 

set을 통해 left 버튼에 weight(가중치)를 줘버린다.


이 기능은 포커스 기능하고도 관련이 있는 것 같다.



위에서 배웠던 내용을 정리하자면

XML 문서로 레이아웃을 만드는 것은 편리하지만

"실행 중에" 레이아웃을 생성해야 하거나 변경해야 하는 경우도 있기 때문에 이 방법을 숙지해야 한다.






<Margin Parameter // java 코드>

package lkcompany.exercise;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.LinearLayout;


public class Exercise extends AppCompatActivity {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);

LinearLayout linear = new LinearLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);
linear.setBackgroundColor(Color.LTGRAY);

Button btn = new Button(this);
btn.setText("Button With Margin");

LinearLayout.LayoutParams parambtn = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
parambtn.setMargins(0, 30, 0, 30);
linear.addView(btn, parambtn);

setContentView(linear);
}
}


<SetParameter // xml, java 코드>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/btnleft"
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Left"/>

<Button
android:id="@+id/btnright"
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Right"/>

</LinearLayout>


public class Exercise extends AppCompatActivity {

Button mLeft;
Button mRight;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);

mLeft = (Button) findViewById(R.id.btnleft);
mRight = (Button) findViewById(R.id.btnright);

mLeft.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
setParam(3, 1);
}
});

mRight.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
setParam(1, 3);
}
});
}

void setParam(int left, int right){
LinearLayout.LayoutParams lparam =
(LinearLayout.LayoutParams)mLeft.getLayoutParams();
lparam.weight = left;
mLeft.setLayoutParams(lparam);

LinearLayout.LayoutParams rparam =
(LinearLayout.LayoutParams)mRight.getLayoutParams();
rparam.weight = right;
mRight.setLayoutParams(rparam);
}
}