이전 내용
[Android] 인텐트(Intent) - 1: 명시적 인텐트
이전 내용 [Android] 위젯 - 평점 (RatingBar)이전 내용 [Android] 컴파운드 버튼 3 - 토글 버튼이전 내용 [Android] 컴파운드 버튼 2 - 라디오 버튼이전 내용 [Android] 컴파운드 버튼 1 - 체크 박스이전 내용 [Andr
puppy-foot-it.tistory.com
명시적 인텐트 예제
스플래시 화면 + 로그인
Q. 로그인 화면을 생성하는 데, 스플래시 기능을 추가한다.
※ 스플래시 기능
애플리케이션을 실행할 때 사용자에게 보여지는 첫 화면으로, 앱의 로딩 시간을 숨기거나 브랜딩을 강화하는 역할을 한다. 보통 로고나 브랜드 이미지를 표시하고, 짧은 시간 동안 화면에 보여 진다.
[생성 및 작성 파일]
- Activity(java): Login용, 메인용, 아이디비밀번호 확인용(second)
- layout(xml): 메인, login용, 아이디비밀번호 확인용(second)
- drawable 이미지: 안드로이드, 회사 로고
- mainifests 폴더 내의 AndroidManifest.xml: </application> 위에 아래 코드 추가
<activity android:name=".LoginActivity"
android:label="LoginActivity"/>
<activity android:name=".SecondActivity" />
[activity_main.xml]
<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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00BCD4"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="105dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.494"
app:srcCompat="@drawable/img"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="74dp"
android:layout_marginEnd="16dp"
android:text="Hello, Android!"
android:textSize="60sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
[login.xml]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<ImageView
android:id="@+id/logoImageView"
android:layout_width="225dp"
android:layout_height="287dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="16dp"
android:src="@drawable/companylogo" />
<EditText
android:id="@+id/emailEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="이메일"
android:inputType="textEmailAddress"
android:layout_marginBottom="16dp" />
<EditText
android:id="@+id/pwEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="비밀번호"
android:inputType="textPassword"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/loginButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="로그인" />
<TextView
android:id="@+id/forgotPasswordTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="비밀번호를 잊으셨나요?"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/registerTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="계정이 없으신가요? 회원가입"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/loginStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:text="로그인 진행 중"
android:textColor="#FF5722"
android:textSize="34sp"
android:textStyle="bold|italic" />
</LinearLayout>
[activity_second.xml]
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/linearLayout"
android:background="#FFEB3B">
<TextView
android:id="@+id/nnn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="94dp"
android:text="로그인 정보"
android:textSize="32sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/displayIdTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="44dp"
android:layout_marginTop="263dp"
android:text="아이디: "
android:textSize="24sp"
android:textStyle="bold|italic"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/displayPasswordTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="44dp"
android:layout_marginTop="36dp"
android:text="비밀번호: "
android:textSize="24sp"
android:textStyle="bold|italic"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/displayIdTextView" />
<TextView
android:id="@+id/loginSuccess"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="132dp"
android:layout_marginTop="124dp"
android:text="로그인 인증 중 "
android:textSize="24sp"
android:textStyle="bold|italic"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/displayIdTextView" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:onClick="check"
android:text="인증시도버튼"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginSuccess" />
</androidx.constraintlayout.widget.ConstraintLayout>
[MainActivity.java]
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final int SPLASH_TIMEOUT = 2000; // 스플래시 화면 노출 시간 (2초)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 일정 시간 후에 로그인 화면으로 이동
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(MainActivity.this,
LoginActivity.class);
startActivity(intent);
finish(); // 스플래시 화면 종료
}
}, SPLASH_TIMEOUT);
}
}
스플래시 화면 지속 시간 설정:
- private static final int SPLASH_TIMEOUT = 2000; :스플래시 화면이 2초 동안 표시되도록 설정.
onCreate 메서드:
- super.onCreate(savedInstanceState);와 setContentView(R.layout.activity_main);: 액티비티가 처음 생성될 때 호출되며, UI 레이아웃을 설정합니다.
Handler와 postDelayed:
- new Handler().postDelayed(new Runnable() ~ SPLASH_TIMEOUT);: 새로운 스레드를 생성하여 2초 후에 실행될 코드를 정의.
화면 전환:
- Intent intent = new Intent(MainActivity.this, LoginActivity.class);
- startActivity(intent);: 2초가 경과한 후 LoginActivity로 화면 전환.
- finish();: 현재 MainActivity를 종료하여 스플래시 화면이 더 이상 나타나지 않도록 한다.
[LoginActivity.java]
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
public class LoginActivity extends AppCompatActivity {
private EditText emailEditText, passwordEditText;
private TextView statusText;
private Button loginButton;
private ActivityResultLauncher<Intent> launcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
emailEditText = findViewById(R.id.emailEditText);
passwordEditText = findViewById(R.id.pwEditText);
loginButton = findViewById(R.id.loginButton);
statusText = findViewById(R.id.loginStatus);
// ActivityResultLauncher 초기화
launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
// 액티비티 결과 코드가 RESULT_OK인지 확인 (성공적으로 완료)
if (result.getResultCode() == RESULT_OK) {
// 반환된 Intent 데이터 가져오기
Intent data = result.getData();
// Intent에서 "status"라는 키로 전달된 문자열을 가져와 statusText 뷰에 설정
if (data != null) {
statusText.setText(data.getStringExtra("status"));
}
}
});
// 버튼 클릭 리스너 설정
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 아이디와 비밀번호 입력값 가져오기
String email = emailEditText.getText().toString();
String password = passwordEditText.getText().toString();
// 두 번째 화면으로 전환하면서 아이디와 비밀번호 데이터 전달
Intent intent = new Intent(LoginActivity.this, SecondActivity.class);
intent.putExtra("ID", email);
intent.putExtra("Password", password);
launcher.launch(intent);
}
});
}
}
UI 요소 초기화:
- EditText, TextView, Button 등 UI 요소 초기화.
- emailEditText, passwordEditText, statusText, loginButton을 각각 레이아웃 파일에서 찾는다.
ActivityResultLauncher:
- ActivityResultLauncher<Intent> launcher;: 새로운 액티비티의 결과를 처리하기 위한 객체 선언.
- launcher = registerForActivityResult(...): 결과를 처리하는 람다 함수를 등록하여, 결과 코드가 RESULT_OK일 때 반환된 Intent 데이터에서 "status"로 지정된 문자열을 가져와 statusText에 설정.
버튼 클릭 리스너:
- loginButton.setOnClickListener(...): 로그인 버튼 클릭 시 동작 정의. 사용자가 입력한 이메일과 비밀번호를 가져와 SecondActivity로 전달하는 Intent 생성.
- intent.putExtra(...): 입력값을 Intent의 추가 데이터로 포함.
- launcher.launch(intent);: 두 번째 액티비티를 시작.
[SecondActivity.java]
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
private TextView displayIdTextView, displayPasswordTextView, statusTextView;
String id, password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
displayIdTextView = findViewById(R.id.displayIdTextView);
displayPasswordTextView = findViewById(R.id.displayPasswordTextView);
statusTextView = findViewById(R.id.loginSuccess);
// 인텐트에서 아이디와 비밀번호 데이터 가져오기
Intent intent = getIntent();
id = intent.getStringExtra("ID");
password = intent.getStringExtra("Password");
// 화면에 아이디와 비밀번호 출력
displayIdTextView.setText("아이디: " + id);
displayPasswordTextView.setText("비밀번호: " + password);
}
public void check(View e) {
// 로그인 로직 (더미 데이터 사용)
Intent intent = new Intent();
if (isUserValid(id, password)) {
// 인증 성공 시 메인 액티비티로 이동
intent.putExtra("status", "로그인 성공!");
} else {
// 인증 실패 시 메시지 표시
// 실제로는 실패 처리 및 메시지를 표시하는 방식 변경 필요
intent.putExtra("status", "로그인 실패!");
}
setResult(RESULT_OK, intent);
finish();
}
private boolean isUserValid(String username, String password) {
// 실제로는 여기서 서버 또는 로컬 데이터베이스를 통해 인증 확인 필요
// 더미 데이터를 사용하여 단순하게 인증 성공 여부 판단
return username.equals("kim") && password.equals("1234");
}
}
UI 요소 초기화:
- TextView를 사용하여 사용자의 아이디와 비밀번호를 화면에 표시.
- displayIdTextView, displayPasswordTextView, statusTextView를 각각 레이아웃 파일에서 초기화.
인텐트에서 데이터 가져오기:
- Intent intent = getIntent();를 통해 이전 액티비티에서 전달한 데이터 수신.
- id = intent.getStringExtra("ID");와 password = intent.getStringExtra("Password");를 통해 사용자의 아이디와 비밀번호를 가져옴.
데이터 출력:
- displayIdTextView.setText(...)와 displayPasswordTextView.setText(...)를 통해 가져온 아이디와 비밀번호를 화면에 출력.
로그인 검증:
- check(View e) 메서드: 로그인 버튼 클릭 시 호출되는 메서드로, 인증 결과에 따라 상태 메시지를 포함한 인텐트 설정.
- isUserValid(String username, String password): 사용자 인증 로직을 담당하는 메서드로, 간단한 더미 데이터를 기반으로 인증 성공 여부 판단.
결과 반환 및 액티비티 종료:
- setResult(RESULT_OK, intent);: 로그인 결과를 설정하여 이전 액티비티로 반환.
- finish();: SecondActivity 종료.
다음 내용
[Android] 인텐트(Intent) - 3: 암시적 인텐트
이전 내용 [Android] 인텐트 (Intent) 2 - 명시적 인텐트 예제이전 내용 [Android] 인텐트(Intent) - 1: 명시적 인텐트이전 내용 [Android] 위젯 - 평점 (RatingBar)이전 내용 [Android] 컴파운드 버튼 3 - 토글 버튼이
puppy-foot-it.tistory.com
'[Java] > Java Android' 카테고리의 다른 글
[Android] 인텐트(Intent) - 3: 암시적 인텐트 (0) | 2025.04.30 |
---|---|
[Android] 인텐트(Intent) - 1: 명시적 인텐트 (0) | 2025.04.30 |
[Android] 위젯 - 평점 (RatingBar) (1) | 2025.04.30 |
[Android] 컴파운드 버튼 3 - 토글 버튼 (0) | 2025.04.30 |
[Android] 컴파운드 버튼 2 - 라디오 버튼 (0) | 2025.04.30 |