오늘은 StartActivityForResult를 통해 값을 얻어올 것이다.

 

우선 startactivity() 메서드와 startActivityForResult() 메서드의 차이를 알아야 할 것이다.

startactivity()메서드는 단순히 어떤 액티비티를 시작하기 위한 용도로 사용되며

startActivityForResult()메서드는 단순히 액티비티를 시작하는 것만이 아닌 시작한 액티비티를 통해 어떠한 결과 값을 받아오기 위해 사용하는 것이다.

 

 

간단하게 레이아웃을 설정해보자

 

<?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=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="값을 가져와 주세요"
        android:textSize="30sp"
        android:id="@+id/tv_comback"/>

    <Button
        android:id="@+id/btn_go"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="go"/>
</LinearLayout>

메인 액티비티 레이아웃을 설정해 주었고

 

<?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=".SubActivity">

    <EditText
        android:id="@+id/et_comback"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="메인으로 보낼 값을 입력해 주세요"/>

    <Button
        android:id="@+id/btn_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="종료"/>

</LinearLayout>

서브 액티비티 레이아웃을 설정했다 서브 액티비티의 EditText 값을 입력해 주고 종료 버튼을 누르면 메인 액티비티의 TextView로 값이 전달하게 만들 것이다.

 

이제 MainActivity.java로 가서 코드를 작성해 보자!

 

기본적으로 TextView와 Button의 객체를 만들어 주고 각각 id 값을 넣어줍니다.

 

그리고 REQUEST_CODE = 999 라는 상수를 선언합니다.

 

btn_go 버튼 클릭시 이벤트를 작성해 줍니다.

 

여기서 Intent를 사용하여 SubActivity로 전환하게 한다 startActivityForResult()메서드에는 인자가 2개 들어가게 되는데 

첫 번째 인자는 intent가 들어가고 두 번째 인자에는 위에 선언했던 RESULT_CODE 상수 값을 넣어 결과를 요청할 때 확인할 요청 코드를 보낸다.

 

 

다음 SubActivity.java에서 코드를 작성합니다,

 

메인 액티비티와 같이 기본적으로 EditText와 Button의 객체를 생성하고 각각 id값을 넣어줍니다.

 

 

 

 

btn_close버튼 클릭시 이벤트를 작성해 줍니다.

여기도 intent 객체를 생성해주고 intent.putExtra()메서드를 사용하여 값을 저장해 줍니다.

putExtra()메서드의 첫 번째 인자는 id값이며 두 번쨰 인자에 저장할 값을 넣어줍니다.

다음 setResult()에 결과값을 설정합니다. RESULT_OK는 안드로이드에서 기본적으로 제공하는 상수 값이다

finish()메서드는 현재 액티비티를 종료해주는 것이다

 

 

 

다음 메인 액티비티에서 onCreate생명주기 밖에서 결과를 받아오기 위해 ctrl + o 누른 다음에  onActivityResult()를 오버라이딩 해줍니다

 

 

onActivityResult()메서드는 3개의 인자가 넘어오고 있는 것을 확인할 수 있다.

첫 번째는 resquestCode, 두 번째는 resultCode, 세 번쨰 인자는 Intent 객체가 넘어온다

 

SubActivity에서 setResult메서드를 설정해 주었으므로 resultCode가 RESULT_OK 같으면 Toast 수신 성공 메시지를 만들어 주고 그렇지 않으면 수신 실패 메시지를 만들어 줍니다

 

그리고

메인 액티비티에서 btn_go 버튼을 눌러 REQUEST_CODE를 담아 보냈으며 다시 돌아올 떄도 requestCode에 맞게 돌아왔는지 검사합니다

requestCode가 REQUEST_CODE가 같으면 Intent 객체 data를 통해 값을 받아와서 우리가 원하던 tv_comback(TextView)에 값을 넣어줍니다.

 

 

이제 빌드를 해주면

 

 

값을 입력해 주고 종료 버튼을 누르면

 

 

 

