'2017/04/08'에 해당되는 글 2건

728x90

Avtivity 화면에서
XML로 정의되어 있는 View 와 Layout을 객체화 시키는 메소드가 inflate 다.
inflate 메소드를 통해서 XML 리소스 정보를 해석하여 View를 생성하고 rootView를 리턴한다.
리턴된 rootView를 setContentView() 라는 메소드를 통해 보여줄 수 있다.
setContentView를 이용하면 XML 레이아웃을 인플레이션 한 후 화면에 보여주는 기능을 하기도 하고, 인플레이션 된 위젯을 화면에 구성하는 기능을 한다.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



XML 로 작성된 메뉴(옵션 메뉴, 컨텍스트 메뉴)는 inflate(팽창 → 프로그래밍 객체로 변환) 하면 실제 메뉴가 생성된다.


기본적인 사용 패턴은

// 1. inflater 얻어오기

MenuInflater inflater = getMenuInflater();

LayoutInflater inflater = getLayoutInflater();

LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );


// 2. View inflate 하기 (XML 파일과 연결 (R. 으로 시작되는 resource 파일들만 inflate 가능))

inflater.inflate(R.menu.mymenu, menu);

View v = (View) inflater.inflate( R.layout.inflate_example, parent, false );


// 3. 화면에 표시하기

setContentView( v );


다시 정리하면

LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View v = (View) inflater.inflate( R.layout.inflate_example, parent, false );
setContentView(v);



Main View 에 부분 xml 을 가져와서 보여주는 것에 대한 예제를 보자.


LinearLayout add_layout = (LinearLayout) findViewById(R.id.addLayout);
// 인플레이션
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.add_layout,add_layout,true); 



=== activity_main.xml ===

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

    <TextView
        android:id="@+id/txt01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="부분 레이아웃"
        android:layout_marginTop="30dp"
        android:gravity="center_horizontal"
        android:textSize="20dp"
        android:textColor="#a88" />

    <Button
        android:id="@+id/btn1"
        android:layout_gravity="center_horizontal"
        android:text="Add"
        android:textAllCaps="false"
        android:textSize="20dp"
        android:onClick="btn_addlayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/addLayout"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>
</LinearLayout>


부분 Layout 을 추가할 add_layout.xml 를 정의한다.

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

    <Button
        android:id="@+id/btnTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="동의 토글"
        android:textSize="20dp"
        android:textStyle="bold" />

    <RadioGroup
        android:id="@+id/rg1"
        android:orientation="horizontal"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        android:layout_marginRight="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/rb1"
            android:text="독서"
            android:textColor="#00f"
            android:textSize="20dp"
            android:layout_marginRight="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/rb2"
            android:text="여행"
            android:textColor="#00f"
            android:textSize="20dp"
            android:layout_marginRight="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/rb3"
            android:text="스포츠"
            android:textColor="#00f"
            android:textSize="20dp"
            android:layout_marginRight="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/rb4"
            android:text="영화"
            android:textColor="#00f"
            android:textSize="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </RadioGroup>

    <LinearLayout
        android:gravity="center"
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:text="동의"
            android:textSize="20dp"
            android:layout_margin="10dp"
            android:textColor="#f00"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <CheckBox
            android:id="@+id/agree"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>


이제 MainActivity.java 파일에 inflation 을 시킨다.

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // 버튼을 클릭했을 때 동작처리 메소드
    public void btn_addlayout(View view){
        addLayout();
    }

    // add_layout.xml 을 activity_main.xml 에 추가하는 메소드
    private void addLayout(){
        LinearLayout add_layout = (LinearLayout) findViewById(R.id.addLayout);

        // 인플레이션
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.add_layout,add_layout,true);

        // add_layout.xml 에 버튼 객체 참조
        Button btnTest = (Button) findViewById(R.id.btnTest);
        final CheckBox agree = (CheckBox) findViewById(R.id.agree);

        btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(agree.isChecked()){
                    agree.setChecked(false);
                } else {
                    agree.setChecked(true);
                }
            }
        });

    }
}



블로그 이미지

Link2Me

,
728x90

사용자가 버튼을 클릭하면, 클릭 이벤트가 발생한다.

Button 요소에 onClick 속성을 추가한다.

클릭 이벤트가 발생하면 onClick 속성에 저장된 메소드가 호출된다.

 

<Button
        android:id="@+id/btn1"
        android:layout_gravity="center_horizontal"
        android:text="Add"
        android:textAllCaps="false"
        android:textSize="20dp"
        android:onClick="btn_addlayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

 

 

MainActivity.java 에 클릭 이벤트를 처리하는 메소드를 정의한다.

onClick 명을 btn_addlayout 이라고 했으므로 클릭 이벤트 이름도 동일하게 해주어야 한다.

onClick 속성에 선언하는 메소드는 public 이어야 하고, void 형을 가지며, View 를 메소드의 인수로 가진다.

 

// 버튼을 클릭했을 때 동작처리 메소드
public void btn_addlayout(View view){
    addLayout();
}

 

 

다른 방법은 가장 흔하게 사용하는 방법이다.

이 방식으로 코딩하는 걸 추천한다.

Button button = (Button) findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        addLayout();
    }
});

 

코틀린 에서 처리 방법

val product_name = findViewById<TextView>(R.id.product_name)
val product_count = findViewById<TextView>(R.id.product_count)


product_name.setOnClickListener { _ ->
    
}

 

Android Studio 3.6 이상에서 ViewBinding 처리 방법을 권장하고 있다.

https://link2me.tistory.com/1974 을 참조하시라.

블로그 이미지

Link2Me

,