logcat / ListView

2022. 10. 10. 15:51Dev.Program/Android

728x90

p.48

======== 0629_ch10_Activity_LifeCycle

< activity_main.xml >

<?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"

   android:orientation="vertical">

 

   <Button

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/btnCall"

       android:text="전화걸기"

       android:textSize="20sp"/>

 

   <Button

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/btnFinish"

       android:text="끝내기"

       android:textSize="20sp"/>

 

</LinearLayout>

 

< MainActivity.java >

@Override

protected void onCreate(Bundle savedInstanceState) {

   // onCreate() : 어플리케이션 실행 시 가장 먼저 자동으로 실행되는 메서드

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

 

   Log.i(">>>> 액티비티 생명주기", "onCreate()");

 

   btnCall = findViewById(R.id.btnCall);

   btnFinish = findViewById(R.id.btnFinish);

 

   btnCall.setOnClickListener(new View.OnClickListener() {

       @Override

       public void onClick(View v) {

           // 묵시적 인텐트를 사용하여 전화 어플리케이션 실행

           Uri uri = Uri.parse("tel:01012345678");

           Intent intent = new Intent(Intent.ACTION_DIAL, uri);

           startActivity(intent);

       }

   });

 

   btnFinish.setOnClickListener(new View.OnClickListener() {

       @Override

       public void onClick(View v) {

           // 현재 액티비티 종료 : finish()

           finish();

       }

   });

 

} // onCreate() 메서드 끝

  • onStart(), onStop(), onDestroy(), onResume(), onRestart(), onPause()
  • onCreate() 밖에서 위의 6개 메서드 오버라이딩 하기(Ctrl + O)

// onDestroy(), onStart(), onStop(), onResume(), onRestart(), onPause() 오버라이딩

@Override

protected void onDestroy() {

   super.onDestroy();

   Log.i(">>>> 액티비티 생명주기", "onDestroy()");

}

 

@Override

protected void onStart() {

   super.onStart();

   Log.i(">>>> 액티비티 생명주기", "onStart()");

}

 

@Override

protected void onStop() {

   super.onStop();

   Log.i(">>>> 액티비티 생명주기", "onStop()");

}

 

@Override

protected void onResume() {

   super.onResume();

   Log.i(">>>> 액티비티 생명주기", "onResume()");

}

 

@Override

protected void onRestart() {

   super.onRestart();

   Log.i(">>>> 액티비티 생명주기", "onRestart()");

}

 

@Override

protected void onPause() {

   super.onPause();

   Log.i(">>>> 액티비티 생명주기", "onPause()");

}

  • 실행시켜보기
  • logcat 확인
  • 세개 먼저 실행됨

 

> 전화걸기 눌러보기

  • onPause(), onStop()

> 뒤로가서 원래 페이지로 돌아가보기

  • onRestart(), onStart(), onResume()
  • 재시작할 때 작업하는건 onRestart()에 작성해야함
  • onStart()와 onResume() 은 처음 시작할 때도 작동하기 때문

 

Resume(시작) <-> Pause(멈춤)

> 끝내기 눌러보기

  • 어플리케이션이 종료될 땐 onDestroy() 에 작업(자원 반환같은 것들은 여기 작성)

 

>> onCreate() 외에 onRestart(), onPause(), onDestroy() 를 가장 많이 사용

 

### 참고(logcat)

  • 원하는 로그캣만 확인할 수 있음!



< Chapter11 >

======== 0629_ch11_ListView_Basic

< activity_main.xml >

<?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">

 

   <!--

   ListView 위젯을 XML 로 만들기 위해서는

   <ListView> 태그를 사용하여 ID, 크기 지정

   -->

 

   <ListView

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/listView"/>

 

</LinearLayout>

 

< MainActivity.java >

