본문 바로가기
computing

20251211-android14

by greentworkshop 2025. 12. 11.

액티비티가 직접 리스너 인터페이스를 구현하는 방법 (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