본문 바로가기

Blog/Android

LayoutInflater, 한 화면 쪼개서 부분화면 이용

 

화면을 두 개로 만들기 위해 새로운 액티비티를 추가하는 것이 아니라 하나의 메인 액티비티 이용하여 그 일부분을 레이아웃으로 만들고 또 다른 뷰로 이용하는 것

 

보이는 레이아웃은 두 개이므로 layout.xml은 두 개고, 자바 파일은 한 개(실질적 액티비티)<br>

그래서 manifest 건들지 않아도 됨

 

 

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.049"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.055" />

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="36dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button">
            <!-- 프레임레이아웃은 한 번에 하나의 뷰만 추가할 수 있어서 공간 확보하는 데에 쓰이기도 함
            다른 영역을 담고 있을 수 있는 영역을 확보했을 때 container라고 하는 아이디 주로 줌-->

        </FrameLayout>
    </android.support.constraint.ConstraintLayout>

 

 

sub.xml

    <?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"
        android:background="@android:color/holo_red_light"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="부분화면"
            android:textSize="40dp" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    </LinearLayout>
    <!--activity_main.xml은 전체 화면을 의미하고 sub1.xml은 부분화면을 의미
    이 액티비티 디자인 탭의 미리보기에는 전체 화면처럼 보이지만 전체 화면이 아님-->

 

 

MainActivity.java

    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.FrameLayout;

    public class MainActivity extends AppCompatActivity {
        FrameLayout container;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);//화면 전체를 객체화(버튼 객체 만들어줌)

            container = (FrameLayout)findViewById(R.id.container);
            //여기서 선언이 되면 밖에는 참조가 안 됨 즉, setOnClickListener에서 OnClickListener에는 참조가 안 되므로 선언 밖에

            Button button = (Button)findViewById(R.id.button);//버튼을 시스템이 붙여주니까(버튼 객체를 만들어주니까) 나는 어딨는지 모르므로 아이디로 찾아오는거
            button.setOnClickListener(new View.OnClickListener() {//버튼 클릭되면 OnClick 메서드 호출
                @Override
                public void onClick(View v) {
                    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    inflater.inflate(R.layout.sub1, container, true);//내가 만든 일부 화면인 레이아웃을 지정하고(이 xml레이아웃을 인플레이션 한 다음),
                    //container뷰에 붙여주는 것, true는 바로 붙여달라는 뜻
                    //레이아웃 인플레이션 과정
                    //이렇게 부분화면도 메모리 객체화를 거치면 그 안에 들어가 있는 위젯 또는 뷰 들을 아이디를 통해 찾아서 사용 가능하다.


                }
            });
        }
    }
    //전체 객체화가 아니라 부분 화면인 경우(액티비티가 아니라 어떤 화면의 한 부분을 레이아웃으로 만들고(레이아웃 안에 레이아웃 만들고 이랬을 때)
    //레이아웃 안에 들어갈 수 있는 뷰(그걸로 다시 화면 구성 가능)
    //그 때 인플레이션 직접(인플레이터 서비스)
    //시스템 서비스라고 하는 거는 안드로이드 단말기가 실행이 됐을 때, 뒤단에서 미리 실행된 거(화면이 없는거), 시스템이 미리 실행시켜놓은 화면이 없는 그런 실행 프로세스 = 서비스

 

 

결과

'Blog > Android' 카테고리의 다른 글

AudioRecorder, 녹음 기능  (0) 2020.04.05
List, 화면 리스트 만들기  (0) 2020.04.05
Intent, 메뉴 액티비티와 데이터 전달  (0) 2020.04.05
Event, 버튼 이벤트 처리  (0) 2020.03.31
Dialog, 대화상자 띄우기  (0) 2020.03.31