package com.example.a0629_ch11_listview_basic;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       setTitle("ListView");

 

       ListView listView = findViewById(R.id.listView);

 

       // String[] 타입을 활용하여 ListView 에서 표시할 목록 데이터 작성

       String[] items = {

               "Java", "JSP Model1", "JSP Model2", "HTML5", "CSS3", "Oracle",

               "SPRING Framework", "Android", "Linux", "Windows", "Python", "R",

               "IOS", "정보처리기사"

       };

 

       // ArrayAdapter 객체를 생성하여 표시할 목록 전달(제네릭 타입 String)

       // => 파라미터 : 현재 컨텍스트(액티비티), 목록 모양, 목록에 표시할 데이터

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);

 

       // ListView 객체의 setAdapter() 메서드를 호출하여 ArrayAdapter 객체 전달

       listView.setAdapter(adapter);

 

   }

}

  • 자동 스크롤

 

       // OnItemClickListener 를 구현하여 목록 클릭 시 수행할 동작 지정

       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

           @Override

           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

//                Toast.makeText(MainActivity.this, position + ", " + id, Toast.LENGTH_SHORT).show();

               // 파라미터 중 position 파라미터를 활용하여 배열 내의 해당 항목을 출력

               Toast.makeText(MainActivity.this, "선택 항목 : " + items[position], Toast.LENGTH_SHORT).show();

           }

       });

  • 몇번째인지는 position 으로 알 수 있음

 

======== second_activity.xml

======== SecondActivity.java

 

< manifest.xml >

<application

   android:allowBackup="true"

   android:icon="@mipmap/ic_launcher"

   android:label="@string/app_name"

   android:roundIcon="@mipmap/ic_launcher_round"

   android:supportsRtl="true"

   android:theme="@style/AppTheme">

   <activity android:name=".MainActivity">

       <intent-filter>

           <action android:name="android.intent.action.MAIN" />

 

           <category android:name="android.intent.category.LAUNCHER" />

       </intent-filter>

   </activity>

   <activity android:name=".SecondActivity" android:label="두번째 액티비티"/>

</application>

  • 추가

 

< MainActivity.java >

       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

           @Override

           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

//                Toast.makeText(MainActivity.this, position + ", " + id, Toast.LENGTH_SHORT).show();

               // 파라미터 중 position 파라미터를 활용하여 배열 내의 해당 항목을 출력

               Toast.makeText(MainActivity.this, "선택 항목 : " + items[position], Toast.LENGTH_SHORT).show();

 

               // SecondActivity 를 실행하여 선택된 항목을 출력

               // Intent 객체를 생성하여 현재 컨텍스트 객체와 새 액티비티 클래스명 전달

               Intent intent = new Intent(getApplicationContext(), SecondActivity.class);

               // 새 액티비티에 전달할 데이터(선택된 항목 이름)를 putExtra() 메서드에 저장

               intent.putExtra("item", items[position]);

               // startActivity() 메서드를 호출하여 새 액티비티 실행(리턴결과 X)

               startActivity(intent);

           }

       });

  • 누르면 SecondActivity 로 넘어감

 

< SecondActivity.java >

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.second_activity);

 

   TextView tv = findViewById(R.id.tv);

 

   // 전달된 Intent 객체를 가져와서 저장된 데이터(태그 : item)를 꺼낸 뒤 TextView 에 출력

   Intent intent = getIntent();

   String item = intent.getStringExtra("item");

   tv.setText("선택된 항목 : " + item);

 

   Button btn = findViewById(R.id.btn);

   btn.setOnClickListener(new View.OnClickListener() {

       @Override

       public void onClick(View v) {

           finish();

       }

   });

 

}

  • 이제 선택된 항목이 두번째 액티비티에 출력됨!

 

< 라디오 버튼으로 구성된 ListView >