값이 전달되는 것은 물론 수신 성공 토스트 메시지도 잘 확인할 수 있다!!

 

'안드로이드 스튜디오~' 카테고리의 다른 글

안드로이드 (뒤로 가기 두 번 눌러 종료하기)  (0) 2020.01.04
Spinner(드롭다운 메뉴)  (0) 2020.01.03
Dialog (팝업창 만들기)  (0) 2019.12.29
Fragment  (0) 2019.12.28
DrawerLayout  (0) 2019.12.26

오늘은 back 버튼을 두 번 눌러 앱을 종료하는 기능을 구현해 볼 것이다.

보통 사용자들이 앱을 사용할 때 뒤로 가기를 실수로 누르거나 내비게이션 메뉴를 닫으려 하다가 앱이 종료되는 등 이런 버그 현상들을 막기 위해 간단하게 만들어 볼 것이다!

 

 

MainActivity.java에서 코드를 작성해 주면 된다

 

 

전역 변수 long 타입 backBtnTime 을 0으로 설정해 줍니다.

 

onCreate 생명주기 밑에 ctrl + o 를 눌러 onBackPressed()를 만들어줍니다.

 

curTime 은 현재 시간 밀리세컨드로 설정해 주고 gapTime은 현재 시간 curTime 에서 backBtnTime을 누른 시간을 빼줍니다.

 

다음 조건문으로 gapTime이 0보다 크고 2000보다 작으면 즉 gapTime이 0초에서 2초 사이에 한번 더 누르게 되면 뒤로 가기가 실행되고 아니면 Toast메시지를 뛰우도록 합니다.

 

 

앱을 실행하고 back 버튼을 한 번 누르면 Toast 메시지가 잘 나오게 됩니다.

 

 

앱을 종료하려면 2초안에 back 버튼을 두 번 누르게 되면 정상적으로 앱이 종료되는 것을 확인할 수 있습니다.!!

'안드로이드 스튜디오~' 카테고리의 다른 글

StartActivityForResult  (0) 2020.01.05
Spinner(드롭다운 메뉴)  (0) 2020.01.03
Dialog (팝업창 만들기)  (0) 2019.12.29
Fragment  (0) 2019.12.28
DrawerLayout  (0) 2019.12.26

Spinner란 드롭다운을 말하고 펼쳐지는 메뉴이며 여러개의 값 중 1개를 선택하기 위해 사용하는 안드로이드에서 제공해주는 기본 위젯이다.

 

드롭다운 메뉴를 xml을 이용해서 만들어 보자!

 

처음에 res폴더 -> values폴더에 array.xml을 만들어 줍니다.

 

이런식으로 만들어 주고 array.xml에 작성해줍니다

 

이곳에서 드롭다운에 들어갈 메뉴들의 항목들을 작성해줍니다.

배열의 이름을 자유롭게 test로 선언해주고 <item></item>에 실제 들어갈 항목들을 여러가지 적어주시면 됩니다.

 

이제 메인 액티비티를 설정해줍니다.

 

<?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=".MainActivity">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="150dp"
        android:layout_height="40dp"
        android:entries="@array/test">
    </Spinner>

    <TextView
        android:id="@+id/tv_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="드롭다운 결과"/>
</LinearLayout>

 

 

스피너를 설정할 때 android:entries="@array/test">로 데이터를 연동해줍니다.

 

간단하게 드롭다운 메뉴 하나를 클릭시 텍스트 결과창에 띄울 것이다.

 

다음 MainActivity.java에서 코드를 작성해줍니다.

 

 

 

spinner와 tv_result 객체를 만들어 주고 각각의 id값을 찾아 넣어줍니다.

 

 

드롭다운 아이템을 눌렀을 떄 대한 리스너를 만들어줍니다 setOnItemSelectedListener()을 선택해줍니다. 이 리스너 안에 new AdapterView.OnItemSelectedListener() 넣어주면 두가지 메소드 중에서 onItemSelected 메소드에 결과값을 넣어줍니다.

 

그리고 빌드를 해주면

 

 

 

