๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

LayoutInflater๋กœ ๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ) ์ถ”๊ฐ€ํ•˜๊ธฐ

by 5566 2023. 8. 28.

1. ๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ์†Œ๊ฐœ

๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์—์„œ UI ๊ตฌ์„ฑ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š”๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰ ์ค‘์— ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ฑ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” UI ์š”์†Œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋™์ ์ธ ํ™”๋ฉด ์ „ํ™˜ ๋ฐ UI ๊ฐœ์ธํ™”๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  1. LayoutInflater ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ: LayoutInflater๋Š” XML ๋ ˆ์ด์•„์›ƒ์„ ์‹ค์ œ ๋ทฐ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  2. XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ ๋กœ๋“œํ•˜๊ธฐ: LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, inflate() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XML ํŒŒ์ผ์„ ๋ทฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ: addView() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์›ํ•˜๋Š” ๋ถ€๋ชจ ๋ทฐ ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ทฐ์˜ ์†์„ฑ ์„ค์ •ํ•˜๊ธฐ: ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์˜ ์†์„ฑ์„ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  5. (์„ ํƒ ์‚ฌํ•ญ) ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ: ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์— ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๋ฉด ์•ฑ์˜ ์œ ์—ฐ์„ฑ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋‹ค์–‘ํ•œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” LayoutInflater์˜ ์—ญํ• ๊ณผ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2. LayoutInflater์˜ ์—ญํ• ๊ณผ ์‚ฌ์šฉ๋ฒ•

LayoutInflater๋Š” XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ์‹ค์ œ ๋ทฐ ๊ฐ์ฒด๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, XML ํŒŒ์ผ์— ์ •์˜๋œ ๋ทฐ๋ฅผ ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ทฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

LayoutInflater๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  1. LayoutInflater ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ:

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

    getSystemService() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LAYOUT_INFLATER_SERVICE ์ƒ์ˆ˜๋กœ LayoutInflater ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, context๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ ๋˜๋Š” ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

  2. XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ ๋กœ๋“œํ•˜๊ธฐ:

    View view = inflater.inflate(R.layout.my_layout, null);

    inflate() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ์‹ค์ œ ๋ทฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋กœ๋“œํ•  XML ํŒŒ์ผ์˜ ๋ฆฌ์†Œ์Šค ID์ด๋ฉฐ, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒ์„ฑ๋œ ๋ทฐ๋ฅผ ํฌํ•จํ•  ๋ถ€๋ชจ ๋ทฐ ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ์ž…๋‹ˆ๋‹ค. null์„ ์ „๋‹ฌํ•˜๋ฉด ์ƒ์„ฑ๋œ ๋ทฐ๋Š” ๋ถ€๋ชจ ์—†์ด ๋…๋ฆฝ์ ์ธ ๋ทฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  3. ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ:

    ViewGroup container = findViewById(R.id.container);
    container.addView(view);

    addView() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์›ํ•˜๋Š” ๋ถ€๋ชจ ๋ทฐ ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” R.id.container๋กœ ์ง€์ •ํ•œ ๋ถ€๋ชจ ๋ ˆ์ด์•„์›ƒ์— ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ์‹ค์ œ ๋ทฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋™์ ์œผ๋กœ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3. ๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ

๋‹ค์Œ์€ LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” LinearLayout์— ๋™์ ์œผ๋กœ TextView๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

// 1. LayoutInflater ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

// 2. XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ ๋กœ๋“œํ•˜๊ธฐ
View view = inflater.inflate(R.layout.dynamic_layout, null);

// 3. ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ
LinearLayout container = findViewById(R.id.container);
container.addView(view);

// 4. ๋ทฐ์˜ ์†์„ฑ ์„ค์ •ํ•˜๊ธฐ
TextView textView = view.findViewById(R.id.dynamic_text);
textView.setText("Dynamic TextView");
textView.setTextColor(Color.RED);

// 5. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ
textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง
    }
});

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋™์ ์œผ๋กœ TextView๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

  1. LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LayoutInflater ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. inflate() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ XML ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์„ ์‹ค์ œ ๋ทฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” R.layout.dynamic_layout์„ ๋กœ๋“œํ•˜๊ณ , ์ƒ์„ฑ๋œ ๋ทฐ๋Š” view ๋ณ€์ˆ˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  3. addView() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LinearLayout์— ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” R.id.container๋กœ ์ง€์ •ํ•œ LinearLayout์— view๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. ์ƒ์„ฑํ•œ ๋ทฐ์˜ ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” view์—์„œ R.id.dynamic_text๋กœ ์ง€์ •ํ•œ TextView์˜ ํ…์ŠคํŠธ์™€ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  5. ์ƒ์„ฑํ•œ ๋ทฐ์— ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” textView์— ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ LayoutInflater๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์˜ ์†์„ฑ ์„ค์ •ํ•˜๊ธฐ

๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

4.1. ํ…์ŠคํŠธ ์„ค์ •ํ•˜๊ธฐ

TextView textView = view.findViewById(R.id.dynamic_text);
textView.setText("Hello, World!");

setText() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ TextView์˜ ํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” TextView์˜ ํ…์ŠคํŠธ๋ฅผ "Hello, World!"๋กœ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

4.2. ํฐํŠธ ํฌ๊ธฐ ์„ค์ •ํ•˜๊ธฐ

TextView textView = view.findViewById(R.id.dynamic_text);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);

setTextSize() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ TextView์˜ ํฐํŠธ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ TypedValue.COMPLEX_UNIT_SP๋Š” ์Šค์ผ€์ผ ๋…๋ฆฝ์  ํ”ฝ์…€ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํฐํŠธ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” TextView์˜ ํฐํŠธ ํฌ๊ธฐ๋ฅผ 18sp๋กœ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

4.3. ํ…์ŠคํŠธ ์ƒ‰์ƒ ์„ค์ •ํ•˜๊ธฐ

TextView textView = view.findViewById(R.id.dynamic_text);
textView.setTextColor(Color.RED);

setTextColor() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ TextView์˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” TextView์˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Color.RED๋Š” ์‹œ์Šคํ…œ ์ •์˜ ์ƒ‰์ƒ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

4.4. ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

TextView textView = view.findViewById(R.id.dynamic_text);
textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง
    }
});

setOnClickListener() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ TextView์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” TextView๋ฅผ ํด๋ฆญํ•˜๋ฉด onClick() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์˜ ์†์„ฑ์€ ํ•ด๋‹น ๋ทฐ์— ๋งž๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ทฐ์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•„์š”ํ•œ ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ ˆ์ด์•„์›ƒ(๋ทฐ)์— ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค:

  1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, View.OnClickListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ: ๊ตฌํ˜„ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋กํ•˜๊ธฐ: ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ทฐ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:

// 1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ
View.OnClickListener clickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง
        // ์˜ˆ์‹œ: ํด๋ฆญํ•œ ๋ทฐ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค
        TextView textView = (TextView) v;
        textView.setText("Clicked!");
    }
};

// 2. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

// 3. ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋กํ•˜๊ธฐ
TextView textView = view.findViewById(R.id.dynamic_text);
textView.setOnClickListener(clickListener);

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ TextView์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

  1. View.OnClickListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” clickListener๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  2. ์ƒ์„ฑํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ๋กœ์ง์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ํด๋ฆญํ•œ ๋ทฐ์˜ ํ…์ŠคํŠธ๋ฅผ "Clicked!"๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  3. ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์ธ TextView์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” textView์— clickListener๋ฅผ ๋“ฑ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ TextView์—์„œ ํด๋ฆญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด์˜ onClick() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋ทฐ์˜ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€