관리 메뉴

java,javascript,android,php,sql,공부용,메모용

안드로이드 여러화면 전환 / Android Studio / 안드로이드 앱만들기 공부 20 본문

모바일/안드로이드앱

안드로이드 여러화면 전환 / Android Studio / 안드로이드 앱만들기 공부 20

yy_dd2 2021. 3. 8. 22:38
반응형

화면간 전환하기

- 화면은 액티비티로 구현한다
- 필요에 의해 화면을 띄우거나 닫는 과정은 화면을 전환하는 것이다
- 안드로이드 앱의 네가지 요소 : 액티비티(Activity) 서비스(Service) 브로드캐스트 수신자(Broadcast Receiver) 내용 제공자(Content Provider)
- 앱이 만들어지고 단말에 설치가 되었을때 앱은 안드로이드 시스템이 네가지의 구성요소에 대한 정보를 요구한다
- 안드로이드 앱의 네가지 요소는 자동으로 만들어지는 매니페스트 Manifest.xml 파일이 담고있다
- 새 액티비티에 대한 <activity> 태그를 매니페스트에 추가해야 새 액티비티 화면을 보여줄수있다.

- startActivity() 메서드는 액티비티를 소스코드에서 띄울때 사용한다.
- startActivityForResult() 메서드는 띄웠던 액태비티에서 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리하는 코드다.
- startActivityForResult(Intent intent, int requestCode)
각각의 액티비티를 구별하기 위한 파라미터 값으로 인텐트(intent)와 정수로된 코드값(requestCode)를 사용한다
- 새 액티비티는 startActivityForResult() 메서드로 만든다.

1. SampleIntent 프로젝트 생성
2. app 우클릭 - New - Activity - Empty Activity - Activity name : MenuActivity - Finish
3. /app/manifests 폴더안의 AndroidManifest.xml 파일에 <activity> 태그가 추가된거 확인하기
4. AndroidManifests.xml 파일에 속성추가 android:label android:theme

 


안드로이드 스튜디오에서 한글이 깨진다

매니페스트 파일에 lable 속성으로 한글을 추가하려고 하니 안드로이드 스튜디오에서 한글깨짐 현상이 발견되었다

이 문제를 해결하고 숙지한 후 넘어가야 할 거 같다.

tog-code.tistory.com/40

 

안드로이드 스튜디오 한글 깨짐 / Manifest 파일 한글 안써짐 해결

안드로이드 스튜디오에서 한글이 깨진다 매니페스트 파일에 lable 속성으로 한글을 추가하려고 하니 안드로이드 스튜디오에서 한글깨짐 현상이 발견되었다 이 문제를 해결해야 다음 작업이 가

tog-code.tistory.com


한글깨짐 문제를 해결했다.

매니페스트에 속성을 추가했다.

        <activity android:name=".MenuActivity"
            android:label="메뉴 액티비티"
            android:theme="@style/Theme.AppCompat.Dialog">

        </activity>

android:label 속성은 화면의 제목을 설정한다

android:theme 속성은 테마를 설정할때 사용한다

@style/Theme.AppCompat.Dialog 속성 값은 액티비티가 대화상자 형태로 나타난다

 

5. MenuActivity.xml 파일에 "돌아가기" 버튼을 추가

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MenuActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="돌아가기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="새로만들어진 액티비티"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

나는 새로만들어진 액티비티 라는걸 화면에서 확인하려고 텍스트뷰도 추가했다

 

6. MenuActivity.java 파일

- 버튼을 누르면 원래 액티비티로 돌아가도록 코드 작성

package com.togapp.sampleintent;

import androidx.appcompat.app.AppCompatActivity;

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

public class MenuActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 인텐트 객체 생성 name 값을 부가 데이터로 넣기
                Intent intent = new Intent();
                intent.putExtra("name", "mike");
                // 응답 보내기
                setResult(RESULT_OK, intent);
                // 현재 액티비티 종료
                finish();
            }
        });

    }
}

- Intent 클래스로 객체를 만들고 setResult() 메서드를 호출해서 값을 전달하고있다.

- setResult() 메서드는 새로 띄운 액티비티에서 이전 액티비티로 인텐트를 전달하고 싶을 떄 사용한다.

setResult("응답코드","인텐트")

 

7. 새 액티비티 화면 띄우기 버튼 만들기 activity_main.xml

8. 버튼 누르면 새 액티비티 화면 띄우는 코드 작성 MainActivity.java 