< MainActivity.java >

       // ArrayAdapter 객체를 생성하여 표시할 목록 전달(제네릭 타입 String)

       // => 파라미터 : 현재 컨텍스트(액티비티), 목록 모양, 목록에 표시할 데이터

       // => 목록 모양을 지정할 상수를 android.R.layout.simple_list_item_single_choice 선택 시

       //    목록의 모양이 라디오버튼 형식으로 변경됨

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(

               this, android.R.layout.simple_list_item_single_choice, items);

 

       // ListView 객체의 setChoiceMode() 메서드를 호출하여 선택 방식 설정

       // => ListView.CHOICE_MODE_XXX 형식 선택

       //    1) ListView.CHOICE_MODE_SINGLE 선택 시 단일 선택 모드로 동작됨

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

 

       // ListView 객체의 setAdapter() 메서드를 호출하여 ArrayAdapter 객체 전달

       listView.setAdapter(adapter);

  • 단일 선택(라디오 버튼)
  • listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
  • 다중 선택

 

< 체크박스 형태의 ListView >

       // -------------------- 체크박스로 구성된 목록 형태의 ListView ------------------------

       // ArrayAdapter 객체를 생성하여 표시할 목록 전달(제네릭 타입 String)

       // => 파라미터 : 현재 컨텍스트(액티비티), 목록 모양, 목록에 표시할 데이터

       // => 목록 모양을 지정할 상수를 android.R.layout.simple_list_item_single_choice 선택 시

       //    목록의 모양이 체크박스 형식으로 변경됨

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(

               this, android.R.layout.simple_list_item_multiple_choice, items);

 

       // ListView 객체의 setChoiceMode() 메서드를 호출하여 선택 방식 설정

       // => ListView.CHOICE_MODE_XXX 형식 선택

       //    1) ListView.CHOICE_MODE_SINGLE 선택 시 단일 선택 모드로 동작됨

//        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

       listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

 

       // ListView 객체의 setAdapter() 메서드를 호출하여 ArrayAdapter 객체 전달

       listView.setAdapter(adapter);

 

========= 0629_ch10_listView_Dynamic_Add

< activity_main.xml >

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

   xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:orientation="vertical">

 

   <EditText

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/etItem"

       android:hint="추가할 항목 입력"

       android:textSize="20sp"/>

 

   <Button

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/btnAdd"

       android:text="항목 추가"

       android:textSize="20sp"/>

 

   <ListView

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:id="@+id/listView"/>

 

</LinearLayout>

 

< MainActivity.java >

  • 자동완성하면 final 자동으로 붙음

package com.example.a0629_ch10_listview_dynamic_add;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.Toast;

 

import java.util.ArrayList;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       final EditText etItem = findViewById(R.id.etItem);

       Button btnAdd = findViewById(R.id.btnAdd);

       ListView listView = findViewById(R.id.listView);

 

       // 동적인 리스트뷰 관리를 위해 목록을 저장하는 ArrayList 객체 생성

       final ArrayList<String> itemList = new ArrayList<String>();

 

       // ArrayAdapter 객체를 생성하여 현재 컨텍스트, 목록 모양, 데이터 저장 객체 전달

       final ArrayAdapter<String> adapter = new ArrayAdapter<String>(

               this, android.R.layout.simple_list_item_1, itemList);

 

       // ListView 에 ArrayAdapter 객체 추가

       listView.setAdapter(adapter);

 

       btnAdd.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               if(etItem.length() == 0) { // 입력 항목이 비어있을 경우 오류 메세지 출력

                   Toast.makeText(MainActivity.this, "항목 입력 필수", Toast.LENGTH_SHORT).show();

                   etItem.requestFocus();

                   return;

               }

//                Toast.makeText(MainActivity.this, etItem.getText().toString(), Toast.LENGTH_SHORT).show();

               itemList.add(etItem.getText().toString());

//                Toast.makeText(MainActivity.this, itemList.toString(), Toast.LENGTH_SHORT).show();

               // ArrayAdapter 객체의 notifyDataSetChanged() 메서드를 호출하여 목록 갱신

               adapter.notifyDataSetChanged();

           }

       });

 

   }

}

 

