[안드로이드] 인텐트 활용 : 데이터 교환(2)

2021. 1. 2. 13:24·Android/Java
반응형

본 게시글은

'Do It! 안드로이드 프로그래밍 개정7판' / '단계별로 배우는 안드로이드 프로그래밍'

두 권의 교재를 통해 학습한 내용을 스스로 정리하는 목적으로 작성한 게시글 입니다.


Do It 안드로이드 프로그래밍의 '도전! 08'을 해결해보고자 한다.

우선 로그인 화면, 메인메뉴 화면, 서브메뉴 화면을 만들어 주었다.

012

로그인 화면에서 로그인 버튼을 눌렀을 때 메인메뉴로 갈 수 있게 리스너를 등록한다.

이때 아이디와 비밀번호 모두 입력이 되어 있는지 체크해야 한다.

public class MainActivity extends AppCompatActivity {

    public final int LOGIN = 101;
    EditText editTextId, editTextPW;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextId = findViewById(R.id.editTextId);
        editTextPW = findViewById(R.id.editTextTextPassword);
        
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (editTextId.getText().toString().equals("")) {
                    Toast.makeText(getApplicationContext(), "아이디를 입력하세요.", Toast.LENGTH_SHORT).show();
                } else if (editTextPW.getText().toString().equals("")) {
                    Toast.makeText(getApplicationContext(), "비밀번호를 입력하세요.", Toast.LENGTH_SHORT).show();
                } else {
                    Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                    startActivityForResult(intent, LOGIN);
                }
            }
        });
    }
}

아이디나 비밀번호가 비어있다면 토스트를 띄워 입력을 요구하는 메세지를 보내고,

다 채워져 있다면 메인 메뉴 액티비티로 넘어간다.

 

다음으로 메인 메뉴 액티비티의 버튼들에 함수를 연결지어 줄 것이다.

서브 메뉴는 사진에서 만든 것처럼 하나만 만들고, 각 버튼마다 다르게 디자인 하는 식으로 꾸미고자 한다.

서브 메뉴 액티비티 3개를 따로 만드는건 귀찮으니까 ㅋㅋ

public class MenuActivity extends AppCompatActivity {

    public final int CUSTOMER = 101, SELL = 102, STOCK = 103;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
    }

    public void onButtonClicked(View v) {
        Intent intent = new Intent(this, SubMenu1.class);
        switch (v.getId()) {
            case R.id.button1: // 고객 관리
                startActivityForResult(intent, CUSTOMER);
                break;
            case R.id.button2: // 매출 관리
                startActivityForResult(intent, SELL);
                break;
            case R.id.button3: // 상품 관리
                startActivityForResult(intent, STOCK);
                break;
        }
    }
}

 

이제 서브 메뉴의 버튼들에도 코드를 달아준다.

 

public class SubMenu1 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub_menu1);
        
        Button buttonToLogin = findViewById(R.id.button1);
        Button buttonToMenu = findViewById(R.id.button2);
        
        buttonToLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("to", "login");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
        
        buttonToMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("to", "menu");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

사실 이 부분에서 고민이 좀 많았다.

로그인 버튼을 눌렀을 때 바로 로그인 화면으로 돌아가야 하는데,

로그인 액티비티를 새로 띄우자니 새로운 액티비티가 만들어져 버려서

onActivityResult 메소드가 작동하지 않을 것 같았다.

 

플래그를 떠올려봤으나, 아직 책에서는 개념 소개만 하고 구현 방법은 설명하지 않아서

아직 플래그를 활용하기는 힘들어 보였다.

그래서 메인 메뉴에서 인텐트에 들어있는 최종 목적지 데이터를 체크하고,

최종 목적지가 login 인 경우, 메인 메뉴에서 한번더 finish() 메소드를 실행시키는 방법을 떠올렸다.

 

이제 메인 메뉴의 onActivityResult 메소드를 설정한다.

 

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Intent recvIntent = data;
        String from="", to = recvIntent.getStringExtra("to");
        switch (requestCode) {
            case CUSTOMER:
                from = "customer";
                break;
            case SELL:
                from = "sell";
                break;
            case STOCK:
                from = "stock";
                break;
        }

        if (to.equals("login")) {
            Intent sendIntent = new Intent();
            sendIntent.putExtra("to", "login");
            sendIntent.putExtra("from",from);
            setResult(RESULT_OK, sendIntent);
            finish();
        } else if (to.equals("menu")) {
            Toast.makeText(this, "it comes from " + from, Toast.LENGTH_SHORT).show();
        }
    }

목적지가 login 인지 확인하고, login 이면 다시 인텐트를 만들어 setResult를 수행하고

액티비티를 종료하도록 하였다.

menu가 목적지였다면 그에 맞게 토스트를 띄워주도록 하였다.

 

마지막으로 로그인 화면에서 토스트를 띄워주도록 설정한다.

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Intent recvIntent = data;
        if (recvIntent.getStringExtra("to").equals("login")) {
            Toast.makeText(this, "It comes from" + recvIntent.getStringExtra("from"), Toast.LENGTH_SHORT).show();
        }
    }

잘 실행되는지 확인해보았다.

012345

성공적으로 동작하는 모습을 확인 할 수 있다

다음에는 프래그먼트에 대한 내용을 정리해보고자 한다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'Android > Java' 카테고리의 다른 글

[안드로이드] getWidth() 와 getMeasuredWidth()  (0) 2021.03.20
[안드로이드] Constraint Layout 동적 생성 후 동적으로 뷰 추가하기  (0) 2021.03.20
[안드로이드] 프래그먼트(Fragment)  (0) 2021.01.03
[안드로이드] 인텐트 활용 : 데이터 교환(1)  (0) 2021.01.01
[안드로이드] 인텐트의 개념  (0) 2021.01.01
'Android/Java' 카테고리의 다른 글
  • [안드로이드] Constraint Layout 동적 생성 후 동적으로 뷰 추가하기
  • [안드로이드] 프래그먼트(Fragment)
  • [안드로이드] 인텐트 활용 : 데이터 교환(1)
  • [안드로이드] 인텐트의 개념
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (615)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (45)
        • 생각 정리 (23)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[안드로이드] 인텐트 활용 : 데이터 교환(2)
상단으로

티스토리툴바