package com.togapp.sampleintent;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    // 새 액티비티에 띄울때 보낼 요청 코드다 코드값 101은 여러개의 액티비티라면 중복되지 않는 값으로 해야한다.
    // 여러 화면이 추가되고 삭제된다면 100단위가 좋을거 같다 중간중간 새 파일이 들어온다면 맞는 화면의 뒷번호가 필요할것
    public static final int REQUEST_CODE_MENU = 101;
    /*
    public static final int REQUEST_CODE_MENU;
    static {
        REQUEST_CODE_MENU = 101;
    }
    */

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                // startActivity() 는 새 액티비티를 띄운다
                // startActivityForResult()는 새 액티비티로부터 응답을 받을 수 있다.
                startActivityForResult(intent, REQUEST_CODE_MENU);
            }
        });

    }
}

intent객체를 만들때 intent의 getApplicationContext()를 사용해서 앱의 Context 객체를 참조한 후 전달한다.

- 액티비티 객체는 컨텍스트가 될 수 있기 때문에 this 변수를 사용할 수 있지만

  여기서는 이벤트 메서드 안에서 this 변수로 MainActivity 객체를 참조할 수 없다.

 

9. MenuActivity로 받은 응답 처리하는 메서드 추가하기

MainActivity 클래스에서 우클릭 / Ctrl + O 단축키 누르기

onActivityResult 메서드[ok]

위에 메서드들을 재정의해서 확인해보기

    // onActivityResult() 메서드는 부모 클래스에 정의된 메서드를 재정의 한것
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_MENU){
            Toast.makeText(getApplicationContext(), "onActivityResult 메서드 호출됨. 요청코드 : " + requestCode + "결과 코드 : " + requestCode, Toast.LENGTH_SHORT).show();
        };

        if (resultCode == RESULT_OK){
            String name = data.getStringExtra("name");
            Toast.makeText(getApplicationContext(),"응답으로 전달된 name :" + name, Toast.LENGTH_LONG).show();
        }

    }

- 여기서 getStringExtra()안의 데이터는 MenuActivity.xml에서 전달한 값이다

   intent 만들고 그안에 intent.putExtra("name", "mike") 값을 가져왔다

- 인텐트에 키와 값으로 값을 저장하고 그 값을 가져왔다.

 

 

MainActivity.java 코드 전문

더보기
package com.togapp.sampleintent;

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.Toast;

public class MainActivity extends AppCompatActivity {
    // 새 액티비티에 띄울때 보낼 요청 코드다 코드값 101은 여러개의 액티비티라면 중복되지 않는 값으로 해야한다.
    // 여러 화면이 추가되고 삭제된다면 100단위가 좋을거 같다 중간중간 새 파일이 들어온다면 맞는 화면의 뒷번호가 필요할것
    public static final int REQUEST_CODE_MENU = 101;
    /*
    public static final int REQUEST_CODE_MENU;
    static {
        REQUEST_CODE_MENU = 101;
    }
    */

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                // startActivity() 는 새 액티비티를 띄운다
                // startActivityForResult()는 새 액티비티로부터 응답을 받을 수 있다.
                startActivityForResult(intent, REQUEST_CODE_MENU);
            }
        });

    }

    // onActivityResult() 메서드는 부모 클래스에 정의된 메서드를 재정의 한것
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_MENU){
            Toast.makeText(getApplicationContext(), "onActivityResult 메서드 호출됨. 요청코드 : " + requestCode + "결과 코드 : " + requestCode, Toast.LENGTH_SHORT).show();
        };

        if (resultCode == RESULT_OK){
            String name = data.getStringExtra("name");
            Toast.makeText(getApplicationContext(),"응답으로 전달된 name :" + name, Toast.LENGTH_LONG).show();
        }

    }
}

 

실행

 

 

앱을 실행해서 확인하는데 오류 문구가 떠서 확인해봤다.

 

오후 7:53 Emulator socketTcpLoopbackClientFor: error: fd 134904 above FD_SETSIZE (32768)

오후 7:53 Emulator: emulator: ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037

 

해결은 못하고 다른 오류가 떳었다...

tog-code.tistory.com/41

오후 10:32 Emulator: handleCpuAcceleration: feature check for hvf

오후 10:32 Emulator: cannot add library vulkan-1.dll: failed

 

다른 오류에 대해서 해결된건 없는데 일단 앱구동은 되서넘어간다


 

기억하기

 

1. 새로운 액티비티 만들기

새로운 액티비티를 만들면 XML 레이아웃 파일과 자바 소스파일이 만들어진다

매니페스트 파일에 액티비티 태그가 추가된다

2. 새로운 액티비티 XML 레이아웃 정의하기

액티비티 화면 배치한다

3. 메인 액티비티에 새로운 액티비티 띄우기

새로 만든 액티비티를 띄우는 메서드를 작성한다 setActivityForResult()

4. 새로운 액티비티에서 응답 보내기

새로운 액티비티안에서 버튼을 클릭하면 setResult() 메서드로 응답을 보낸다

5. 응답 처리하기

메인 액티비티에서 onActivityResult()메서드를 재정의해서 새로 만든 액티비티에서 보내오는 응답을 받아 처리할수있다.

반응형
Comments