๊ด€๋ฆฌ ๋ฉ”๋‰ด

Welcome! Everything is fine.

[Android] ์ธํ”Œ๋ ˆ์ด์…˜ ๋ณธ๋ฌธ

Android

[Android] ์ธํ”Œ๋ ˆ์ด์…˜

๊ฐœ๋ฐœ๊ณฐ๋ฐœ 2022. 3. 9.
728x90

๐Ÿ“Œ XML ํŒŒ์ผ๊ณผ ์†Œ์Šค์ฝ”๋“œ ์—ฐ๊ฒฐ

XML ํŒŒ์ผ๊ณผ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ• ๊นŒ? ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ๊ธธ ๋•Œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์†Œ์Šค๋กœ, setContentView ๋ฉ”์„œ๋“œ๊ฐ€ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์‹œ๋งํ•ด setContentView ๋ฉ”์„œ๋“œ์— XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ ์ด๋ฆ„์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜์—ฌ XML ๋ ˆ์ด์•„์›ƒ๊ณผ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ XML ๋ ˆ์ด์•„์šฐ์Šค์ด ์ด๋ฆ„์€ R.layout.activity_main๊ณผ ๊ฐ™์ด ์ง€์ •ํ•ด์•ผํ•œ๋‹ค.

public class MainActivity extends AppCompatActivity {

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

R.layout.activity_main์—์„œ

  • R → ํ”„๋กœ์ ํŠธ ์ฐฝ์— ๋ณด์ด๋Š” res ํด๋” ์˜๋ฏธ
  • layout → res ํด๋”์˜ layout ํด๋” ์˜๋ฏธ
  • activity_main /app/res/layout ํด๋” ์•ˆ์— ์žˆ๋Š” activity_main.xml ํŒŒ์ผ ์˜๋ฏธ

setContentView ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋ทฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ ๋‚ด์šฉ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒดํ™”ํ•œ๋‹ค.

์‹ค์ œ๋กœ ์•ฑ์ด ์‹คํ–‰๋˜๋ฉด XML ๋ ˆ์ด์•„์›ƒ(ํ™”๋ฉด ๋ฐฐ์น˜ ์ •๋ณด)์„ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ˆœ์„œ๋ฅผ ์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์•ฑ์ด ์‹คํ–‰๋œ๋‹ค.
  • XML ๋ ˆ์ด์•„์›ƒ์˜ ๋‚ด์šฉ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒดํ™”๋œ๋‹ค.
  • ๊ฐ์ฒดํ™”๋œ XML ๋ ˆ์ด์•„์›ƒ์„ ์†Œ์Šค ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ XML ๋ ˆ์ด์•„์›ƒ์˜ ๋‚ด์šฉ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒดํ™”๋˜๋Š” ๊ณผ์ •์„ '์ธํ”Œ๋ ˆ์ด์…˜(inflation)'์ด๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿ“Œ ๋ถ€๋ถ„ ํ™”๋ฉด ๋ณด์—ฌ์ฃผ๊ธฐ

์ „์ฒด ํ™”๋ฉด์ด ์•„๋‹Œ ๋ถ€๋ถ„ ํ™”๋ฉด๋„ ๋ณ„๋„์˜ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์— ์ •์˜ํ•œ ํ›„ ๋ถˆ๋Ÿฌ์™€ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ setContentView๋Š” ํ™”๋ฉด ์ „์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š” ์—ญํ• ๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋ถ€๋ถ„ ํ™”๋ฉด์„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒดํ™”ํ•˜๋ ค๋ฉด ์ธํ”Œ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์ธํ”Œ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ LayoutInflater ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต๋œ๋‹ค. LayoutInflater ํด๋ž˜์Šค๋Š” ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋กœ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ผ์„œ getSystemService ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ LayoutInflater ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ ํ›„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

* ์‹œ์Šคํ…œ ์„œ๋น„์Šค : ๋‹จ๋ง์ด ์‹คํ–‰๋˜๋ฉด์„œ ํ•ญ์ƒ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค

getSystemService(Context.LAYOUT_INFLATER_SERVICE)

๐Ÿ“ƒ ์š”์•ฝ

  • ๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ → setContentView(R.layout.activity_main)์œผ๋กœ ๊ฐ์ฒดํ™”ํ•˜์—ฌ ํ™”๋ฉด์— ๋‚˜ํƒ€๋ƒ„
  • ๋ถ€๋ถ„ ๋ ˆ์ด์•„์›ƒ → LayoutInflater ๊ฐ์ฒด ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๊ทธ๋ฃน ๊ฐ์ฒด๋กœ ๊ฐ์ฒดํ™”(์ธํ”Œ๋ ˆ์ด์…˜)ํ•œ ํ›„ ๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ์— ์ถ”๊ฐ€

๋‹ค์Œ ์•ฑ ์‹คํ–‰ํ™”๋ฉด์ด ๊ทธ ์˜ˆ์ œ์ธ๋ฐ, '์ถ”๊ฐ€ํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์ด ๋ถ€๋ถ„ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. activity_menu.xml ํŒŒ์ผ๊ณผ sub1.xml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , MenuActivity.java ํŒŒ์ผ์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ ์—ˆ๋‹ค. '์ถ”๊ฐ€ํ•˜๊ธฐ' ๋ฒ„ํŠผ ์•„๋ž˜์ชฝ์— LinearLayout์„ ๋งŒ๋“ค๊ณ  id๋ฅผ container๋กœ ์„ค์ •ํ•œ ๋’ค, ์ด container ๊ฐ์ฒด์— ๋ถ€๋ถ„ ํ™”๋ฉด xml ํŒŒ์ผ์˜ ๋ ˆ์ด์•„์›ƒ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ถ€๋ถ„ ๋ ˆ์ด์•„์›ƒ ๋กœ๋”ฉ ์ „(์ขŒ) / ์ธํ”Œ๋ ˆ์ด์…˜ ํ†ตํ•ด ๋ถ€๋ถ„ ๋ ˆ์ด์•„์›ƒ ๋กœ๋”ฉ ํ›„(์šฐ)

๋‹ค์Œ์€ MenuActivity.java ํŒŒ์ผ์˜ ์†Œ์Šค ์ฝ”๋“œ๋‹ค. ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ณด๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ „์ฒด ๋ ˆ์ด์•„์›ƒ(activity_menu.xml)์˜ ์•ˆ์ชฝ ๋ ˆ์ด์•„์›ƒ(container)์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด findViewById(R.id.container) ๋ผ๊ณ  ์ž…๋ ฅํ•˜๊ณ  ๊ทธ๊ฒƒ์„ container ๋ณ€์ˆ˜์— ๋„ฃ์—ˆ๋‹ค.
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ๋ฅผ onClick ๋ฉ”์„œ๋“œ ์•ˆ์— ์ž…๋ ฅํ–ˆ๋‹ค.
  • ๊ทธ ์•ˆ์—์„œ getService ๋ฉ”์„œ๋“œ๋กœ LayoutInflater ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.
  • ๊ทธ ์ฐธ์กฐํ•œ ์ธํ”Œ๋ ˆ์ดํ„ฐ์˜ inflate ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋กœ R.layout.sub1, container ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ–ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ๋ถ€๋ถ„ ๋ ˆ์ด์•„์›ƒ(sub1.xml)์— ์ •์˜๋œ ๋ทฐ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋˜๋ฉฐ ๊ฐ์ฒดํ™”๋œ๋‹ค.
  • ๊ฐ์ฒดํ™”๋˜๋ฉด ๋ถ€๋ถ„ ๋ ˆ์ด์•„์›ƒ(sub1.xml)์— ๋“ค์–ด์žˆ๋˜ tetxView์™€ CheckBox๋ฅผ findViewById ๋ฉ”์„œ๋“œ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ์˜ํ•  ์ ์€ container.findViewById(R.id.checkbox)์™€ ๊ฐ™์ด container ๊ฐ์ฒด์˜ findViewById ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
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 MenuActivity extends AppCompatActivity {
    LinearLayout container;

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

        container = findViewById(R.id.container);
        Button button = findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                inflater.inflate(R.layout.sub1,container,true);
                CheckBox checkBox = container.findViewById(R.id.checkbox);
                checkBox.setText("๋กœ๋”ฉ๋˜์—ˆ์–ด์š”.");
            }
        });
    }
}

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ AndroidMenifest.xml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค. ์•ฑ์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ MainActivity๊ฐ€ ์•„๋‹Œ MenuActivity ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. <activity> ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” android:name ์†์„ฑ ๊ฐ’์„ ๋ชจ๋‘ ์ˆ˜์ •ํ•œ๋‹ค. ๊ต์žฌ๋ž‘์€ ์กฐ๊ธˆ ๋‹ค๋ฅด์ง€๋งŒ..์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ ์น˜๋‹ˆ ์•ฑ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. exported์— ๊ด€ํ•ด ์•Œ์•„๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

<activity
    android:name=".MainActivity"
    android:exported="false" />
<activity
    android:name=".MenuActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

* ์ฐธ๊ณ 

LayoutInflater์˜ inflate ๋ฉ”์„œ๋“œ์—์„œ attachToRoot๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชฐ๋ผ์„œ ์™œ ์ €๊ฒŒ true์ผ๊นŒ ํ•˜๊ณ  ๊ตฌ๊ธ€์—์„œ ์ฐพ์•„๋ณด๋‹ˆ ๋Œ€์ถฉ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค. ๋ฐ‘์€ ๋‚ด๊ฐ€ ๋ณด๊ณ  ์ดํ•ดํ•œ ๋ธ”๋กœ๊ทธ!

 

[Android] LayoutInflater attachToParent ํŒŒ๋ผ๋ฏธํ„ฐ ์˜๋ฏธ๋ฅผ ์•Œ์•„๋ณด์ž

[Android] LayoutInflater attachToParent parameter mean? ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ง„ํ–‰ํ•ด๋ณด๋ฉด์„œ ๋ ˆ์ด์•„์›ƒ์„ inflate ํ•  ๋•Œ ํ•ญ์ƒ inflate ๋ฉ”์„œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ attachToParent/Root ๋ฅผ ๊ฑฐ์˜ ๋ฌด์กฐ๊ฑด..

whyprogrammer.tistory.com