Android studio programming

(22.11.26)Android ν”„λ‘œκ·Έλž˜λ°: λ ˆμ΄μ•„μ›ƒκ³Ό XML파일 없이 Java둜만 λ ˆμ΄μ•„μ›ƒ λ§Œλ“€κΈ°

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2022. 11. 26.

β—β—λ ˆμ΄μ•„μ›ƒμ˜ κ°œλ…β—β—

 

 

λ²„νŠΌ, ν…μŠ€νŠΈ λ·°, μ—λ””νŠΈν…μŠ€νŠΈ λ“± μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” μœ„μ ―μ€ λ ˆμ΄μ•„μ›ƒμ΄λΌλŠ” ν‹€ μœ„μ— μ‘΄μž¬ν•΄μ•Ό ν•œλ‹€. λ ˆμ΄μ•„μ›ƒμ€ μœ„μ ―μ„ λ°°μΉ˜ν•˜μ—¬ μ•ˆλ“œλ‘œμ΄λ“œ 화면을 λͺ©μ μ— 맞게 λ°°μ—΄ν•  수 있게 ν•œλ‹€.

λ ˆμ΄μ•„μ›ƒμ€ ViewGroup ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ†λ°›μœΌλ©° 내뢀에 무엇을 λ‹΄λŠ” μš©λ„λ‘œ 쓰인닀. 즉 λ ˆμ΄μ•„μ›ƒ μ•ˆμ— μ‘΄μž¬ν•˜λŠ” μœ„μ ―μ„ λ°°μΉ˜ν•˜κ²Œ ν•΄μ€€λ‹€. λ ˆμ΄μ•„μ›ƒ μ€‘μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ”  것은 λ¦¬λ‹ˆμ–΄ λ ˆμ΄μ•„μ›ƒμ΄λ©°, μ„ ν˜• λ ˆμ΄μ•„μ›ƒμ΄λΌ ν•œλ‹€.

λ ˆμ΄μ•„μ›ƒμ—λŠ” λŒ€ν‘œμ μΈ 속성이 μžˆλ‹€. λ ˆμ΄μ•„μ›ƒλ„ λ·° 클래슀의 ν•˜μœ„ ν΄λž˜μŠ€μ΄λ―€λ‘œ λ·° 클래슀의 XML속성과 λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

 

β—β—λ ˆμ΄μ•„μ›ƒμ˜ 속성●●

 

orientation: λ ˆμ΄μ•„μ›ƒ μ•ˆμ— λ°°μΉ˜ν•  μœ„μ ―μ˜ 수직 λ˜λŠ” μˆ˜ν‰ λ°©ν–₯을 μ„€μ •ν•œλ‹€.

gravity : λ ˆμ΄μ•„μ›ƒ μ•ˆμ— λ°°μΉ˜ν•  μœ„μ ―μ˜ μ •λ ¬ λ°©ν–₯을 쒌츑, 우츑, μ€‘μ•™λ“±μœΌλ‘œ μ„€μ •ν•œλ‹€.

padding : λ ˆμ΄μ•„μ›ƒ μ•ˆμ— λ°°μΉ˜ν•  μœ„μ ―μ˜ 여백을 μ„€μ •ν•œλ‹€.

layout_weight : λ ˆμ΄μ•„μ›ƒμ΄ 전체 ν™”λ©΄μ—μ„œ μ°¨μ§€ν•˜λŠ” κ³΅κ°„μ˜ 가쀑값을 μ„€μ •ν•˜λŠ”λ°, μ—¬λŸ¬ 개의 λ ˆμ΄μ•„μ›ƒμ΄ 쀑볡될 λ•Œ μ‚¬μš©ν•œλ‹€.

baselineAligned : λ ˆμ΄μ•„μ›ƒ μ•ˆμ— λ°°μΉ˜ν•  μœ„μ ―μ„ 보기 μ’‹κ²Œ μ •λ ¬ν•œλ‹€.

 

 

 

 

