- 안드로이드 개발 기초
- 에뮬레이터 실행을 위해 아래 경로에 따라 안드로이드 31을 30으로 수정해준다.
- gradle scripts\build.gradle(module.app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.example.ex02"
minSdkVersion 26
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
.....
- src/main/res/layout/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
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 새로운 view를 생성한다.
- src/main/res/layout/(new)item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#2196F3"
android:padding="20sp"
android:layout_margin="10sp"
android:elevation="10sp">
<ImageView
android:id="@+id/img"
android:layout_width="70sp"
android:layout_height="70sp"
android:src="@mipmap/ic_launcher_round"
android:layout_marginRight="20sp"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="홍"
android:textSize="20sp"
android:textColor="#FFFFFF"
android:layout_toRightOf="@id/img"/>
<TextView
android:id="@+id/tel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="010-0101-0101"
android:textSize="20sp"
android:textColor="#FFFFFF"
android:layout_toRightOf="@+id/img"
android:layout_below="@id/name"/>
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="인천시 미추홀구"
android:textColor="#FFFFFF"
android:layout_toRightOf="@id/img"
android:layout_below="@id/tel"/>
</RelativeLayout>
- src/main/java/com/example/ex02/MainActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// R=res, layout=layout,
setContentView(R.layout.item);
}
}
- 새로운 클래스를 생성하겠다.
- src/main/java/com/example/ex02/Person.java
package com.example.ex02;
public class Person {
private String image;
private String name;
private String address;
private String tel;
private int photo;
// 생성자 생성
public Person(int photo, String name, String address, String tel) {
this.photo = photo;
this.name = name;
this.address = address;
this.tel = tel;
}
// 겟터셋터 생성
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public int getPhoto() {
return photo;
}
public void setPhoto(int photo) {
this.photo = photo;
}
@Override
public String toString() {
return "Person{" +
"image='" + image + '\'' +
", name='" + name + '\'' +
", address='" + address + '\'' +
", tel='" + tel + '\'' +
", photo=" + photo +
'}';
}
}
- src/main/java/com/example/ex02/MainActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ListView list;
ArrayList<Person> array;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// R=res, layout=layout,
setContentView(R.layout.activity_main);
// ListView 생성
list = findViewById(R.id.list);
// Data 생성
Person person = new Person(R.drawable.img01, "송중기","인천시 부평구 부평동", "010-0101-01001");
array.add(person);
person = new Person(R.drawable.img03,"조승우","서울시 관악구 신립동","010-0202-0202");
array.add(person);
person = new Person(R.drawable.img04,"지성","강원도 원주시","033-0303-0303");
array.add(person);
person = new Person(R.drawable.img05,"환빈","충청북도 청주시","041-0505-0505");
array.add(person);
}
}
- 에뎁터는 리스트뷰에 연결하기 위한 데이터를 연결하기 위한 수단이라고 생각하면 쉽다.
- 어뎁터를 새로 생성해보겠다.
- src/main/java/com/example/ex02/MainActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ListView list;
ArrayList<Person> array = new ArrayList();
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// R=res, layout=layout,
setContentView(R.layout.activity_main);
// ListView 생성
list = findViewById(R.id.list);
// Data 생성
Person person = new Person(R.drawable.img01, "송중기","인천시 부평구 부평동", "010-0101-01001");
array.add(person);
person = new Person(R.drawable.img03,"조승우","서울시 관악구 신립동","010-0202-0202");
array.add(person);
person = new Person(R.drawable.img04,"지성","강원도 원주시","033-0303-0303");
array.add(person);
person = new Person(R.drawable.img05,"환빈","충청북도 청주시","041-0505-0505");
array.add(person);
// adapter 생성
adapter = new MyAdapter();
list.setAdapter(adapter);
}
public class MyAdapter extends BaseAdapter {
// 위 array 사이즈로 갯수를 지정한다.
@Override
public int getCount() {
return array.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
// 중요
@Override
public View getView(int position, View view, ViewGroup parent) {
view = getLayoutInflater().inflate(R.layout.item, parent, false);
//
Person person = array.get(position);
ImageView img = view.findViewById(R.id.img);
img.setImageResource(person.getPhoto());
TextView name = view.findViewById(R.id.name);
name.setText(person.getName());
TextView address = view.findViewById(R.id.address);
address.setText(person.getAddress());
TextView tel = view.findViewById(R.id.tel);
tel.setText(person.getTel());
return view;
}
}
}
- 삭제를 해보도록 하겠다.
- src/main/res/drawable/(new)ic_remove.xml
- src/main/res/layout/item.xml
.....
<ImageView
android:id="@+id/remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_remove"
android:layout_alignParentRight="true"/>
</RelativeLayout>
- src/main/java/com/example/ex02/MainActivity.java
.....
// 중요
@Override
public View getView(final int position, View view, ViewGroup parent) {
view = getLayoutInflater().inflate(R.layout.item, parent, false);
Person person = array.get(position);
ImageView img = view.findViewById(R.id.img);
img.setImageResource(person.getPhoto());
TextView name = view.findViewById(R.id.name);
name.setText(person.getName());
TextView address = view.findViewById(R.id.address);
address.setText(person.getAddress());
TextView tel = view.findViewById(R.id.tel);
tel.setText(person.getTel());
// new
ImageView remove = view.findViewById(R.id.remove);
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,String.valueOf(position),Toast.LENGTH_SHORT).show();
}
});
return view;
}
.....
.....
ImageView remove = view.findViewById(R.id.remove);
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder box = new AlertDialog.Builder(MainActivity.this);
box.setTitle("질의");
box.setMessage(person.getName()+" 을(를) 삭제하시겠습니까?");
box.setPositiveButton("예",null);
box.setNegativeButton("아니오",null);
box.show();
}
});
return view;
.....
- 이제 삭제가 되도록 하겠다.
.....
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder box = new AlertDialog.Builder(MainActivity.this);
box.setTitle("질의");
box.setMessage(person.getName()+" 을(를) 삭제하시겠습니까?");
box.setNegativeButton("아니오",null);
box.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
array.remove(position);
adapter.notifyDataSetChanged();
}
});
box.show();
}
});
.....
- 이제 DB랑 연결하여 작업해보도록 하겠다.
- 일기장을 위한 어플을 만들어보도로고 하겠다.
- src/main/java/com/example/ex02/(new)DiaryActivity.java
- src/main/AndroidManifest.xml
.....
<activity android:name=".DiaryActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
.....
- sqlite이라는 로컬DB를 이용하겠다.
- src/main/java/com/example/ex02/(new)DiaryDB.java
- 생성자와 메서드를 추가한다.
- table을 생성하고 데이터를 인서트하는 문을 넣는다.
package com.example.ex02;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DiaryDB extends SQLiteOpenHelper {
public DiaryDB(@Nullable Context context) {
super(context, "diary.db", null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table diary(_id integer primary key autoincrement, wdate text, subject text, content text);");
db.execSQL("insert into diary(wdate, subject, content) values('2017/10/10', '안드로이드', '안드로이드 어렵지 않아요!');");
db.execSQL("insert into diary(wdate, subject, content) values('2017/10/10', '장마시작', '장마가 시작되었다.');");
db.execSQL("insert into diary(wdate, subject, content) values('2017/10/12', '생일파티', '정원이 생일 축하 파티를 했다.');");
db.execSQL("insert into diary(wdate, subject, content) values('2017/10/13', '중간고사', '중간고사 시험을 아주 잘 봤다.');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
- 다이어리엑티비티를 시작했을때 DB를 생성하도록 하겠다.
- src/main/java/com/example/ex02/DiaryActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
public class DiaryActivity extends AppCompatActivity {
DiaryDB diary;
SQLiteDatabase db;
// db select한 정보를 커서에 넣는다.
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary);
// this = 현재 엑티비티
diary = new DiaryDB(this);
// diary 오픈 순간 테이블 생성
db = diary.getWritableDatabase();
cursor = db.rawQuery("select * from diary order by _id desc", null);
while(cursor.moveToNext()){
}
}
}
- src/main/res/layout/(new)item_diary.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#3F51B5"
android:padding="20sp"
android:layout_margin="10sp">
<TextView
android:id="@+id/subject"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이곳에는 제목이 들어갑니다."
android:textColor="#FFFFFF"
android:textSize="15sp"/>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이곳에는 내용이 들어갑니다. 이곳에는 내용이 들어갑니다. 이곳에는 내용이 들어갑니다."
android:textColor="#FFFFFF"
android:textSize="10sp"
android:lines="1"
android:layout_below="@id/subject"/>
<TextView
android:id="@+id/wdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2021-09-24"
android:textColor="#FFFFFF"
android:textSize="10sp"
android:layout_alignParentRight="true"/>
</RelativeLayout>
- CursorAdapter 이용해서 쉽게 데이터를 가지고와서 list에 넣을 수 있다.
- src/main/java/com/example/ex02/DiaryActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.w3c.dom.Text;
public class DiaryActivity extends AppCompatActivity {
DiaryDB diary;
SQLiteDatabase db;
// db select한 정보를 커서에 넣는다.
Cursor cursor;
// 전역변수 생성
ListView list;
MyAdater adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary);
// this = 현재 엑티비티
diary = new DiaryDB(this);
// diary 오픈 순간 테이블 생성
db = diary.getWritableDatabase();
cursor = db.rawQuery("select * from diary order by _id desc", null);
// ListView 생성
list=findViewById(R.id.list);
// adapter 생성
adapter = new MyAdater(this,cursor);
list.setAdapter(adapter);
}
// CursorAdapter 이용해서 쉽게 데이터를 가지고와서 list에 넣을 수 있다.
public class MyAdater extends CursorAdapter{
public MyAdater(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return getLayoutInflater().inflate(R.layout.item_diary, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView subject = view.findViewById(R.id.subject);
TextView wdate = view.findViewById(R.id.wdate);
TextView content = view.findViewById(R.id.content);
subject.setText(cursor.getString(2));
wdate.setText(cursor.getString(1));
content.setText(cursor.getString(3));
}
}
}
- 타이틀 변경, 이미지 삽입
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary);
// 타이틀 변경
getSupportActionBar().setTitle("일기장");
// 타이틀 옆에 이미지 삽입
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// vector asset으로 drawable에 이미지 삽입
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_baseline_book_24);
// this = 현재 엑티비티
diary = new DiaryDB(this);
// diary 오픈 순간 테이블 생성
db = diary.getWritableDatabase();
cursor = db.rawQuery("select * from diary order by _id desc", null);
// ListView 생성
list=findViewById(R.id.list);
// adapter 생성
adapter = new MyAdater(this,cursor);
list.setAdapter(adapter);
}
.....
- floating button widget을 이용해보겠다.
- 라이브러리를 추가하겠다.
- build.gradle
implementation 'com.android.support:design:30.0.0'
추가
.....
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.android.support:design:30.0.0'
}
- src/main/java/com/example/ex02/InsertActivity.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".DiaryActivity">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="20sp"
android:layout_marginRight="20sp"
android:backgroundTint="#E91E63"
android:src="@drawable/ic_baseline_add_24"/>
</RelativeLayout>
- src/main/java/com/example/ex02/(new)InsertActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class InsertActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("일기쓰기");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
- src/main/java/com/example/ex02/DiaryActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.w3c.dom.Text;
public class DiaryActivity extends AppCompatActivity {
DiaryDB diary;
SQLiteDatabase db;
// db select한 정보를 커서에 넣는다.
Cursor cursor;
// 전역변수 생성
ListView list;
MyAdater adapter;
//new
FloatingActionButton add;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary);
// 타이틀 변경
getSupportActionBar().setTitle("일기장");
// 타이틀 옆에 이미지 삽입
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// vector asset으로 drawable에 이미지 삽입
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_baseline_book_24);
//new
add = findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(DiaryActivity.this, InsertActivity.class);
startActivity(intent);
}
});
.....
- src/main/res/layout/activity_insert.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".InsertActivity"
android:padding="20sp">
<TextView
android:id="@+id/wdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2021-09-24"/>
<ImageView
android:id="@+id/calender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_calendar"
android:layout_alignParentRight="true"/>
<EditText
android:id="@+id/subject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:hint="제목을 입력하세요."
android:layout_below="@id/wdate"
android:padding="10sp"/>
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="15sp"
android:hint="내용을 입력하세요."
android:layout_below="@id/subject"
android:gravity="top"
android:padding="10sp"
android:background="null"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:backgroundTint="#FF3A3A"
android:src="@drawable/ic_add"
app:borderWidth="0sp"/>
</RelativeLayout>
- 이제 다이어리 테이블에 insert 작업을 하도록 하겠다.
- src/main/java/com/example/ex02/InsertActivity.java
package com.example.ex02;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class InsertActivity extends AppCompatActivity {
FloatingActionButton insert;
TextView wdate;
EditText subject, content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("일기쓰기");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
insert = findViewById(R.id.insert);
wdate = findViewById(R.id.wdate);
subject = findViewById(R.id.subject);
content = findViewById(R.id.content);
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String strDate = wdate.getText().toString();
String strSubject = subject.getText().toString();
String strContent = content.getText().toString();
if(strSubject.length()==0){
Toast.makeText(InsertActivity.this, "제목을 입력하세요.",Toast.LENGTH_SHORT).show();
}else if(strContent.length()==0){
Toast.makeText(InsertActivity.this, "내용을 입력하세요.",Toast.LENGTH_SHORT).show();
}else{
AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
box.setMessage("내용을 저장하시겠습니까?");
box.setNegativeButton("아니오", null);
box.setPositiveButton("예",null);
box.show();
}
}
});
}
}
- DB를 오픈하겠다.
package com.example.ex02;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class InsertActivity extends AppCompatActivity {
.....
// DB 오픈을 위한 변수 선언
DiaryDB diaryDB;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
// DB 오픈
diaryDB = new DiaryDB(this);
// db = 다이어리 정보 put
db = diaryDB.getWritableDatabase();
.....
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String strDate = wdate.getText().toString();
final String strSubject = subject.getText().toString();
final String strContent = content.getText().toString();
if(strSubject.length()==0){
Toast.makeText(InsertActivity.this, "제목을 입력하세요.",Toast.LENGTH_SHORT).show();
}else if(strContent.length()==0){
Toast.makeText(InsertActivity.this, "내용을 입력하세요.",Toast.LENGTH_SHORT).show();
}else{
AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
box.setMessage("내용을 저장하시겠습니까?");
box.setNegativeButton("아니오", null);
box.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String sql = "insert into diary(wdate, subject, content) values(";
sql +="'"+strDate+"',";
sql +="'"+strSubject+"',";
sql +="'"+strContent+"')";
db.execSQL(sql);
// 저장 후 확인 Toast
Toast.makeText(InsertActivity.this, "저장되었습니다.",Toast.LENGTH_SHORT).show();
// insert 후 액티비티 fin
finish();
}
});
box.show();
}
}
});
}
}
- 데이터 입력 후 앱을 재실행 할 필요없이 데이터가 갱신되도록 하겠다.
- src/main/java/com/example/ex02/DiaryActivity.java
package com.example.ex02;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.w3c.dom.Text;
public class DiaryActivity extends AppCompatActivity {
DiaryDB diary;
SQLiteDatabase db;
// db select한 정보를 커서에 넣는다.
Cursor cursor;
// 전역변수 생성
ListView list;
MyAdater adapter;
FloatingActionButton add;
@Override
protected void onCreate(Bundle savedInstanceState) {
.....
}
// CursorAdapter 이용해서 쉽게 데이터를 가지고와서 list에 넣을 수 있다.
public class MyAdater extends CursorAdapter{
.....
}
// new
@Override
protected void onRestart() {
cursor = db.rawQuery("select * from diary order by _id desc", null);
adapter.changeCursor(cursor);
super.onRestart();
}
}
- 뒤로가기 버튼이 작동하게 하겠다.
- src/main/java/com/example/ex02/InsertActivity.java
.....
// 해당 액티비티에 뒤로가기 버튼이 작동되게 하겠다.
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
- insert 시 오늘 날짜가 입력되도록 하겠다.
- src/main/java/com/example/ex02/InsertActivity.java
package com.example.ex02;
.....
public class InsertActivity extends AppCompatActivity {
FloatingActionButton insert;
ImageView calendar;
TextView wdate;
EditText subject, content;
// DB 오픈을 위한 변수 선언
DiaryDB diaryDB;
SQLiteDatabase db;
// 오늘 날짜 입력을 위한 변수
int mYear, mMonth, mDay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
// 그레고리캘린더로 년월일 가지고 오기
GregorianCalendar cal = new GregorianCalendar();
mYear = cal.get(Calendar.YEAR);
mMonth = cal.get(Calendar.MONTH);
mDay = cal.get(Calendar.DAY_OF_MONTH);
// DB 오픈
diaryDB = new DiaryDB(this);
// db = 다이어리 정보 put
db = diaryDB.getWritableDatabase();
getSupportActionBar().setTitle("일기쓰기");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
insert = findViewById(R.id.insert);
wdate = findViewById(R.id.wdate);
// 4자리/2자리/2자리, 순서대로
wdate.setText(String.format("%04d/%02d/%02d",mYear,mMonth+1,mDay));
subject = findViewById(R.id.subject);
content = findViewById(R.id.content);
.....
calendar = findViewById(R.id.calender);
calendar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DatePickerDialog(InsertActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) {
wdate.setText(String.format("%04d/%02d/%02d",year,month+1,dayOfMonth));
}
}, mYear,mMonth,mDay).show();
}
});
}
.....
}
- 다이어리 아이템을 클릭하여 정보를 읽는(Read) 작업을 하도록 하겠다.
- src/main/java/com/example/ex02/ReadActivity.java
package com.example.ex02;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
public class ReadActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
getSupportActionBar().setTitle("일정정보");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
- src/main/java/com/example/ex02/DiaryActivity.java
.....
// adapter 생성
adapter = new MyAdater(this,cursor);
list.setAdapter(adapter);
//new
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(DiaryActivity.this, ReadActivity.class);
//System.out.println("............"+cursor.getInt(0));
intent.putExtra("id", cursor.getInt(0));
startActivity(intent);
}
});
.....
- src/main/java/com/example/ex02/ReadActivity.java
package com.example.ex02;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
public class ReadActivity extends AppCompatActivity {
int id;
TextView wdate;
EditText subject, content;
DiaryDB diaryDB;
SQLiteDatabase db;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("일정정보");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
wdate = findViewById(R.id.wdate);
subject = findViewById(R.id.subject);
content = findViewById(R.id.content);
Intent intent = getIntent();
id = intent.getIntExtra("id",-1);
diaryDB = new DiaryDB(this);
db = diaryDB.getWritableDatabase();
cursor = db.rawQuery("select * from diary where _id="+id,null);
if(cursor.moveToNext()){
wdate.setText(cursor.getString(1));
subject.setText(cursor.getString(2));
content.setText(cursor.getString(3));
}
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
- 읽어온 정보를 수정하는 작업을 하도록 하겠다.
- src/main/java/com/example/ex02/ReadActivity.java
package com.example.ex02;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresPermission;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class ReadActivity extends AppCompatActivity {
int id;
DiaryDB diaryDB;
SQLiteDatabase db;
Cursor cursor;
TextView wdate;
EditText subject, content;
FloatingActionButton update;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("일기정보");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Intent intent=getIntent();
id = intent.getIntExtra("id", -1);
wdate = findViewById(R.id.wdate);
subject = findViewById(R.id.subject);
content = findViewById(R.id.content);
update = findViewById(R.id.insert);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder box=new AlertDialog.Builder(ReadActivity.this);
box.setMessage("수정하실래요?");
box.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String strDate=wdate.getText().toString();
String strSubject=subject.getText().toString();
String strContent=content.getText().toString();
String sql="update diary set ";
sql += "wdate='" + strDate + "',";
sql += "subject='" + strSubject + "',";
sql += "content='" + strContent + "' ";
sql += "where _id=" + id;
db.execSQL(sql);
Toast.makeText(ReadActivity.this, "수정완료!", Toast.LENGTH_SHORT).show();
finish();
}
});
box.setNegativeButton("아니오", null);
box.show();
}
});
diaryDB=new DiaryDB(this);
db=diaryDB.getWritableDatabase();
cursor = db.rawQuery("select * from diary where _id=" + id, null);
if(cursor.moveToNext()) {
wdate.setText(cursor.getString(1));
subject.setText(cursor.getString(2));
content.setText(cursor.getString(3));
}
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
- 삭제하도록 하겠다.
- src/main/res/(new)menu/(new)menu_read.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/remove"
android:title="삭제"
android:icon="@drawable/ic_remove"
app:showAsAction="always"/>
</menu>
- src/main/java/com/example/ex02/ReadActivity.java
.....
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
case R.id.remove:
AlertDialog.Builder box = new AlertDialog.Builder(this);
box.setMessage("삭제하시겠습니까?");
box.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String sql = "delete from diary where _id="+id;
db.execSQL(sql);
Toast.makeText(ReadActivity.this,"삭제되었습니다.",Toast.LENGTH_SHORT).show();
finish();
}
});
box.setNegativeButton("아니오",null);
box.show();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_read,menu);
return super.onCreateOptionsMenu(menu);
}
}
'ICIA 수업일지' 카테고리의 다른 글
2021.09.28 수업일지(안드로이드 기초, SQLite) (0) | 2021.09.28 |
---|---|
2021.09.27 수업일지(안드로이드 개발 기초, SQLite) (0) | 2021.09.27 |
2021.09.23 수업일지(안드로이드 개발 기초, Activity, View) (0) | 2021.09.23 |
2021.09.17 수업일지(React.js을 이용한 블로그 개설) (0) | 2021.09.17 |
2021.09.16 수업일지(React.js) (0) | 2021.09.16 |