Android

[Android] 2주차 스터디 (EditText, Intent, Layout)

poppy 2020. 9. 10. 14:53
반응형

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

		//Button
        Button btn_intent = (Button)findViewById(R.id.btn_intent);
        btn_intent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
                finish();
            }
        });

		//링크
        Button btn_link = (Button)findViewById(R.id.btn_link);
        btn_link.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            	//웹사이트로 이동
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com")));
            }
        });
        
        //레이아웃
        Button btn_layout = (Button)findViewById(R.id.btn_layout);
        btn_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this, LayoutActivity.class));
            }
        });
    }
}

MainActivity 에서는 인텐트(Intent) 와 웹 사이트로 연결해주는 것을 해보았습니다. 실행하면 위와 같은 화면으로 나타납니다!

먼저, 인텐트(Intent)란?

- 액티비티 간의 전환, 특정 사이트로 링크를 연결해 줄 때, 문자열/정수/실수/ 나 Key 값을 주고 받을 때 쓰입니다.

인텐트를 쓸 때는 Intent Intent i = new Intent(출발지, 도착지); 로 해주어야 하고 이것은 액티비티 전환이 일어난 것은 아니고 선언만 해놓은 것 입니다.

주의할 점은 출발지에 this / MainActivity.class 로 쓸 경우 생성자 문제로 오류가 난다고 하므로 MainActivity.this 로 써줘야 합니다!

startActivity(내가 선언한 인텐트 객체명);  를 해서 액티비티 전환이 일어나게 해줍니다.

finish(); 로 액티비티를 끝냅니다.

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com")));  웹 브라우저를 열기 위해 ACTION_VIEW를 사용했고, 웹 브라우저 주소를 Uri.parse에 넣어줍니다.

 

Button 눌렀을 때 / 링크 눌렀을 때 / 레이아웃 눌렀을 때

위는 MainActivity에서 세 개의 버튼을 눌렀을 때 나오는 화면입니다.

 

 

MainActivity 일부를 코틀린으로 변환해서 코틀린 문법 살펴보기

class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        //Button
        val btn_intent : Button? = findViewById(R.id.btn_intent)
        //= val btn_intent = findViewById(R.id.btn_intent) as Button
        btn_intent?.setOnClickListener{ 
            startActivity(Intent(this@MainActivity, SecondActivity::class.java))
            finish()
        }
    }
}    

위의 코드를 보면서 코틀린의 특성을 몇 가지 살펴보겠습니다.

class MainActivity : AppCompatActivity 는 "클래스명 extends 상속받고자 하는 클래스" 를 의미합니다.

모든 함수를 fun으로 쓰기 때문에 접근제한을 쓰지 않습니다.

? 는 NULL을 입력받는 것을 허용할 것이냐 말 것이냐를 나타냅니다.

"클래스명?" 일 경우 NULL 값이 허용된다는 의미이고, "클래스명" 일 경우 NULL값을 허용하지 않겠다는 의미입니다.

코틀린에서 변수를 선언할 때는 val / var 을 씁니다.

val 은 상수 값으로 사용할 수 없고, 초기에 값을 할당하면 변경할 수 없습니다.

var은 가변 변수이고, 초기에 값을 할당하면 자유롭게 변경해서 사용할 수 있습니다.

코틀린은 세미콜론(;)을 쓰지 않습니다.

 

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

        final EditText et_num1 = (EditText)findViewById(R.id.et_number1);
        final EditText et_num2 = (EditText)findViewById(R.id.et_number2);
        Button add = (Button)findViewById(R.id.btn_add);
        final TextView tv = (TextView)findViewById(R.id.tv_result);

        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String num1 = et_num1.getText().toString();
                String num2 = et_num2.getText().toString();

                int num_1 = Integer.parseInt(num1);
                int num_2 = Integer.parseInt(num2);

                tv.setText(num_1 + num_2 + ""); //String만 가져올 수 있음
            }
        });

        Button btn_goto = (Button)findViewById(R.id.btn_goto);
        btn_goto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(SecondActivity.this, LayoutActivity.class);
                i.putExtra("key","hi");
                startActivity(i);
                finish();
            }
        });
    }
}

SecondAcitivity 에서는 값을 두 개 받아와서 더하기 연산을 해주고, 액티비티 간의 키 값 전달을 해보았습니다.

String num1 = et_num1.getText().toString();  et_num1의 텍스트를 가져와서 문자열로 바꿔줍니다

int num_1 = Integer.parseInt(num1);  더하기 연산을 하려면 정수여야하기 때문에 문자열을 정수로 바꿔줍니다

tv.setText(num_1 + num_2 + "");  더하기 연산을 한 값을 setText()로 tv에 나타나게 합니다

여기서 주의할 점tv.setText(num_1 + num_2); 할 경우 더하기 연산을 한 값이 나타나지 않습니다 그 이유는 setText()는 String만 가져올 수 있는데 num_1 + num_2 는 정수값이기 때문입니다. 그래서 문자열로 바꿔주는 작업이 필요합니다

i.putExtra("key","hi");  전환할 액티비티로 값을 넘겨줍니다. 키는 key이고, 값은 hi 입니다.

 

더하기 눌렀을 때 / 키전달 눌렀을 때

왼쪽 사진은 값을 넣고 더하기를 눌렀을 때 연산의 값이 화면에 나타나는 것을 보여주는 사진이고, 오른쪽 사진은 키전달을 눌렀을 때 값이 전달되어 토스트 메세지에 전달된 값이 나타나는 것을 보여주는 사진입니다.

 

LayoutActivity.java

public class LayoutActivity extends AppCompatActivity {

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

        Intent j = getIntent();
        String test = j.getStringExtra("key");
        Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show();
    }
}

LayoutActivity 에서는 인텐트를 통해 값을 받아오는 것을 해보았습니다.

String test = j.getStringExtra("key");  getStringExra에 키를 넣어줘서 키의 값을 가져옵니다
Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show();  가져온 값을 토스트메세지로 띄워줍니다

 

키전달 눌렀을 때 / 레이아웃 눌렀을 때

왼쪽 사진은 MainActivity에서 Button을 누른 후 SecondActivity에서 키전달을 눌렀을 때 화면입니다. 값이 전달되어 키의 값이 "hi" 가 토스트메세지로 나타납니다. 오른쪽 사진은 MainActivity에서 레이아웃을 눌렀을 때 화면입니다. 전달된 값이 없기 때문에 토스트메세지에 텍스트가 없는 상태로 나타납니다. 

 

반응형