Activity 간 데이터 넘기기 실습
#Activity 로 데이터 넘기기 실습
Main 액티비티에서 Detail 액티비티로 데이터를 전달해보려고 한다. Main 액티비티에서는 리스트로 글 번호만 보여주고, Detail 액티비티에서 상세 정보를 보여줄려고 한다.
이것을 그림으로 나타내면 아래와 같다.
1. 프로젝트를 생성한다.
Application name은 실제로 핸드폰에서 어플리케이션 이름이 되므로, 잘 정해주는 것이 좋다.
2. 패키지와 자바 클래스를 다음과 같이 만든다.
3. ArticleVO에 생성자와 Getter, Setter를 추가한다.
Alt + Insert를 누르면 Generator 창이 뜬다. Getter and Setter에서 모두 선택하고, Constructor를 눌러서 모두 선택한다.
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 | package com.ktds.smahn.simpleboard.vo;
/** * Created by smahn on 2016-06-08. */ public class ArticleVO {
private int articleNo; private String subject; private String description; private String author;
public ArticleVO(int articleNo, String subject, String description, String author) { this.articleNo = articleNo; this.subject = subject; this.description = description; this.author = author; }
public int getArticleNo() { return articleNo; }
public void setArticleNo(int articleNo) { this.articleNo = articleNo; }
public String getSubject() { return subject; }
public void setSubject(String subject) { this.subject = subject; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; } }
|
3. SimpleDB.java 내용을 작성한다.
Static을 붙인 이유는 다른 클래스에서 똑같은 것을 받아오기 위함이다.
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 | package com.ktds.smahn.simpleboard.db;
import com.ktds.smahn.simpleboard.vo.ArticleVO;
import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;
/** * Created by smahn on 2016-06-08. */ public class SimpleDB {
private static Map<String, ArticleVO> db = new HashMap<String, ArticleVO>();
public static void addArticle(String index, ArticleVO articleVO) { db.put(index, articleVO); }
public static ArticleVO getArticle(String index) { return db.get(index); }
public static List<String> getIndexes(){ Iterator<String> keys = db.keySet().iterator();
List<String> keyList = new ArrayList<String>(); String key = ""; while ( keys.hasNext() ) { key = keys.next(); keyList.add(key); } return keyList; } }
|
4. Activity_main.xml 수정
LinearLayout으로 바꾼다.
android:orientation="horizontal" 를 추가한다.
android:id="@+id/listView" 를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" 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="com.ktds.smahn.simpleboard.MainActivity">
</LinearLayout> |
5. 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 | package com.ktds.smahn.simpleboard;
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.AppCompatButton; import android.widget.Button; import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
LinearLayout ll = (LinearLayout) findViewById(R.id.listView); Button button = new AppCompatButton(this); button.setText("코드로 만든 버튼입니다.");
ll.addView(button); } }
|
6. 초기 DB를 만들기 위해 prepareSimpleDB 메소드를 추가한다.
private void prepareSimpleDB(){
for ( int i = 1; i < 100; i++ ){
SimpleDB.addArticle( i + "번글",
new ArticleVO(i, i + "번글 입니다.", i + "번글 내용입니다.","내가 씀"));
}
}
7. 그리고 게시글만큼 버튼을 만들어주기 위해서 onCreate메소드에 내용을 추가해준다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prepareSimpleDB();
LinearLayout ll = (LinearLayout) findViewById(R.id.listView);
//반복 시작
for(int i = 0; i < SimpleDB.getIndexes().size(); i++ ){
Button button = new AppCompatButton(this);
button.setText(SimpleDB.getIndexes().get(i));
ll.addView(button);
}
//반복 끝
}
이렇게 하면 1번글, 2번글, 3번글 …. 이렇게 버튼이 나오게 될 것이다.
8. 실행을 해보자.
스크롤이 없어서 다 나오지 않는다.
9. 스크롤을 만들어주기 위해서 activity_main.xml에서 아래를 추가해준다.
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:id="@+id/itemList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</ScrollView>
match_parent는 꽉 채우라는 뜻이다.
이거는 일단 쓰기만하고, 나중에 다시 배울 것이다.
10. MainActivity.java 수정
LinearLayout ll = (LinearLayout) findViewById(R.id.itemList);
11. 실행해보자.
이제 스크롤이 생겨서 버튼이 100개 생겼다.
12. 이제 버튼을 누르면 상세 페이지로 넘어가야 한다. 그렇기 때문에 아래 부분을 추가해주어야 한다.
이 부분이 중요하다!!! Key라는 이름으로 인텐트를 보냈다.
13. DetailActivity.java를 생성한다.
14. DetailActivity에서 intent를 받아서 처리해준다.
StringExtra를 쓴 이유 : intent에 들어간 데이터가 String 타입이므로.
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 | package com.ktds.smahn.simpleboard;
import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity;
import com.ktds.smahn.simpleboard.db.SimpleDB; import com.ktds.smahn.simpleboard.vo.ArticleVO;
public class DetailActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail);
Intent intent = getIntent();
//StringExtra를 쓴 이유 : intent에 들어간 데이터가 String 타입이므로. String key = intent.getStringExtra("key");
//key에 맞는 article을 가져온다. ArticleVO articleVO = SimpleDB.getArticle(key); } }
|
15. Activity_detail.xml 에 textview만들기
Id를 만들때는 앞글자만 따서 쓴다. Ex. textView → tv아이디이름
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 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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: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="com.ktds.smahn.simpleboard.DetailActivity">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/tvSubject" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/tvArticleNumber" android:layout_alignBottom="@+id/tvSubject" android:layout_toRightOf="@+id/tvSubject" android:layout_toEndOf="@+id/tvSubject" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/tvAuthor" android:layout_below="@+id/tvArticleNumber" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/tvDescription" android:layout_below="@+id/tvAuthor" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
|
16. DetailActivity.java 에서 textview 내용 담기
Textview들은 멤버변수로 적어준다. 왜냐하면, 그래야 onStart, onResume 이런 애들이 접근할 수 있다.
onBackPressed 메소드는 뒤로가기 버튼을 눌렀을 때 토스트 메시지가 뜨게끔 하는 것이다.
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 | package com.ktds.smahn.simpleboard;
import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import android.widget.Toast;
import com.ktds.smahn.simpleboard.db.SimpleDB; import com.ktds.smahn.simpleboard.vo.ArticleVO;
public class DetailActivity extends AppCompatActivity {
private TextView tvSubject; private TextView tvArticleNumber; private TextView tvAuthor; private TextView tvDescription;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail);
tvSubject = (TextView) findViewById(R.id.tvSubject); tvArticleNumber = (TextView) findViewById(R.id.tvArticleNumber); tvAuthor = (TextView) findViewById(R.id.tvAuthor); tvDescription = (TextView) findViewById(R.id.tvDescription);
Intent intent = getIntent();
//StringExtra를 쓴 이유 : intent에 들어간 데이터가 String 타입이므로. String key = intent.getStringExtra("key");
//key에 맞는 article을 가져온다. ArticleVO articleVO = SimpleDB.getArticle(key);
tvSubject.setText(articleVO.getSubject()); tvArticleNumber.setText(articleVO.getArticleNo() + “”); tvAuthor.setText(articleVO.getAuthor()); tvDescription.setText(articleVO.getDescription()); }
@Override public void onBackPressed(){ super.onBackPressed(); Toast.makeText(DetailActivity.this, "액티비티를 종료합니다.", Toast.LENGTH_SHORT).show(); } }
|
17. 실행한다.
56번글 버튼을 클릭하면 잘 나온다!
18. MainActivity.java 에 메소드 추가
보통은 두번 뒤로가기 버튼을 누르면 앱이 종료된다. 최초 번은 안꺼지게 하고, 두번 눌렀을 때 그 누르는 시간이 2초 이하이면 종료가 되게끔 해보자.
private long pressedTime;
@Override
public void onBackPressed() {
//super.onBackPressed();
if( pressedTime == 0 ) {
Toast.makeText(MainActivity.this, "한번 더 누르면 종료됩니다", Toast.LENGTH_LONG).show();
pressedTime = System.currentTimeMillis();
}
else {
int seconds = (int) ((System.currentTimeMillis() - pressedTime));
if ( seconds > 2000 ) {
Toast.makeText(MainActivity.this, "한번 더 누르면 종료됩니다", Toast.LENGTH_LONG).show();
pressedTime = 0;
}
else {
//앱을 종료한다.
finish();
}
}
}