etItem.setText("");

  • 추가시 항목추가 버튼 누르면 초기화 됨!

 

// ListView 항목을 롱클릭 시 해당 아이템 삭제

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

   @Override

   public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

       itemList.remove(position);

       adapter.notifyDataSetChanged();

       return false;

   }

});

  • 꾸욱 누르면 삭제됨



======== 0629_ch11_GridView_Movie_Poster

  • 이미지파일 60개 추가

< activity_main.xml >

<?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">

 

   <!--

   GridView 위젯 사용 시 numColumns 속성을 사용하여

   한 개 라인에서 표시할 컬럼 갯수 지정 필수!

   -->

   <GridView

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/gridView"

       android:gravity="center"

       android:numColumns="4"/>

 

</LinearLayout>

 

< MainActivity.java >

> GridView 에 표시할 화면을 커스터마이징하기 위해 BaseAdapter 클래스를 상속받는 서브클래스 정의

  • Ctrl + I 하면 구현해야 할 메서드들 나옴

  • 여기선 this 를 쓸 수 없음! 그래서 아까 전달받아온 context 사용

package com.example.a0629_ch11_gridview_movie_poster;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.content.Context;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.GridView;

import android.widget.ImageView;

 

public class MainActivity extends AppCompatActivity {

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       GridView gridView = findViewById(R.id.gridView);

 

       // 커스터마이징을 위해 정의한 클래스 인스턴스 생성 => 현재 컨텍스트 객체 전달

       MyGridAdapter gridAdapter = new MyGridAdapter(this);

 

       // GridView 객체의 setAdapter() 메서드를 호출하여 커스터마이징 Adapter 객체 전달

       gridView.setAdapter(gridAdapter);

   }

 

   // GridView 에 표시할 화면을 커스터마이징하기 위해 BaseAdapter 클래스를 상속받는 서브클래스 정의

// => 생성자 정의하여 Context 객체 받아와서 저장

// => 추상메서드 오버라이딩(4개)

//    1) getCount() 메서드에 표시할 그림 갯수 리턴 필수 => 자동 호출됨

//    2) getView() 메서드에 표시할 그림(ImageView) 객체 설정 및 리턴 필수

//       => getCount() 메서드 횟수만큼 자동으로 반복 호출됨

   class MyGridAdapter extends BaseAdapter {

       Context context;

 

       // ------------------

       // 그림 파일 사용을 위해 그림파일의 ID 를 int형 배열에 저장

       int[] posterId = {

         R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,

         R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09, R.drawable.mov10,

         R.drawable.mov11, R.drawable.mov12, R.drawable.mov13, R.drawable.mov14, R.drawable.mov15,

         R.drawable.mov16, R.drawable.mov17, R.drawable.mov18, R.drawable.mov19, R.drawable.mov20,

         R.drawable.mov21, R.drawable.mov22, R.drawable.mov23, R.drawable.mov24, R.drawable.mov25,

         R.drawable.mov26, R.drawable.mov27, R.drawable.mov28, R.drawable.mov29, R.drawable.mov30,

         R.drawable.mov31, R.drawable.mov32, R.drawable.mov33, R.drawable.mov34, R.drawable.mov35,

         R.drawable.mov36, R.drawable.mov37, R.drawable.mov38, R.drawable.mov39, R.drawable.mov40

       };

       // ------------------

 

       // 생성자를 정의하여 컨텍스트 객체 전달받아 저장

       public MyGridAdapter(Context context) {

           this.context = context;

       }

 

       @Override

       public int getCount() {

           // GridView 에 표시할 항목(이미지)의 갯수를 리턴 => 자동으로 호출됨

           return posterId.length;

       }

 

       @Override

       public View getView(int position, View convertView, ViewGroup parent) {

           // GridView 에 표시할 항목의 이미지를 설정 => 자동으로 호출됨

           // => 단, getCount() 메서드에서 리턴하는 값만큼 반복 호출됨

           // ------------- 이미지 1개 표시를 위한 설정 => 반복수행 ---------------

           // 1. ImageView 객체 생성 => 생성자에 전달받은 Context 객체를 파라미터로 전달

           ImageView imageView = new ImageView(context);

           // 2. ImageView 객체 옵션 설정

           //   1) 크기 지정 : setLayoutParams() 메서드를 호출하여 가로, 세로 크기 지정

           //      => GridView.LayoutParams 객체 생성하여 지정

           imageView.setLayoutParams(new GridView.LayoutParams(200, 300));

           //   2) 이미지 확대 방법 설정 : setScaleType() 메서드 호출하여 확대 방법 지정

           imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 가운데 기준으로 맞춤

           //   3) 이미지 주변 여백 지정 : setPadding()

           imageView.setPadding(5,5,5,5);

           // 3. setImageResource() 메서드를 호출하여 표시할 이미지의 ID 전달

           // => getView() 메서드에 파라미터로 전달된 position 값을 인덱스로 활용

           imageView.setImageResource(posterId[position]);

 

           // 4. ImageView 객체를 리턴

           return imageView;

       }

 

       @Override

       public Object getItem(int position) {

           return null;

       }

 

       @Override

       public long getItemId(int position) {

           return 0;

       }

   }

 

}

