- 어제 작업했었던 ex03에서 이미지 업로드를 해보겠다.
앱 사용 권한으로 인해서 어제 업로드를 못했었다. 사용자에 의한 권한 설정이 예전에 비해서 강화되었기 때문에 이를 설정해주는 코드를 생성하도록 하겠다.
- src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ex03">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
.....
</manifest>
- 어플이 최초 시작했을때 권한을 설정할것인지 alert하도록 하겠다.
- src/main/java/com/example/ex03/MainActivity.java
package com.example.ex03;
....
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
AddressDB addressDB;
SQLiteDatabase db;
Cursor cursor;
ListView list;
MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 최초 실행 시 권한여부 물음
permissionCheck();
....
....
public void permissionCheck(){
String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
ArrayList<String> checkPermission=new ArrayList<>();
for(String permission:permissions){
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
checkPermission.add(permission);
}
}
if(checkPermission.size() > 0){
String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
ActivityCompat.requestPermissions(this, reqPermission,100);
}
}
}
- insert 시 사진이 들어간 경로를 sysout 해주도록 하겠다.
- src/main/java/com/example/ex03/InsertActivity.java
.....
// 엘범실행
photo = findViewById(R.id.photo);
photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);
}
});
}
// 엘범 실행 후 이쪽으로 옴
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0){
photo.setImageURI(data.getData());
Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
cursor.moveToFirst();
strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
System.out.println("............" + strPhoto);
cursor.close();
}
}
.....
- src/main/java/com/example/ex03/MainActivity.java
.....
public class MyAdapter extends CursorAdapter {
public MyAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return getLayoutInflater().inflate(R.layout.item, viewGroup, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView photo = view.findViewById(R.id.photo);
String strPhoto = cursor.getString(1);
if(strPhoto.equals("")){ // renew
photo.setImageResource(R.drawable.ic_baseline_person_24);
}else{
photo.setImageBitmap(BitmapFactory.decodeFile(strPhoto));
}
TextView name = view.findViewById(R.id.name);
name.setText(cursor.getString(2));
TextView tel = view.findViewById(R.id.tel);
tel.setText(cursor.getString(3));
TextView juso = view.findViewById(R.id.juso);
juso.setText(cursor.getString(4));
}
}
.....
- 새로운 프로젝트 ex04를 생성해주도록 하겠다.
- empty activity - named ex04 - save location data\android\ex04
- src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ex04">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<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>
</application>
</manifest>
- src/main/java/com/example/ex04/MainActivity.java
package com.example.ex04;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
}
public void permissionCheck(){
String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
ArrayList<String> checkPermission=new ArrayList<>();
for(String permission:permissions){
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
checkPermission.add(permission);
}
}
if(checkPermission.size() > 0){
String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
ActivityCompat.requestPermissions(this, reqPermission,100);
}
}
}
- 이제 엘범과 카메라를 이용가능하다.
- 메뉴 이미지 drawable에서 vector asset을 이용해 upload 하겠다.
- src/main/res/drawable/(new)ic_menu.xml
- src/main/java/com/example/ex04/MainActivity.java
package com.example.ex04;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
getSupportActionBar().setTitle("상품관리");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
}
.....
- 왼쪽 상단 메뉴 버튼 및 드래그를 통해서 layout이 뜨도록 하겠다.
- build.gradle
.....
dependencies {
.....
implementation 'com.android.support:design:30.0.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
}
- src/main/res/layout/(new)drawer_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300sp"
android:layout_height="match_parent"
android:background="#000000"
android:id="@+id/drawerView"
android:orientation="vertical"
android:layout_gravity="start">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="200sp"
android:layout_height="300sp"
android:src="@mipmap/ic_launcher"
android:layout_gravity="center_horizontal"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textColor="#FFFFFF"
android:textSize="30sp"
android:text="이주성"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30sp"/>
</LinearLayout>
- src/main/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawerLayout">
<include layout="@layout/drawer_view"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.drawerlayout.widget.DrawerLayout>
- src/main/java/com/example/ex04/MainActivity.java
package com.example.ex04;
.....
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
.....
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
LinearLayout drawerView = findViewById(R.id.drawerView);
if(drawerLayout.isDrawerOpen(drawerView)){
drawerLayout.closeDrawer(drawerView);
}else{
drawerLayout.openDrawer(drawerView);
}
break;
}
return super.onOptionsItemSelected(item);
}
public void permissionCheck(){
.....
}
}
-
- src/main/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawerLayout">
<include layout="@layout/drawer_view"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20sp">
<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:src="@drawable/ic_baseline_add_24"
android:backgroundTint="#000000"
app:borderWidth="0sp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>
- src/main/res/drawable/(new)ic_baseline_insert_photo_24.xml
- 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#FFEB3B"
android:padding="10sp"
android:layout_margin="10sp">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/photo"
android:layout_width="70sp"
android:layout_height="70sp"
android:src="@drawable/ic_baseline_insert_photo_24"
app:civ_border_width="1sp"
app:civ_border_color="#000000"
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:layout_toRightOf="@id/photo"
android:textStyle="bold"/>
<TextView
android:id="@+id/company"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="제조사"
android:textSize="15sp"
android:layout_toRightOf="@id/photo"
android:layout_below="@id/name"/>
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="상품가격"
android:textSize="15sp"
android:layout_toRightOf="@id/photo"
android:layout_below="@id/company"/>
</RelativeLayout>
- db를 생성하는 클래스를 만들도록 하겠다.
- src/main/java/com/example/ex04/(new)ProductDB.java
package com.example.ex04;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class ProductDB extends SQLiteOpenHelper {
public ProductDB(@Nullable Context context) {
super(context, "product.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table product(_id integer primary key autoincrement, name text, company text, price integer,photo text)";
db.execSQL(sql);
sql = "insert into product(name,company, price, photo) values('세탁기', '엘지', 10000000)";
db.execSQL(sql);
sql = "insert into product(name,company, price, photo) values('냉장고', '대우', 15000000)";
db.execSQL(sql);
sql = "insert into product(name,company, price, photo) values('스타일러', '삼성', 12000000)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
- src/main/java/com/example/ex04/MainActivity.java
package com.example.ex04;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import de.hdodenhof.circleimageview.CircleImageView;
public class MainActivity extends AppCompatActivity {
ProductDB productDB;
SQLiteDatabase db;
Cursor cursor;
MyAdapter myAdapter;
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
getSupportActionBar().setTitle("상품관리");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
productDB = new ProductDB(this);
db=productDB.getWritableDatabase();
cursor = db.rawQuery("select * from product order by _id desc", null);
myAdapter = new MyAdapter(this,cursor);
list=findViewById(R.id.list);
list.setAdapter(myAdapter);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
LinearLayout drawerView = findViewById(R.id.drawerView);
if(drawerLayout.isDrawerOpen(drawerView)){
drawerLayout.closeDrawer(drawerView);
}else{
drawerLayout.openDrawer(drawerView);
}
break;
}
return super.onOptionsItemSelected(item);
}
public class MyAdapter extends CursorAdapter{
public MyAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return getLayoutInflater().inflate(R.layout.item,viewGroup,false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
CircleImageView photo = view.findViewById(R.id.photo);
photo.setImageResource(R.drawable.ic_baseline_insert_photo_24);
TextView name = view.findViewById(R.id.name);
name.setText(cursor.getString(1));
TextView company = view.findViewById(R.id.company);
company.setText(cursor.getString(2));
TextView price = view.findViewById(R.id.price);
DecimalFormat df = new DecimalFormat("#,###원");
int intPrice = cursor.getInt(3);
String strPrice = df.format(intPrice);
price.setText(strPrice);
}
}
public void permissionCheck(){
String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
ArrayList<String> checkPermission=new ArrayList<>();
for(String permission:permissions){
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
checkPermission.add(permission);
}
}
if(checkPermission.size() > 0){
String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
ActivityCompat.requestPermissions(this, reqPermission,100);
}
}
}
- 홈에서 오른쪽 상단에 메뉴 버튼을 통해서 상품을 정렬해줄 수 있도록 하겠다.
- src/main/res/(new)menu/(new)main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/asc"
android:title="낮은가격순정렬"/>
<item
android:id="@+id/desc"
android:title="높은가격순정렬"/>
<item
android:id="@+id/name"
android:title="이름순정렬"/>
<item
android:id="@+id/company"
android:title="제조사순정렬"/>
<item
android:id="@+id/id"
android:title="최신상품순정렬"/>
</menu>
- src/main/java/com/example/ex04/MainActivity.java
.....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
public void permissionCheck(){
String[] permissions= {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA };
ArrayList<String> checkPermission=new ArrayList<>();
for(String permission:permissions){
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
checkPermission.add(permission);
}
}
if(checkPermission.size() > 0){
String[] reqPermission=checkPermission.toArray(new String[checkPermission.size()]);
ActivityCompat.requestPermissions(this, reqPermission,100);
}
}
}
- 이제 특정 id를 통해서 정렬해주는 switch문을 생성하도록 하겠다.
- src/main/java/com/example/ex04/MainActivity.java
.....
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
DrawerLayout drawerLayout = findViewById(R.id.drawerLayout);
LinearLayout drawerView = findViewById(R.id.drawerView);
if(drawerLayout.isDrawerOpen(drawerView)){
drawerLayout.closeDrawer(drawerView);
}else{
drawerLayout.openDrawer(drawerView);
}
break;
case R.id.desc:
cursor = db.rawQuery("select * from product order by price desc", null);
myAdapter.changeCursor(cursor);
break;
case R.id.asc:
cursor = db.rawQuery("select * from product order by price", null);
myAdapter.changeCursor(cursor);
break;
case R.id.name:
cursor = db.rawQuery("select * from product order by name", null);
myAdapter.changeCursor(cursor);
break;
case R.id.company:
cursor = db.rawQuery("select * from product order by company", null);
myAdapter.changeCursor(cursor);
break;
case R.id.id:
cursor = db.rawQuery("select * from product order by _id", null);
myAdapter.changeCursor(cursor);
break;
}
return super.onOptionsItemSelected(item);
}
.....
- 이제 검색어를 통해서 아이템을 정렬해보겠다.
- 우선 아이콘을 생성해주도록 하겠다.
- src/main/res/menu/main.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/asc"
android:title="낮은가격순정렬"/>
<item
android:id="@+id/desc"
android:title="높은가격순정렬"/>
<item
android:id="@+id/name"
android:title="이름순정렬"/>
<item
android:id="@+id/company"
android:title="제조사순정렬"/>
<item
android:id="@+id/id"
android:title="최신상품순정렬"/>
<item
android:id="@+id/search"
android:title="search"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always|collapseActionView"
app:actionViewClass="android.widget.SearchView"/>
</menu>
- 글자가 입력될때 search 해주도록 하겠다.
- src/main/java/com/example/ex04/MainActivity.java
.....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
MenuItem search = menu.findItem(R.id.search);
SearchView searchView = (SearchView)search.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
String query = "'%"+ s +"%'";
cursor = db.rawQuery("select * from product where name like "+ query + " or company like "+ query, null);
myAdapter.changeCursor(cursor);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
.....
- 상품등록 레이아웃을 만들고 뒤로가기 버튼을 활성화해주겠다.
- src/main/java/com/example/ex04/(new)InsertActivity.java
package com.example.ex04;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
public class InsertActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
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/ex04/MainActivity.java
package com.example.ex04;
.....
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.text.DecimalFormat;
import java.util.ArrayList;
import de.hdodenhof.circleimageview.CircleImageView;
public class MainActivity extends AppCompatActivity {
ProductDB productDB;
SQLiteDatabase db;
Cursor cursor;
MyAdapter myAdapter;
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
getSupportActionBar().setTitle("상품관리");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
productDB = new ProductDB(this);
db=productDB.getWritableDatabase();
cursor = db.rawQuery("select * from product order by _id desc", null);
myAdapter = new MyAdapter(this,cursor);
list=findViewById(R.id.list);
list.setAdapter(myAdapter);
FloatingActionButton add = findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.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">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/photo"
android:layout_width="250sp"
android:layout_height="250sp"
android:src="@drawable/ic_baseline_insert_photo_24"
app:civ_border_width="2sp"
app:civ_border_color="#4CAF50"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20sp"
android:layout_marginTop="20sp"/>
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="상품명"
android:textSize="20sp"
android:layout_below="@id/photo"/>
<EditText
android:id="@+id/company"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="제조사명"
android:textSize="20sp"
android:layout_below="@id/name"/>
<EditText
android:id="@+id/price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="상품가격"
android:textSize="20sp"
android:inputType="number"
android:layout_below="@id/company"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_add_24"
android:backgroundTint="#000000"
app:borderWidth="0sp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
- insert에서 이미지를 클릭해 엘범을 오픈하고 이미지를 등록해주도록 하겠다.
- src/main/java/com/example/ex04/InsertActivity.java
package com.example.ex04;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.view.View;
import de.hdodenhof.circleimageview.CircleImageView;
public class InsertActivity extends AppCompatActivity {
CircleImageView photo;
String strPhoto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("상품등록");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
photo = findViewById(R.id.photo);
photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent,0);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0){
photo.setImageURI(data.getData());
Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
cursor.moveToFirst();
strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
System.out.println("............" + strPhoto);
cursor.close();
}
}
@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/ex04/InsertActivity.java
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("상품등록");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
productDB = new ProductDB(this);
db=productDB.getWritableDatabase();
photo = findViewById(R.id.photo);
photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent,0);
}
});
name = findViewById(R.id.name);
company = findViewById(R.id.company);
price = findViewById(R.id.price);
FloatingActionButton add = findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
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 strName = name.getText().toString();
String strCompany = company.getText().toString();
String strPrice = price.getText().toString();
String sql = "insert into product(name, company, price, photo) values(";
sql+="'"+strName+"',";
sql+="'"+strCompany+"',";
sql+= strPrice+",";
sql+="'"+strPhoto+"')";
db.execSQL(sql);
finish();
}
});
box.show();
}
});
}
.....
- src/main/java/com/example/ex04/MainActivity.java
.....
@Override
protected void onRestart() {
String sql = "select * from product";
String order = " order by _id desc";
cursor = db.rawQuery(sql+order,null);
myAdapter.changeCursor(cursor);
super.onRestart();
}
}
- 상품을 클릭하면 정보를 읽어오는 액티비티를 만들겠다.
- src/main/java/com/example/ex04/ReadActivity.java
package com.example.ex04;
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/ex04/MainActivity.java
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
getSupportActionBar().setTitle("상품관리");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
productDB = new ProductDB(this);
db=productDB.getWritableDatabase();
cursor = db.rawQuery("select * from product order by _id desc", null);
myAdapter = new MyAdapter(this,cursor);
list=findViewById(R.id.list);
list.setAdapter(myAdapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() { // new
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(MainActivity.this, ReadActivity.class);
intent.putExtra("id",cursor.getInt(0));
startActivity(intent);
}
});
FloatingActionButton add = findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, InsertActivity.class);
startActivity(intent);
}
});
}
.....
- src/main/java/com/example/ex04/ReadActivity.java
package com.example.ex04;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import de.hdodenhof.circleimageview.CircleImageView;
public class ReadActivity extends AppCompatActivity {
ProductDB productDB;
SQLiteDatabase db;
Cursor cursor;
EditText name, company, price;
CircleImageView photo;
String strPhoto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert);
getSupportActionBar().setTitle("상품정보");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
name = findViewById(R.id.name);
company = findViewById(R.id.company);
price = findViewById(R.id.price);
photo = findViewById(R.id.photo);
photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent,0);
}
});
Intent intent = getIntent();
int id = intent.getIntExtra("id",0);
productDB = new ProductDB(this);
db = productDB.getWritableDatabase();
cursor = db.rawQuery("select * from product where _id="+id,null);
if(cursor.moveToNext()){
name.setText(cursor.getString(1));
company.setText(cursor.getString(2));
price.setText(cursor.getString(3));
if(cursor.getString(4)==null || cursor.getString(4).equals("")){
photo.setImageResource(R.drawable.ic_baseline_insert_photo_24);
}else{
// 비트맵으로 변환해서 데이터를 넣는다.
photo.setImageBitmap(BitmapFactory.decodeFile(cursor.getString(4)));
}
}
FloatingActionButton edit = findViewById(R.id.add);
edit.setImageResource(R.drawable.ic_baseline_edit_24);
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder box = new AlertDialog.Builder(ReadActivity.this);
box.setMessage("수정하시겠습니까?");
box.setNegativeButton("아니오",null);
box.setPositiveButton("예", null);
box.show();
}
});
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0){
photo.setImageURI(data.getData());
Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
cursor.moveToFirst();
strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
System.out.println("............" + strPhoto);
cursor.close();
}
}
}
- 이제 삭제작업을 하도록 하겠다.
- src/main/res/menu/(new)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:title="삭데"
android:id="@+id/delete"
android:icon="@drawable/ic_baseline_delete_24"
app:showAsAction="always"/>
</menu>
- src/main/java/com/example/ex04/ReadActivity.java
.....
@Override // new
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.read,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0){
photo.setImageURI(data.getData());
Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
cursor.moveToFirst();
strPhoto = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
System.out.println("............" + strPhoto);
cursor.close();
}
}
}
- 이제 삭제할 수 있는 쿼리문을 생성하고 실행할 수 있도록 하겠다.
- src/main/java/com/example/ex04/ReadActivity.java
.....
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
finish();
break;
case R.id.delete: // new
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 product where _id="+id;
db.execSQL(sql);
finish();
}
});
box.setNegativeButton("아니요", null);
box.show();
}
return super.onOptionsItemSelected(item);
}
.....
- 카카오 검색 API를 이용해 도서검색 APP을 만들어보도록 하겠다.
- src/main/java/com/example/ex04/(new)BookActivity.java
- src/main/java/com/example/ex04/(new)Kakao.java - java class
package com.example.ex04;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Kakao {
public static String connect(String apiURL) {
try {
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Authorization", "KakaoAK 'REST API 키'");
int responseCode = con.getResponseCode();
BufferedReader br;
if(responseCode==200) { // 정상 호출인 경우
br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
} else { //에러 발생가 발생한 경우
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
System.out.println(response.toString());
return response.toString();
}catch (Exception e) {
return e.toString();
}
}
}
- 인터넷을 통해서 카카오 서버에 접근하기 위해서 권한 처리를 해준다.
- book액티비티를 시작 액티비티로 설정해준다.
- src/main/AndroidManifest.xml
.....
<uses-permission android:name="android.permission.INTERNET"/>
.....
<activity android:name=".BookActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
.....
- src/main/java/com/example/ex04/BookActivity.java
package com.example.ex04;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
public class BookActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
new KakaoThread().execute();
}
// 카카오 서버 접속을 위한 thread 설정
class KakaoThread extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String result = Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=안드로이드");
return null;
}
}
}
- 데이터 파싱작업을 해주도록 하겠다.
파싱? : 파싱은 어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것을 말한다. 이러한 파서(parser) 역할을 하는 컴퓨터가 구문 트리(parse tree)로 재구성하는 구문 분석 과정을 뜻한다.
- src/main/java/com/example/ex04/BookActivity.java
package com.example.ex04;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class BookActivity extends AppCompatActivity {
JSONArray jsonArray = new JSONArray();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
new KakaoThread().execute();
}
// 카카오 서버 접속을 위한 thread 설정
class KakaoThread extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String result = Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=안드로이드");
// 데이터 파싱
try {
jsonArray = new JSONObject(result).getJSONArray("documents");
for(int i = 0; i<jsonArray.length(); i++){
JSONObject obj = jsonArray.getJSONObject(i);
System.out.println(obj.getString("title")+obj.getString("authors"));
}
}catch (Exception e){
System.out.println("오류 : "+e.toString());
}
return null;
}
}
}
- src/main/res/layout/activity_book.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=".BookActivity">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
- src/main/res/layout/(new)item_book.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:padding="10sp">
<ImageView
android:id="@+id/image"
android:layout_width="70sp"
android:layout_height="70sp"
android:src="@mipmap/ic_launcher"
android:layout_marginRight="20sp"/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="책제목"
android:layout_toRightOf="@id/image"
android:textSize="15sp"
/>
<TextView
android:id="@+id/authors"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="책저자"
android:layout_toRightOf="@id/image"
android:layout_below="@id/title"
android:textSize="15sp"
/>
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="책가격"
android:layout_toRightOf="@id/image"
android:layout_below="@id/authors"
android:textSize="15sp"
/>
</RelativeLayout>
- 라이브러리 추가
- build.gradle
implementation 'com.squareup.picasso:picasso:2.5.2'
- 내꺼
- src/main/java/com/example/ex04/BookActivity.java
package com.example.ex04;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
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 com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Text;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
public class BookActivity extends AppCompatActivity {
JSONArray jsonArray = new JSONArray();
BookAdapter bookAdapter = new BookAdapter();
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
list = findViewById(R.id.list);
new KakaoThread().execute();
}
// 카카오 서버 접속을 위한 thread 설정
class KakaoThread extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String result = Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=안드로이드");
// 데이터 파싱
try {
jsonArray = new JSONObject(result).getJSONArray("documents");
for(int i = 0; i<jsonArray.length(); i++){
System.out.println("길이 :"+jsonArray.length());
JSONObject obj = jsonArray.getJSONObject(i);
System.out.println(obj.getString("title")+obj.getString("authors"));
}
}catch (Exception e){
System.out.println("오류 : "+e.toString());
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
list.setAdapter(bookAdapter);
}
}
// 책 어뎁터
public class BookAdapter extends BaseAdapter{
@Override
public int getCount() {
return jsonArray.length();
}
@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 viewGroup) {
view = getLayoutInflater().inflate(R.layout.item_book, viewGroup, false);
TextView title = viewGroup.findViewById(R.id.title);
TextView authors = viewGroup.findViewById(R.id.authors);
TextView price = viewGroup.findViewById(R.id.price);
ImageView image = viewGroup.findViewById(R.id.image);
try {
JSONObject obj = jsonArray.getJSONObject(position);
title.setText(obj.getString("title"));
authors.setText(obj.getString("authors"));
DecimalFormat df = new DecimalFormat("#,###원");
price.setText(df.format(obj.getInt("price")));
if(obj.getString("thumbnail")==null || obj.getString("thumbnail").equals("")){
image.setImageResource(R.drawable.ic_launcher_background);
}else{
Picasso.with(BookActivity.this).load(obj.getString("thumbnail")).into(image);
}
}catch (Exception e){
System.out.println("오류 : "+e.toString());
}
return view;
}
}
}
- 선생님꺼
public class BookActivity extends AppCompatActivity {
//ArrayList<HashMap<String,Object>> array=new ArrayList<>();
JSONArray jArray=new JSONArray();
BookAdapter bookAdapter = new BookAdapter();
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
list=findViewById(R.id.list);
new KakaoThread().execute();
}
//카카오서버 접속을위한 쓰레드
class KakaoThread extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String result=Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query=자바");
//데이타파싱
try {
jArray = new JSONObject(result).getJSONArray("documents");
for(int i=0; i<jArray.length(); i++){
JSONObject obj=jArray.getJSONObject(i);
System.out.println(obj.getString("title") + obj.getString("authors"));
}
}catch (Exception e){
System.out.println("오류:" + e.toString());
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
list.setAdapter(bookAdapter);
}
}
//책어댑터
public class BookAdapter extends BaseAdapter{
@Override
public int getCount() {
return jArray.length();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
view = getLayoutInflater().inflate(R.layout.item_book, parent, false);
TextView title=view.findViewById(R.id.title);
TextView authors=view.findViewById(R.id.authors);
TextView price=view.findViewById(R.id.price);
ImageView image=view.findViewById(R.id.image);
try {
JSONObject obj = jArray.getJSONObject(position);
title.setText(obj.getString("title"));
authors.setText(obj.getString("authors"));
DecimalFormat df=new DecimalFormat("#,###원");
price.setText(df.format(obj.getInt("price")));
if(obj.getString("thumbnail")==null || obj.getString("thumbnail").equals("")){
image.setImageResource(R.drawable.ic_launcher_background);
}else{
Picasso.with(BookActivity.this).load(obj.getString("thumbnail")).into(image);
}
}catch(Exception e){
System.out.println("오류:" + e.toString());
}
return view;
}
}
}
비교필
- 이제 검색을 통해서 데이터를 불러오도록 하겠다.
- src/main/res/layout/activity_book.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=".BookActivity">
<EditText
android:id="@+id/query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="검색어 입력"
android:padding="10sp"/>
<ImageView
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_menu_search"
android:layout_alignParentRight="true"/>
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/query"/>
</RelativeLayout>
- src/main/java/com/example/ex04/BookActivity.java
.....
public class BookActivity extends AppCompatActivity {
//ArrayList<HashMap<String,Object>> array=new ArrayList<>();
JSONArray jArray=new JSONArray();
BookAdapter bookAdapter = new BookAdapter();
ListView list;
String query ="파이썬";
EditText editQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
getSupportActionBar().setTitle("도서검색");
list=findViewById(R.id.list);
new KakaoThread().execute();
editQuery=findViewById(R.id.query);
ImageView search = findViewById(R.id.search);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
query = editQuery.getText().toString();
new KakaoThread().execute();
}
});
}
//카카오서버 접속을위한 쓰레드
class KakaoThread extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String result=Kakao.connect("https://dapi.kakao.com/v3/search/book?target=title&query="+query);
.....
- 스피너를 이용해 검색 조건을 select 할 수 있도록 하겠다.
- src/main/res/layout/activity_book.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=".BookActivity">
<LinearLayout
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Spinner
android:id="@+id/spinner"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight="2"/>
<EditText
android:id="@+id/query"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:hint="검색어 입력"
android:layout_weight="3"
android:maxLines="1"
android:padding="10sp"/>
<ImageView
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_menu_search"
android:layout_alignParentRight="true"/>
</LinearLayout>
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/linear"/>
</RelativeLayout>
- src/main/java/com/example/ex04/BookActivity.java
.....
public class BookActivity extends AppCompatActivity {
//ArrayList<HashMap<String,Object>> array=new ArrayList<>();
JSONArray jArray=new JSONArray();
BookAdapter bookAdapter = new BookAdapter();
ListView list;
String query ="파이썬";
EditText editQuery;
Spinner spinner;
String target = "title";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
getSupportActionBar().setTitle("도서검색");
list=findViewById(R.id.list);
new KakaoThread().execute();
editQuery=findViewById(R.id.query);
ImageView search = findViewById(R.id.search);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
query = editQuery.getText().toString();
new KakaoThread().execute();
}
});
spinner = findViewById(R.id.spinner);
String[] items ={"책제목","책저자","출판사"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if(i==0){
target="title";
}else if(i==1){
target="authors";
}else if(i==2){
target="publisher";
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
//카카오서버 접속을위한 쓰레드
class KakaoThread extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String result=Kakao.connect("https://dapi.kakao.com/v3/search/book?target="+target+"&query="+query);
//데이타파싱
.....
'ICIA 수업일지' 카테고리의 다른 글
2021.09.30 수업일지(안드로이드 개발 기초, Firebase) (0) | 2021.09.30 |
---|---|
2021.09.29 수업일지(안드로이드 개발 기초, Kakao API, Google API) (0) | 2021.09.29 |
2021.09.27 수업일지(안드로이드 개발 기초, SQLite) (0) | 2021.09.27 |
2021.09.24 수업일지(안드로이드 개발 기초, SQLite) (0) | 2021.09.24 |
2021.09.23 수업일지(안드로이드 개발 기초, Activity, View) (0) | 2021.09.23 |