https://survivalcoding.com/p/android_basic
위 서적을 참고하였습니다.
저번 포스트에선 putExtra()와 getExtra()로만 가지고 화면간 데이터를 전송하는 프로그램을 만들어봤는데요, 이번엔 서로 다른 액티비들 간에 데이터를 서로 주고받는 프로그램을 만들어 보겠습니다.
먼저 레이아웃을 두 개 준비해 보겠습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edit_text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="이름"/>
<EditText
android:id="@+id/edit_text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="나이"/>
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="전송"/>
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="결과"/>
</LinearLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity"
android:orientation="vertical">
<TextView
android:id="@+id/txt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="result"/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="전달"/>
</LinearLayout>
activity_main.xml |
activity_second.xml |
이렇게 main.xml과 second.xml이 만들어진 모습을 볼 수 있습니다.
그 다음 자바코드를 작성하러 가보겠습니다.
MainActivity.java
package hello.world.study;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
import static android.provider.AlarmClock.EXTRA_MESSAGE;
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE = 1000;
private EditText editText1, editText2;
private Button button;
private Intent intent;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1 = (EditText)findViewById(R.id.edit_text1);
editText2 = (EditText)findViewById(R.id.edit_text2);
textView = (TextView)findViewById(R.id.txt1);
intent = new Intent(this,SecondActivity.class);
button = (Button)findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intent.putExtra("name", editText1.getText().toString());
intent.putExtra("age", editText2.getText().toString());
startActivityForResult(intent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
String result = data.getStringExtra("result");
textView.setText(result);
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT);
}
}
}
SecondActivity.java
package hello.world.study;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity implements View.OnClickListener {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
String name = intent.getStringExtra("name");
String age = intent.getStringExtra("age");
textView = (TextView)findViewById(R.id.txt2);
textView.setTextSize(30);
textView.setText(name+ "\n"+ age);
findViewById(R.id.btn2).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("result", textView.getText().toString());
setResult(RESULT_OK, intent);
finish();
}
}
이 두 액티비티의 실행 과정을 먼저 설명드리겠습니다.
1. EditText()값을 getText().toString()으로 받아와서 변수에 저장 후 putExtra()를 통해 데이터를 전달합니다. 여기서 startActivity(intent, REQUEST_CODE)를 호출하는 것을 볼 수 있는데요, 이는 SecondActivity를 실행하는 동시에 REQUEST_CODE라는 요청값을 넘겨준다는 뜻입니다. 나중에 SecondActivity에서 다시 값을 받을 때 REQUEST_CODE값도 같이 넘어오며, 어떤 요청의 결과인지를 구분지을 수 있습니다.
2. MainActivity에서 받아온 값을 getStringExtra()값으로 변수에 저장 후 다시 putExtra()로 값을 넘겨주고 setResult()에 있는 RESULT_OK와 결과에 대한 intent객체를 이 액티비티를 호출한 액티비티(MainActivity)로 돌려줄 수 있습니다. 여기서 RESULT_OK는 데이터를 넘기는데 성공을 했다는 뜻으로 사용됩니다. 마지막으로 finish()메소드로 종료하면 SecondActivity는 종료되고 MainActivity가 보이게 됩니다.
3. 이제 MainActivity의 onActivityResult()를 override를 해줍니다. 그리고 if()문을 사용하여 requestCode == REQUEST_CODE(1000)인지 확인하고, resultCode == RESULT_OK가 제대로 값이 넘어왔는지, 그리고 data가 널값이 아닌지를 체크해줍니다. 1번에서 말했듯이 REQUEST_CODE는 다시 값이 넘어옵니다.
MainActivity.java |
SecondActivity.java |
MainActivity.java |
사진을 보시는 것과 같이 제대로 나왔습니다.
버튼클릭 이벤트를 두가지로 나눠서 구현을 해봤는데요, MainActivity는 Anonymus inner class로 구현을 한 번 해봤습니다. 이 외에도 다양한 클릭 이벤트에 대한 예가 있는데요, 다음에 한 번 정리해보도록 하겠습니다. 감사합니다.
'Android > Android' 카테고리의 다른 글
[Android] 안드로이드 Adapter와 AdapterView, BaseAdapter (1) (0) | 2020.06.10 |
---|---|
[Android] 안드로이드 리스트뷰 모서리 둥글게 만들기 (0) | 2020.06.09 |
[Android] 안드로이드 액티비티 이동 및 데이터 보내기 (0) | 2020.06.05 |
[Android] 안드로이드 스튜디오 프로젝트 구성 요소 살펴보기 (0) | 2020.06.05 |
[Android] 안드로이드 스튜디오 프로젝트 생성 (0) | 2020.06.03 |