드롭다운 메뉴 선택 시 텍스트 결과에 값이 나오게 됩니다.

'안드로이드 스튜디오~' 카테고리의 다른 글

StartActivityForResult  (0) 2020.01.05
안드로이드 (뒤로 가기 두 번 눌러 종료하기)  (0) 2020.01.04
Dialog (팝업창 만들기)  (0) 2019.12.29
Fragment  (0) 2019.12.28
DrawerLayout  (0) 2019.12.26

Dialog는 기본 액티비티에 전체적인 화면 안에다가 부가적으로 화면을 띄우고 싶을 때  많이 활용하는 것이다.

 

우선 간단하게 레이아웃을 설정해 보자!

 

<?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=".MainActivity">

    <Button
        android:id="@+id/btn_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="다이얼로그" />


    <TextView
        android:text="테스트"
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"/>

</LinearLayout>

 

이런식으로 정말 간단하게 부모 LinearLayout 안에 버튼과 TextView를 만들어 줍니다.

 

 

이제 MainActivity.java에서 설정해 줍니다.

 

 

버튼과 TextView에 대해 각각의 id값을 넣어주고

 

버튼 클릭시 Dialog 팝업창이 뜨게 할 것이다.

여기서 AlertDialog를 사용할 것인데 AlertDialog는 사용자의 전체 화면을 가리지 않으면서 사용자의 응답이나 추가 정보를 입력하도록 하는 작은 창을 의미합니다.

 

 

AlertDialog에 여러정보를 Setting을 하려면 먼저 AlertDialog.Buider 객체를 생성합니다. Builder 클래스에서 제공하는 다양한 함수들을 사용하여 AlertDialog에 여러 정보를 Setting 하는데 위 예제에서는 setIcon()함수로 원하고자 하는 아이콘을 설정하고  setTitle() 함수를 사용하여 다이얼로그 창의 제목을 설정하고 setMessage() 함수를 통해 다이얼로그 창을 통해 사용자에게 보여주고 싶은 Message를 지정하고 팝업창에서 EditText를 통해 질문에 대한 응답을 할 수 있도록 setView() 함수로 포함시킵니다.  

 

 

그 다음 setPositiveButton() 함수로 확인 버튼을 만들어 주고 인자 정보는 첫 번째 인자로 Button의 Text 속성으로 지정할 문자열 값 또는 문자열 리소스 ID 값을 넘겨줍니다.

두 번째 인자는 해당 버튼을 클릭하였을 때 이벤트 처리를 위한 DialogInterface.OnClickListener 구현체를 넘겨줍니다. 위 예제에서는 익명 클래스 생성 방식으로 구현하였으며 onClick() 함수를 오버 라이딩하여 그 안에 해당 버튼을 클릭하였을 때 처리할 동작을 정의하면 됩니다.

 

이제 확인 버튼 클릭시 발생하는 이벤트를 설정해 줍니다. String result 값에 EditText의 문자열들을 getText()로 문자열 형태로 받아오고 TextView에 setText(result)로 그 값을 설정해 줍니다. 이렇게 이벤트가 발생하고 나서 팝업창을 닫을 수 있게 dialog.dismiss(); 를 적어주면 팝업창은 닫게 됩니다.

 

마찬가지로 setNegativeButton() 함수로 취소 버튼을 만들어 주고 new DialogInterface.OnClickListener 을 통해

취소 버튼 클릭시 발생하는 이벤트를 설정해 줍니다. 취소 버튼 클릭시 다른 이벤트가 필요 없이 팝업창을 닫게 할 것이므로 dialog.dismiss(); 를 통해 간단하게 만들 수가 있습니다.

 

그리고 마지막으로 AlertDialog 객체에 show() 함수를 통해 다이얼로그 창을 화면에 보여주게 됩니다.

ad.show();

 

실행 화면

 

 

확인 버튼 클릭시

 

이렇게 잘 작동합니다!!

'안드로이드 스튜디오~' 카테고리의 다른 글

