2022. 10. 10. 15:51ㆍDev.Program/Android
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();
}
});
// ------------------------------------------------------------------
- 이미지 클릭했을 때 해당 이미지가 이렇게 나타나면 됨!
'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 |