>>>>>>>> layout 폴더에 dialog.xml 만들기

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

   xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:gravity="center">

  

   <ImageView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:id="@+id/ivPoster"/>

 

</LinearLayout>

 

<MainActivity.java >

  • 여기선 MainActivity.this / getApplicationContext() / context 셋 중 아무거나 사용 가능

           // ------------------------------------------------------------------

           // 각 ImageView 객체에 OnClickListener 연결하여 클릭 이벤트 처리 가능

           imageView.setOnClickListener(new View.OnClickListener() {

               @Override

               public void onClick(View v) {

//                    Toast.makeText(context, "그림 클릭됨!", Toast.LENGTH_SHORT).show();

 

                   // 다이얼로그 기능을 활용하여 클릭된 이미지를 확대하여 표시

                   // 1. 외부 XML 파일(dialog.xml)을 View 객체로 가져오기

                   View dialogView = View.inflate(context, R.layout.dialog, null);

 

                   // 2. ImageView 위젯 ID 가져오기 => View 객체를 통해 findViewById() 메서드 호출

                   ImageView ivPoster = dialogView.findViewById(R.id.ivPoster);

 

                   // 3. ImageView 위젯에 표시할 이미지 ID 지정

                   ivPoster.setImageResource(posterId[position]);

 

                   // 4. AlertDialog.Builder 객체를 생성하여 현재 컨텍스트 전달

                   AlertDialog.Builder dialog = new AlertDialog.Builder(context);

 

                   // 5. 다이얼로그 설정

                   dialog.setTitle("포스터 상세보기"); // 제목 설정

                   dialog.setIcon(R.mipmap.ic_launcher); // 아이콘 설정

                   dialog.setPositiveButton("닫기", null); // 버튼 설정

                   dialog.setView(dialogView); // 다이얼로그에 표시할 View 객체 전달(필수)

 

                   // 6. 다이얼로그 표시

                   dialog.show();

               }

           });

           // ------------------------------------------------------------------

  • 이미지 클릭했을 때 해당 이미지가 이렇게 나타나면 됨!



728x90

'Dev.Program > Android' 카테고리의 다른 글

로그인  (0) 2022.10.10
Spinner / SQLite  (0) 2022.10.10
여러 Activity  (0) 2022.10.10
Fragment / 메뉴와 대화상자 / Context_Menu / Toast  (0) 2022.10.10
ScrollView / SlidingDrawer / ViewFlipper / WebView  (0) 2022.10.10