CheckBox의 변화는 setOnCheckedChangeListner를 통해 리스너에 등록하여 변화를 감지하고

xml에서 RadioButton을 사용할 땐 RadioGroup 안에 넣어서 그룹핑을 해줘야 한다.


'시작함'의 체크에 변화가 있을 때 isChecked()메소드를 통하여 체크가 되있는지 확인하고

체크가 되있다면 RadioGroup, Button, ImageView를 setVisibility(View.VISIBLE))을 통해 Visible 시키고,

체크가 안되있다면 setVisibility(View.INVISIBLE)을 통해 Invisible 한다.

(Invisible은 공간을 차지하지만 화면에 뜨지 않는 것, visible이 일반적인 상태, 공간도 차지하지않고 화면에도 안뜨게 하고 싶을 땐 gone을 사용하면된다)


선택완료 버튼을 눌렀을 때 RadioGroup 내에 선택된 id값과 RadioButton들의 id값을 Switch~Case문으로 비교하여 그에 맞는 이미지를 setImageResource(R.drawable.이미지이름) 메소드를 통해 ImageView의 그림을 바꾸는데

매개변수로 0을 입력하면 null처리가 되면서 빈공간이 된다.


RadioGroup또한 clearCheck() 메소드를 통해 체크 부분을 해제할 수 있는데

이를 이용하여 초기화 버튼을 눌렀을 때 체크된 RadioButton과 ImageView를 초기화 할 수 있다.


안드로이드 스튜디오 프로젝트의 drawable폴더에 그림을 넣을 땐

원하는 그림을 복사(Ctrl + C 맥은 Command + C)하고 drawable 폴더를 클릭 후 붙여넣기 (Ctrl + v 맥은 Command + v)를 하면 창이 하나 뜬다.

OK버튼을 누르면 바로 넣어지며 그림의 첫글자는 소문자로 해야 잘 작동한다.


MainActivity.java

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.imageselector;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
    CheckBox chkStart;
    TextView tvInfo;
    RadioGroup rdoGroupPetName;
    RadioButton rdoDog, rdoCat,rdoRabbit;
    Button btnSelected,btnClear;
    ImageView ivPet;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chkStart=(CheckBox)findViewById(R.id.chkStart);
        tvInfo = (TextView)findViewById(R.id.tvInfo);
        rdoGroupPetName = (RadioGroup)findViewById(R.id.rdoGroup1);
        rdoDog = (RadioButton)findViewById(R.id.rdoDog);
        rdoCat = (RadioButton)findViewById(R.id.rdoCat);
        rdoRabbit = (RadioButton)findViewById(R.id.rdoRabbit);
        btnSelected=(Button)findViewById(R.id.btnSelected);
        btnClear=(Button)findViewById(R.id.btnClear);
        ivPet=(ImageView)findViewById(R.id.ivPet);
 
        chkStart.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(compoundButton.isChecked()){
                    rdoGroupPetName.setVisibility(View.VISIBLE);
                    btnSelected.setVisibility(View.VISIBLE);
                    tvInfo.setVisibility(View.VISIBLE);
                    ivPet.setVisibility(View.VISIBLE);
                    btnClear.setVisibility(View.VISIBLE);
                }
                else{
                    rdoGroupPetName.setVisibility(View.INVISIBLE);
                    btnSelected.setVisibility(View.INVISIBLE);
                    tvInfo.setVisibility(View.INVISIBLE);
                    ivPet.setVisibility(View.INVISIBLE);
                    btnClear.setVisibility(View.INVISIBLE);
                }
            }
        });
        btnSelected.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (rdoGroupPetName.getCheckedRadioButtonId()) {
                    case R.id.rdoDog:
                        ivPet.setImageResource(R.drawable.dog);
                        break;
                    case R.id.rdoCat:
                        ivPet.setImageResource(R.drawable.cat);
                        break;
                    case R.id.rdoRabbit:
                        ivPet.setImageResource(R.drawable.rabbit);
                        break;
                    default:
                        Toast.makeText(getApplicationContext(), "동물을 먼저 선택하세요.", Toast.LENGTH_SHORT).show();
                }
            }
        });
        btnClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rdoGroupPetName.clearCheck();
                chkStart.setChecked(false);
                ivPet.setImageResource(0); //zero is null!
            }
        });
 
    }
 
}
 
 
 
cs