β—β—λ ˆμ΄μ•„μ›ƒμ˜ μ’…λ₯˜β—β—

 

1. λ¦¬λ‹ˆμ–΄ λ ˆμ΄μ•„μ›ƒ(μ„ ν˜• λ ˆμ΄μ•„μ›ƒ)

λ ˆμ΄μ•„μ›ƒμ˜ μ™Όμͺ½ μœ„λΆ€ν„° μ•„λž˜μͺ½(μ˜€λ¦¬μ—”ν…Œμ΄μ…˜μ„ vertical) λ˜λŠ” 였λ₯Έμͺ½μœΌλ‘œ(μ˜€λ¦¬μ—”ν…Œμ΄μ…˜μ„ horizontal) μ°¨λ‘€λŒ€λ‘œ λ°°μΉ˜ν•œλ‹€.

 

2. λ λŸ¬ν‹°λΈŒλ ˆμ΄μ•„μ›ƒ(μƒλŒ€ λ ˆμ΄μ•„μ›ƒ)

μœ„μ ― μžμ‹ μ΄ μ†ν•œ λ ˆμ΄μ•„μ›ƒμ˜ μƒν•˜μ’Œμš° μœ„μΉ˜λ₯Ό μ§€μ •ν•˜μ—¬ λ°°μΉ˜ν•˜κ±°λ‚˜ λ‹€λ₯Έ μœ„μ ―μœΌλ‘œλΆ€ν„° μƒλŒ€μ μΈ μœ„μ§€λ₯Ό μ§€μ •ν•œλ‹€.

 

 

3. ν…Œμ΄λΈ” λ ˆμ΄μ•„μ›ƒ

ν–‰κ³Ό μ—΄μ˜ 개수λ₯Ό μ§€μ •ν•œ ν…Œμ΄λΈ” ν˜•νƒœλ‘œ μœ„μ ―μ„ λ°°μ—΄ν•œλ‹€.

 

 

4. κ·Έλ¦¬λ“œλ ˆμ΄μ•„μ›ƒ

ν…Œμ΄λΈ”λ ˆμ΄μ•„μ›ƒκ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ ν–‰ λ˜λŠ” 열을 ν™•μ •ν•˜μ—¬ λ‹€μ–‘ν•˜κ²Œ λ°°μΉ˜ν•  λ•Œ 더 νŽΈλ¦¬ν•˜λ‹€.

 

 

5. ν”„λ ˆμž„λ ˆμ΄μ•„μ›ƒ

μœ„μ ―μ„ μ™Όμͺ½ μœ„μ— 일λ₯ μ μœΌλ‘œ κ²Ήμ³μ„œ λ°°μΉ˜ν•˜μ—¬ μ€‘λ³΅λ˜μ–΄ λ³΄μ΄λŠ” 효과λ₯Ό λ‚Ό 수 μžˆλ‹€. μ—¬λŸ¬ 개의 μœ„μ ―μ„ λ°°μΉ˜ν•œ ν›„ 상황에 λ”°λΌμ„œ ν•„μš”ν•œ μœ„μ ―μ„ λ³΄μ΄λŠ” 방식에 주둜 ν™œμš©λœλ‹€.


●●Java μ½”λ“œλ‘œ ν™”λ©΄ λ§Œλ“€κΈ°β—β—

 

μ§€κΈˆκΉŒμ§€ μž‘μ„±ν•œ ν”„λ‘œμ νŠΈλŠ” 기본적으둜 activity_main.xmlμ—μ„œ 화면을 κ΅¬μ„±ν•œ ν›„ Java 파일 (MainActivity.java)의 setContentView() λ©”μ†Œλ“œλ‘œ 화면을 좜λ ₯ν–ˆλ‹€. 메인 Javaμ½”λ“œμ˜ setContentView() λ©”μ†Œλ“œλŠ” xmlνŒŒμΌμ„ 화면에 좜λ ₯ν•˜λŠ” κΈ°λŠ₯을 ν•œλ‹€. μ—¬κΈ°μ„œ R.layout.activity_main은 λ°”λ‘œ activity_main.xml νŒŒμΌμ„ μ˜λ―Έν•˜λ―€λ‘œ, μ½”λ”©ν•œ activity_main.xml 파일이 화면에 좜λ ₯λ˜λŠ” 것이닀.