안드로이드 (뒤로 가기 두 번 눌러 종료하기)  (0) 2020.01.04
Spinner(드롭다운 메뉴)  (0) 2020.01.03
Fragment  (0) 2019.12.28
DrawerLayout  (0) 2019.12.26
WebView  (0) 2019.12.19

Fragment는 영어로 해석하면 조각이라는 뜻을 가지고 있다.

조각이라는 개념을 써서 한 액티비티에서 조각들을 바꿔입는 개념으로 이해하면 될 것이다.

 

예제를 보면 먼저 메인 액티비티에서 기본적으로 레이아웃을 설정해준다

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴1"
            android:id="@+id/btn_1"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴2"
            android:id="@+id/btn_2"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴3"
            android:id="@+id/btn_3"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴4"
            android:id="@+id/btn_4"/>

    </LinearLayout>

</RelativeLayout>

 

이와 같이 메뉴 버튼 4개를 만들어 주고 Fragment를 써야 할 때는 FrameLayout으로 조각들을 교체해주는 레이아웃을  설정해 줘야 합니다.

 

그 다음 fragment1이라는 xml을 만들어 주어 조각들을 교체해줄 레이아웃을 설정합니다.

 

<FrameLayout>을 부모로 두고  간단하게 보여줄 TextView를 설정해 준다.

이런 식으로 복사하여 res  -> layout 폴더에 붙여넣기 하여 보여줄 내용만 바꿔 줍니다.

 

 

이후 MainActivity.java에서 다음과 같이 설정해 준다.

 

 

버튼 4개의 대해 id값을 찾아 넣어주고 각각의 클릭 시 이벤트를 설정 해 준다

 

Fragment1 클래스를 만들어 줘야 하므로 자바 파일에서 Fragment1 클래스를 만들어 줍니다.

 

Fragment를 import하고 생성자를 만들어 주고 ctrl + o를 눌러 onCreateView를 클릭해 줍니다.

onCreateView는 메인 액티비티에 있는 onCreate와 똑같은 생명주기 이다. 차이점으로는 메인 액티비티에서 실행될 때와 Fragment를 실행할 때이다.

 

마찬가지로 자바 파일에 복사 붙여넣기 해 줍니다

이후 각 버튼에 대해 객체를 인스턴스화 해주어 설정해주면 됩니다.

package com.example.fragmentexample;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button btn1,btn2,btn3,btn4;

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

        btn1 = (Button)findViewById(R.id.btn_1);
        btn2 = (Button)findViewById(R.id.btn_2);
        btn3 = (Button)findViewById(R.id.btn_3);
        btn4 = (Button)findViewById(R.id.btn_4);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment1 fragment1 = new Fragment1(); //객체 인스턴스
                transaction.replace(R.id.frame, fragment1); // 조각을 fragment1로 교체
                transaction.commit(); // 저장

            }
        });

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment2 fragment2 = new Fragment2(); // 객체 인스턴스
                transaction.replace(R.id.frame, fragment2); // 조각을 fragment2로 교체
                transaction.commit(); // 저장

            }
        });

        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment3 fragment3 = new Fragment3(); // 객체 인스턴스
                transaction.replace(R.id.frame, fragment3); // 조각을 fragment3로 교체
                transaction.commit(); // 저장

            }
        });

        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment4 fragment4 = new Fragment4(); // 객체 인스턴스
                transaction.replace(R.id.frame, fragment4); // 조각을 fragment4 교체
                transaction.commit(); // 저장

            }
        });
    }
}

 

이제 실행해 주면 잘 동작하게 됩니다~

 

 

이런 식으로 메뉴 버튼을 누를 때마다 조각마다 교체되는 것을 확인할 수 있다!!

'안드로이드 스튜디오~' 카테고리의 다른 글

Spinner(드롭다운 메뉴)  (0) 2020.01.03
Dialog (팝업창 만들기)  (0) 2019.12.29
DrawerLayout  (0) 2019.12.26
WebView  (0) 2019.12.19
SharedPreferences  (0) 2019.12.19

+ Recent posts