activity_main.xml

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="선택을 시작하겠습니까?" />
 
    <CheckBox
        android:id="@+id/chkStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="시작함" />
 
    <TextView
        android:id="@+id/tvInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="좋아하는 애완동물은?"
        android:visibility="invisible" />
 
    <RadioGroup
        android:id="@+id/rdoGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="">
 
        <RadioButton
            android:id="@+id/rdoDog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="강아지" />
 
        <RadioButton
            android:id="@+id/rdoCat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="고양이" />
 
        <RadioButton
            android:id="@+id/rdoRabbit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="토끼" />
 
    </RadioGroup>
 
    <Button
        android:id="@+id/btnSelected"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="선택완료"
        android:visibility="invisible" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnClear"
        android:text="Clear!"
        android:visibility="invisible"/>
    <ImageView
        android:id="@+id/ivPet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible" />
 
</LinearLayout>
 
 
 
cs


사진때문에 용량이 많아서 코드와 apk만 올리겠습니다.


app-debug (2).apk


저번 포스팅에 기능을 추가함

화면을 기울임에 따라 스티치가 움직이고 특정 범위에 들어가면 액티비티 교체

전에 올렸던 터치이벤트 액티비티로 이동 (이곳에는 방향센서의 Z축을 이용하여 핸드폰이 가리키고있는 방향과 센서값이 뜸)


방향센서의 Z축은 핸드폰이 가리키는 방향을 나타낸 것으로 values[0]에 값이 저장된다

0도(360도) 일때 북쪽 90도 일때 동쪽 180도일때 남쪽 270도 일때 서쪽을 가리키는 것을 나타낸다.


방향센서의 X축은 핸드폰의 윗부분과 아랫부분으로 값을 변경하고 values[1]에 값이 저장된다

핸드폰의 윗모서리부분을 바닥으로 기울이면 X값이 양수(증가),

핸드폰의 아랫모서리부분을 바닥으로 기울이면 X값이 음수(감소)로 나온다 


방향센서의 Y축은 핸드폰의 양옆 모서리부분으로 값을 변경하고 values[2]에 값이 저장된다

오른쪽을 바닥으로 기울이면 Y값이 음수(감소),

왼쪽모서리를 바닥으로 기울이면 Y값이 양수(증가)로 적용된다. 


hw2_hjh22.apk


방향 센서를 이용하여 x,y,z의 TextView에 값이 변동되는 어플리케이션


사용하고자 하는 클래스에 implements SensorEventListener

1
2
3
4
5
private SensorManager mSensorManager;
private Sensor mOrientation;
 
mSensorManager = (SensorManager)getSystemService(Application.SENSOR_SERVICE);
mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
cs

 

방향센서를 사용할 때 사용하는 코드

5번 줄대신 다른 메소드를 사용하지만 사용법을 익히지 않아 getDefaultSensor를 사용함


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    protected void onResume(){
        super.onResume();
        mSensorManager.registerListener(this,mOrientation,SensorManager.SENSOR_DELAY_UI);
}
 
    protected void onPause(){
        super.onPause();
        mSensorManager.unregisterListener(this);
}
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() ==  Sensor.TYPE_ORIENTATION){
            z.setText(String.valueOf(-event.values[0]) );
            x.setText(String.valueOf(event.values[1]));
            y.setText(String.valueOf(event.values[2]));
 
        }
    }
 
cs

 

 

어플리케이션을 사용하는 도중 다른 화면으로 넘어갔을 때도 방향 센서를 사용하고 있기 때문에 onPause에서 해지해준뒤

onResume에서 재 등록을 해주는 것


SensorEventListener 인터페이스를 implements하면 onSensorChanged와 onAccuracyChanged 메소드를 Override하게 되는데 onSensorChanged는 센서 값이 바뀌었을 때 불리는 메소드로 여러가지의 센서를 사용 할 경우 event.sensor.getType() == Sensor.사용하는 센서이름 을 비교하여 (또는 Switch~case 문으로) 각 센서에 맞는 행동을 한다.


app-debug (1).apk




블루투스를 이용하여 이미지 파일을 전송하는 어플리케이션


Intent를 활용하여 블루투스 전송 기능을 이용하는 어플로

아래 보낼 사진의 주소+이름을 적은뒤 Send 버튼을 하면 블루투스를 검색한 뒤 넘겨준다.


게시글에 올린 apk를 다운받고 설치하면 바로 사용 할 수 있다.


app-debug.apk


onTouchEvent를 Override하여 터치를 한 곳의 좌표를 받아 그 좌표로 움직이게 하고 일정범위 안에 들어오면 Toast를 띄우면서

원래 좌표로 돌아가는 프로그램이다.


Hw1.zip


Server 소스
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
import java.lang.*;
import java.io.*;
import javax.obex.*;
import javax.microedition.io.*;
 