ν•˜μ§€λ§Œ XMLνŒŒμΌμ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  Javaμ½”λ“œλ§ŒμœΌλ‘œ 화면을 κ΅¬μ„±ν•˜λŠ” 방법 λ˜ν•œ μžˆλ‹€. μžμ£Όμ“°μ§€ μ•Šκ³  λ³΅μž‘ν•˜μ§€λ§Œ 화면을 직접 ꡬ성해야할 λ•Œ μ μš©ν•  수 μžˆλ‹€.

 

 

λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ ν† μŠ€νŠΈλ©”μ‹œμ§€κ°€ 좜λ ₯λ˜λŠ” 화면을 Java둜만 μ½”λ”©ν•˜κΈ°

 

MainActivity.javaμ—μ„œ Java둜만 μ½”λ”©ν•  것이기에  activity_main.xml νŒŒμΌμ„ Delete ν•΄μ€€λ‹€. activity_main.xml을 μ‚­μ œν–ˆμœΌλ―€λ‘œ  xmlνŒŒμΌμ„ 화면에 좜λ ₯ν•˜λŠ” κΈ°λŠ₯을 ν•˜λŠ” setContentView() λ©”μ†Œλ“œμ— μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

 

이λ₯Ό μ£Όμ„μ²˜λ¦¬ ν•œ λ’€ μ½”λ”©ν•΄μ€€λ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
 
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
 
        LinearLayout baseLayout = new LinearLayout(this);
        baseLayout.setOrientation(LinearLayout.VERTICAL);
        baseLayout.setBackgroundColor(Color.rgb(0,255,0));
        setContentView(baseLayout, params);
    }
}
cs

8 ~ 10ν–‰ : LinearLayoutParams λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€. μƒμ„±μžμ—μ„œ νŒŒλΌλ―Έν„°λŠ” layout_width, layout_height 쀑 2개λ₯Ό 지정할 수 μžˆλ‹€. λ‹€μŒ XMLμ½”λ“œμ™€ λ™μΌν•˜λ‹€.

android:layout_width = "match_parent"
android:layout_height = "match_parent"

 

9 ν–‰ : λ¦¬λ‹ˆμ–΄λ ˆμ΄μ•„μ›ƒ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€. λ‹€μŒ XMLμ½”λ“œμ™€ λ™μΌν•˜λ‹€.

<LinearLayout> </LinearLayout>

 

10 ν–‰ : λ¦¬λ‹ˆμ–΄λ ˆμ΄μ•„μ›ƒμ˜ orientation 속성을 μ§€μ •ν•œλ‹€. λ‹€μŒ XMLμ½”λ“œμ™€ λ™μΌν•˜λ‹€.

android:orientation="vertical"

 

11 ν–‰ : λ ˆμ΄μ•„μ›ƒμ˜ 색상을 μ§€μ •ν•œλ‹€. 색상을 μ§€μ •ν•˜κΈ° μœ„ν•΄μ„œ Color.rgb() 정적 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ˜€λŠ”λ°, νŒŒλΌλ―Έν„°λ‘œ (red, green, blue)λ₯Ό μ „λ‹¬ν•œλ‹€. 각 μƒ‰μƒμ—μ„œ 16μ§„μˆ˜ 0~FFλ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ 10μ§„μˆ˜ 0~255λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. λ‹€μŒ XMLμ½”λ“œμ™€ λ™μΌν•˜λ‹€.

android:background="#00FF00"

 

