액티비티가 직접 리스너 인터페이스를 구현하는 방법 (Activity Implements Listener Interface)
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MyActivity extends Activity implements View.OnClickListener {
private Button myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = findViewById(R.id.my_button);
// **(핵심)** 액티비티 자신(this)을 리스너로 설정합니다.
myButton.setOnClickListener(this);
}
// **(핵심)** View.OnClickListener 인터페이스의 메서드를 오버라이드합니다.
@Override
public void onClick(View v) {
// v.getId()를 사용하여 여러 뷰를 구분할 수 있습니다.
if (v.getId() == R.id.my_button) {
Toast.makeText(this, "버튼이 클릭되었습니다.", Toast.LENGTH_SHORT).show();
}
}
}
실습
MainActivity.java
package com.example.a1211;
import androidx.appcompat.app.AppCompatActivity; // AppCompatActivity를 사용할 경우 (현재 코드는 Activity를 상속받음)
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; // 사용자에게 메시지를 보여주기 위해 추가
// Activity를 상속받고 View.OnClickListener 인터페이스를 구현합니다.
public class MainActivity extends Activity implements View.OnClickListener {
// 1. UI 요소 멤버 변수 선언
EditText editText;
Button btnWrite1, btnWrite2, btnEnd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 2. 레이아웃 파일(b1211.xml)을 화면에 표시
setContentView(R.layout.b1211);
// 주의: R.layout.b1211 대신 실제 레이아웃 파일 이름(예: activity_main)을 사용해야 할 수도 있습니다.
// 3. UI 요소 바인딩 (findViewById를 사용하여 XML의 ID와 연결)
editText = findViewById(R.id.editText);
btnWrite1 = findViewById(R.id.btnWrite1);
btnWrite2 = findViewById(R.id.btnWrite2);
btnEnd = findViewById(R.id.btnEnd);
// 4. 리스너 설정 (액티비티 자신(this)을 리스너로 할당)
btnWrite1.setOnClickListener(this);
btnWrite2.setOnClickListener(this);
btnEnd.setOnClickListener(this);
}
// 5. View.OnClickListener 인터페이스의 onClick 메서드 구현
@Override
public void onClick(View v) {
// 클릭된 뷰의 ID를 확인하여 분기 처리
int id = v.getId();
if (id == R.id.btnWrite1) {
// "출력" 버튼: 고정된 문자열을 EditText에 설정
editText.setText("안녕하세요!");
} else if (id == R.id.btnWrite2) {
// "입력 내용 출력" 버튼
// 현재 EditText의 텍스트를 가져와 String으로 변환합니다.
String input = editText.getText().toString();
// 가져온 텍스트를 다시 EditText에 설정 (혹은 Toast 메시지로 보여줄 수도 있습니다.)
Toast.makeText(this, "입력 내용: " + input, Toast.LENGTH_SHORT).show();
// 또는 editText.setText("입력 내용: " + input);
} else if (id == R.id.btnEnd) {
// "종료" 버튼: 앱을 종료합니다.
finish();
}
}
}
b1211.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="이곳에 입력하세요"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnWrite1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="출력"
/>
<Button
android:id="@+id/btnWrite2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="입력 내용 출력"
/>
<Button
android:id="@+id/btnEnd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="종료" />
</LinearLayout>
MainActivity.java - 다른 방법으로 수정
/*~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~*/
// 4. View.OnClickListener 인터페이스의 onClick 메서드 구현
@Override
public void onClick(View v) {
// v.getId()의 결과를 사용하여 if-else if-else 구조로 분기 처리합니다.
// 첫 번째 버튼 (btnWrite1: 출력)
if (v.getId() == R.id.btnWrite1) {
editText.setText("안녕하세요!");
// 두 번째 버튼 (btnWrite2: 입력 내용 출력) - 요청하신 조건문 적용
} else if (v.getId() == R.id.btnWrite2) {
// EditText에서 텍스트를 가져옵니다.
String input = editText.getText().toString();
// Toast 메시지로 입력 내용을 보여줍니다.
Toast.makeText(this, "입력 내용: " + input, Toast.LENGTH_SHORT).show();
// 세 번째 버튼 (btnEnd: 종료)
} else if (v.getId() == R.id.btnEnd) {
// Activity를 종료하여 앱을 닫습니다.
finish();
// 만약 ID가 일치하지 않는 경우가 있다면 (선택 사항)
} else {
Toast.makeText(this, "알 수 없는 버튼 클릭", Toast.LENGTH_SHORT).show();
}
}
}
리스트뷰 예제
package com.example.a1211;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
// 필요 없는 List 임포트 제거 (사용하지 않음)
// import java.util.ArrayList;
// import java.util.List;
public class MainActivity extends AppCompatActivity {
// 클래스 멤버 변수를 사용할 예정이므로 그대로 둡니다.
ListView listView;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b1211_2);
// 💡 문제점 1 해결: 멤버 변수 listView에 바인딩합니다.
listView = findViewById(R.id.listView1);
// 데이터를 담을 String 배열 (mid)
final String[] mid = {"가", "나", "다", "라"};
// (원래 코드에서 사용하지 않던 지역 변수 list 선언은 삭제)
// ListView list = (ListView) findViewById(R.id.listView1);
// adapter 생성
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mid);
// 💡 문제점 1 해결: 바인딩된 멤버 변수 listView에 adapter 연결
listView.setAdapter(adapter);
// 💡 문제점 1 해결: 바인딩된 멤버 변수 listView에 리스너 설정
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// arg2는 클릭된 아이템의 인덱스입니다.
Toast.makeText(getApplicationContext(), mid[arg2] + " 선택됨", Toast.LENGTH_SHORT).show();
}
});
}
}
다른 방법 adapter.getitem(position)
package com.example.a1211;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
ListView listView;
// 어댑터를 리스너 내부에서 사용하려면 final로 선언하거나 멤버 변수로 만들어야 합니다.
// 여기서는 가장 간단하게 리스너가 접근할 수 있도록 final로 선언하겠습니다.
ArrayAdapter<String> adapter;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b1211_2);
listView = findViewById(R.id.listView1);
final String[] mid = {"가", "나", "다", "라"};
// 💡 adapter를 final로 선언하여 내부 클래스(OnItemClickListener)에서 접근 가능하게 합니다.
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mid);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// arg2는 position (위치)를 의미합니다.
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
// 💡 adapter.getItem(position) 예제 적용:
// 어댑터에서 position에 해당하는 실제 데이터 항목을 가져옵니다.
// getItemAtPosition(position)은 AdapterView 객체(arg0)를 통해 가져오는 방법이며,
// adapter.getItem(position)과 동일한 결과를 반환합니다.
String selectedItem = adapter.getItem(position);
// 팝업 메시지로 보여줍니다.
Toast.makeText(getApplicationContext(), selectedItem + " 선택됨", Toast.LENGTH_SHORT).show();
}
});
}
}
adapter.getitem
package com.example.a1211;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
ListView listView;
// 어댑터를 리스너 내부에서 사용하기 위해 멤버 변수로 선언합니다.
ArrayAdapter<String> adapter;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b1211_2);
// 1. ListView 바인딩
listView = findViewById(R.id.listView1);
// 2. 데이터 준비
final String[] mid = {"가", "나", "다", "라"};
// 3. 어댑터 생성
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mid);
// 4. ListView에 어댑터 연결
listView.setAdapter(adapter);
// 5. 항목 클릭 리스너 설정
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// arg2는 항목의 위치(position)를 나타냅니다.
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
// 💡 adapter.getItem(position) 코드 추가 및 적용:
// 어댑터에서 클릭된 위치(position)에 해당하는 실제 String 데이터 항목을 가져옵니다.
String selectedItem = adapter.getItem(position);
// 팝업 메시지(Toast)로 선택된 항목을 보여줍니다.
Toast.makeText(getApplicationContext(), selectedItem + " 항목이 선택됨", Toast.LENGTH_SHORT).show();
}
});
}
}'computing' 카테고리의 다른 글
| 20251127-android13, 그래픽, Empty Views Activity menu해결 (1) | 2025.11.27 |
|---|---|
| javaweb 13 정리 (0) | 2025.11.26 |
| 20251124_iOS12 (0) | 2025.11.24 |
| 20251117 - iOS12 (0) | 2025.11.17 |
| android11 (0) | 2025.11.13 |