/**
 * Create a server that will respond to GET requests for the * default vCard.
 */
public class OBEXServer extends ServerRequestHandler {
    public OBEXServer() {
    }
 
    public static void main(String[] args) {
        SessionNotifier notify = null;
        try {
            notify = (SessionNotifier) Connector.open("tcpobex://:5005");
        } catch (IOException e) {
            System.out.println("Unable to create notifier");
            return;
        }
        // Process each request
        for (;;) {
            try {
 
                // Wait for a client to connect
                Connection server = notify.acceptAndOpen(new OBEXServer());
            } catch (IOException e) {
                System.out.println("Transport Error");
            }
        }
    }
 
    public int onGet(Operation op) {
        try {
            // Get the type of object that is being // requested
            HeaderSet head = op.getReceivedHeaders();
            String type = (String) head.getHeader(HeaderSet.TYPE);
            // Determine if it is a vCard or not
            if ((type == null|| (!type.equals("text/vCard"))) {
                return ResponseCodes.OBEX_HTTP_FORBIDDEN;
            }
            DataOutputStream out = op.openDataOutputStream();
            // Open the file to read
            InputConnection conn = (InputConnection) Connector.open("file://BobSmith.vcd");
            // Return the name of the vCard
            head = createHeaderSet();
            head.setHeader(HeaderSet.NAME, "BobSmith.vcd");
            op.sendHeaders(head);
            // Read from the file
            DataInputStream in = conn.openDataInputStream();
            int data;
            while ((data = in.read()) != -1) {
                out.write((byte) data);
            }
            // Close the open connections
            in.close();
            out.close();
            op.close();
            return ResponseCodes.OBEX_HTTP_OK;
        } catch (IOException e) {
            return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
        }
    }
}
cs


Client 소스

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.lang.*;
import java.io.*;
import javax.obex.*;
import javax.microedition.io.*;
 
/**
 * This is a sample application that uses the OBEX API defined in this chapter
 * to CONNECT and then GET the server's * vCard.
 */
public class OBEXClient {
    public static void main(String[] args) {
        ClientSession conn = null;
        StreamConnection file = null;
        // Connect to the server
        try {
            conn = (ClientSession) Connector.open("tcpobex://12.123.155.12:5005");
        } catch (IOException e) {
            System.out.println("Unable to connect to server");
            return;
        }
        // Issue a CONNECT command to connect to the OBEX
        // server
        try {
            HeaderSet response = conn.connect(null);
            if (response.getResponseCode() != ResponseCodes.OBEX_HTTP_OK) {
                System.out.println("Request Failed");
                conn.close();
                return;
            }
        } catch (IOException e) {
            System.out.println("Transport failed");
            return;
        }
        // Issue a GET command to the OBEX server and
        // write the object to a file
        try {
            // Set the name of the object to retrieve
            HeaderSet head = conn.createHeaderSet();
            head.setHeader(HeaderSet.TYPE, "text/vCard");
            // Issue the request
            Operation op = conn.get(head);
            // Get the correct streams to process the request
            InputStream in = op.openInputStream();
            // Open the file to write to
            head = op.getReceivedHeaders();
            file = (StreamConnection) Connector.open((String) head.getHeader(HeaderSet.NAME));
            OutputStream out = file.openOutputStream();
            // Read and write the data
            int data = in.read();
            while (data != -1) {
                out.write((byte) data);
                data = in.read();
            }
            // End the operation
            out.close();
            file.close();
            in.close();
            op.close();
            // DISCONNECT from the server
            conn.disconnect(null);
        } catch (IOException e) {
            System.out.println("Unable to read/write file");
        } finally {
            // Close the transport layer connection
            try {
                conn.close();
            } catch (Exception e) {
            }
        }
    }
}
cs


Ctrl + Shift + F : 자동 정렬

Ctrl + Shift + O : 자동 import


MAC은 Ctrl 대신 Command를 누르면 됩니다.

준비물 : 이클립스, 다운받은 javax 라이브러리, 라이브러리를 추가할 프로젝트


1. 프로젝트를 오른쪽 클릭 후 Properties에 들어간다.

2. Java Build Path를 누른다.

3. Libraries를 누른다.

4. Add External JARs 를 누른다.

5. 다운받은 javax 라이브러리를 추가한다.


이후 코드내에서 추가한 라이브러리를 import할 수 있다.

JSR(Java Specification Requests)은 자바 플랫폼에 대한 규격을 제안하거나 기술한 것을 말한다.


https://jcp.org/en/jsr/all




두 EditText에 있는 값을 아래의 5개 버튼을 누르면 계산결과가 TextView에 나오는 프로그램

실수 끼리 연산했을 경우 결과는 실수, 정수끼리 연산했을 경우 정수로 처리함.
문자가 들어가있을 경우, 0으로 나눌경우 예외처리가 되있음


MainActivity.class

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.calculater;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
    EditText edt1, edt2;
    Button btAdd, btSub, btMul, btDiv,btNa;
    TextView tvOutput;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edt1 = (EditText) findViewById(R.id.edt1);
        edt2 = (EditText) findViewById(R.id.edt2);
        btAdd = (Button) findViewById(R.id.btAdd);
        btSub = (Button) findViewById(R.id.btSub);
        btMul = (Button) findViewById(R.id.btMul);
        btDiv = (Button) findViewById(R.id.btDiv);
        btNa=(Button) findViewById(R.id.btNa);
 