12 ν–‰ : μ€€λΉ„λœ λ¦¬λ‹ˆμ–΄ λ ˆμ΄μ•„μ›ƒ λ³€μˆ˜λ₯Ό 화면에 좜λ ₯ν•œλ‹€. νŒŒλΌλ―Έν„°λ‘œ λ ˆμ΄μ•„μ›ƒ ν΄λž˜μŠ€μ™€ λ ˆμ΄μ•„μ›ƒμ„ μ‚¬μš©ν•œλ‹€.  activity_main.xml νŒŒμΌμ„ μ‚¬μš©ν•œ μ½”λ“œμ˜ 6ν–‰κ³Ό 같은 역할을 ν•œλ‹€. 

 

μ‹€ν–‰κ²°κ³Ό:

 

 

ν•΄λ‹Ή λ¦¬λ‹ˆμ–΄λ ˆμ΄μ•„μ›ƒμ— λ²„νŠΌμ„ λ§Œλ“€κ³ , λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œμ˜ ν† μŠ€νŠΈ λ©”μ‹œμ§€λ₯Ό μž‘μ„±ν•˜κΈ°

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
 
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
 
        LinearLayout baseLayout = new LinearLayout(this);
        baseLayout.setOrientation(LinearLayout.VERTICAL);
        baseLayout.setBackgroundColor(Color.rgb(0,255,0));
        setContentView(baseLayout, params);
 
        Button btn = new Button(this);
        btn.setText("λ²„νŠΌμž…λ‹ˆλ‹€.");
        btn.setBackgroundColor(Color.MAGENTA);
        baseLayout.addView(btn);
 
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(),
                        "μ½”λ“œλ‘œ μƒμ„±ν•œ λ²„νŠΌμž…λ‹ˆλ‹€.", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
cs

 

17 ν–‰ : λ²„νŠΌ λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κΈ°

18 ν–‰ : λ²„νŠΌμ— κΈ€μžλ₯Ό μ„€μ •ν•˜κΈ°

19 ν–‰ : λ²„νŠΌμ˜ 색상을 μ§€μ •ν•˜κΈ°. 색상을 μ§€μ •ν•˜λŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ Color ν΄λž˜μŠ€μ— μƒμˆ˜λ‘œ μ§€μ •λœ colorλ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€.(MAGENTA)

20 ν–‰ : μ€€λΉ„λœ λ²„νŠΌμ„ λ ˆμ΄μ•„μ›ƒμ— 좜λ ₯ν•œλ‹€. baseLayout은 μ•žμ„œ μƒμ„±ν•œ λ¦¬λ‹ˆμ–΄ λ ˆμ΄μ•„μ›ƒμ΄λ‹€. ν•„μš”ν•˜λ‹€λ©΄ addView() λ©”μ†Œλ“œμ— μœ„μ ― λ³€μˆ˜μ™€ λ ˆμ΄μ•„μ›ƒ νŒŒλΌλ―Έν„°λ₯Ό λ„˜κΈΈ μˆ˜λ„ μžˆλ‹€. μ§€κΈˆμ€ μœ„μ ― λ³€μˆ˜λ§Œ λ„˜κΈ°κ³  λ ˆμ΄μ•„μ›ƒμ„ μƒλž΅ν–ˆλŠ”λ°, 이럴 경우 λ””ν΄νŠΈλ‘œ layout_widthλŠ” match_parentκ°€ 되고 layout_heightλŠ” wrap_contentκ°€ λœλ‹€.

 

1 ~ 4 행을 XMLμ½”λ“œλ‘œ ν‘œν˜„ ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

<Button
	android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FF00FF"
    android:text="λ²„νŠΌμž…λ‹ˆλ‹€."/>

22 ~ 30 ν–‰ :  λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ λ¦¬μŠ€λ„ˆλ₯Ό μ½”λ”©ν•˜κΈ°

 

μ‹€ν–‰κ²°κ³Ό :

λ¦¬λ‹ˆμ–΄λ ˆμ΄μ•„μ›ƒ 상단에 생긴 λ²„νŠΌ

 

λ²„νŠΌμ„ λˆŒλ €μ„ μ‹œ λ‚˜νƒ€λ‚˜λŠ” ν† μŠ€νŠΈ λ©”μ‹œμ§€

λŒ“κΈ€