티스토리 뷰

#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;

   }

}

Colored by Color Scripter

cs





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;

   }

}

Colored by Color Scripter

cs




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>


Colored by Color Scripter

cs



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);

   }

}

Colored by Color Scripter

cs



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);

   }

}

Colored by Color Scripter

cs



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>

Colored by Color Scripter

cs



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();

   }

}

Colored by Color Scripter

cs



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();

      }


  }

}


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함