        tvOutput = (TextView) findViewById(R.id.tvOutput);
        btAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double iTemp1 = 0, iTemp2 = 0;
                try {
                    iTemp1 = Double.valueOf(edt1.getText().toString());
                    iTemp2 = Double.valueOf(edt2.getText().toString());
                    double result = iTemp1 + iTemp2;
                    if(result == (int)result) {
                        int iChange = (int) result;
                        tvOutput.setText("계산 결과 : "+String.valueOf(iChange));
                    }
                    else
                    {
                        tvOutput.setText("계산 결과 : "+String.valueOf(result));
                    }
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "입력에 문자가 있습니다.", Toast.LENGTH_SHORT).show();
                }
 
            }
        });
        btSub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double iTemp1 = 0, iTemp2 = 0;
                try {
                    iTemp1 = Double.valueOf(edt1.getText().toString());
                    iTemp2 = Double.valueOf(edt2.getText().toString());
                    double result = iTemp1 - iTemp2;
                    if(result == (int)result) {
                        int iChange = (int) result;
                        tvOutput.setText("계산 결과 : "+String.valueOf(iChange));
                    }
                    else
                    {
                        tvOutput.setText("계산 결과 : "+String.valueOf(result));
                    }
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "입력에 문자가 있습니다.", Toast.LENGTH_SHORT).show();
                }
 
            }
        });
        btMul.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double iTemp1 = 0, iTemp2 = 0;
                try {
                    iTemp1 = Double.valueOf(edt1.getText().toString());
                    iTemp2 = Double.valueOf(edt2.getText().toString());
                    double result = iTemp1 * iTemp2;
                    if(result == (int)result) {
                        int iChange = (int) result;
                        tvOutput.setText("계산 결과 : "+String.valueOf(iChange));
                    }
                    else
                    {
                        tvOutput.setText("계산 결과 : "+String.valueOf(result));
                    }
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "입력에 문자가 있습니다.", Toast.LENGTH_SHORT).show();
                }
            }
 
        });
        btDiv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double iTemp1 = 0, iTemp2 = 0;
                try {
                    iTemp1 = Double.valueOf(edt1.getText().toString());
                    iTemp2 = Double.valueOf(edt2.getText().toString());
                    double result = iTemp1 / iTemp2;
                    if(result == (int)result) {
                        int iChange = (int) result;
                        tvOutput.setText("계산 결과 : "+String.valueOf(iChange));
                    }
                    else
                    {
                        tvOutput.setText("계산 결과 : "+String.valueOf(result));
                    }
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "입력에 문자가 있거나 0으로 나눌수 없습니다", Toast.LENGTH_SHORT).show();
                }
 
            }
 
        });
        btNa.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int iTemp1 = 0, iTemp2 = 0;
                try {
                    iTemp1 = Integer.parseInt(edt1.getText().toString());
                    iTemp2 = Integer.parseInt(edt2.getText().toString());
                    int result = iTemp1 % iTemp2;
                    tvOutput.setText(String.valueOf(result));
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "입력에 문자가 있습니다.", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
 
}
cs


activity_main.xml

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">
 
    <EditText
        android:id="@+id/edt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"/>
    <EditText
        android:id="@+id/edt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"/>
    <Button
        android:id="@+id/btAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="더하기"/>
    <Button
        android:id="@+id/btSub"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="빼기"/>
    <Button
        android:id="@+id/btMul"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="곱하기"/>
    <Button
        android:id="@+id/btDiv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="나누기"/>
    <Button
        android:id="@+id/btNa"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="나머지 값"/>
    <TextView android:id="@+id/tvOutput"
        android:text="계산결과"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
 
</LinearLayout>
cs


Calculater 2.zip


+ Recent posts