[Source Path]\omniNotes\build\intermediates\incremental\mergeFossDebugResources\merged.dir\values\values.xml:896: error: <item> inner element must either be a resource reference or empty.
Source Path]\omniNotes\build\intermediates\incremental\mergeFossDebugResources\merged.dir\values\values.xml:898: error: <item> inner element must either be a resource reference or empty..
.
구글링 해보니 관련 이슈가 엄청나게 많다.
이해한 수준에서 간단히 정리하자면
Gradle Build tool이 업데이트 되면서, <item> 태그의 규칙을 엄격하게 체크하게 된것(?)
buildscript { repositories { jcenter() google() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'me.tatarka:gradle-retrolambda:3.2.5' classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2' classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6" classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1' } // Exclude the version that the android plugin depends on. configurations.classpath.exclude group: 'com.android.tools.external.lombok'
}
오늘 프로젝트 빌드시 팝업된 업데이트를 별생각없이 진행했는데 이 영향을 받은 것으로 보인다.
물론, 문제의 소지는 여전히 가지고 있고, 근본적인 해결책이 되진 않는다만
우선은 소스 분석이 목적이니 그냥 넘어가도록 하자.
* 처음에는 이런 에러도 떴었는데, 이리 저리 하다 보니 없어졌는데, 정확한 조치가 어떤것이었는지는 정확히 모르겠음
C:\Users\xxxx\.gradle\caches\transforms-1\files-1.1\library-0.0.2.aar\88f4da1871053ebc65d966332b9adccc\res\values\values.xml:52:5-49: AAPT: error: <item> inner element must either be a resource reference or empty.
BookActivity
int serial = intent.getIntExtra("serial", 0);
String isbn = intent.getStringExtra("isbn");
String title = intent.getStringExtra("title");
Bitmap image = intent.getParcelableExtra("image");
아래와 같이 사용하고 싶은 생각이 들것이다.
MainActivity
Book book = new Book(1, "1-1-1-1", "슬럼독 밀리어네어", bitmap);
Intent intent = new Intent(getApplicationContext(), BookActivity.class);
intent.putExtra("book", book);
BookActivity
Book book = intent.getExtra("book");
우선은 Intent putExtra() 메소스 중, 아래의 두가지 함수원형을 눈여겨 보자!
1. 공유하고자 하는 Class가 Parcelable Interface를 상속받도록 구현한다.
public class Book implements Parcelable {
int serial;
String isbn;
String title;
Bitmap image;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
}
2. 필수 추상 메소스를 구현한다.
* writeToParcel() 메소드가 전달할 데이터를 기록하는 메소드의 구현이다.
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(serial);
dest.writeString(isbn);
dest.writeString(title);
dest.writeParcelable(image, flags);
}
3. CREATOR를 구현한다.
public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
public Book createFromParcel(Parcel in) {
return new Book(in);
}
public Book[] newArray(int size) {
return new Book[size];
}
};
4. 생성자를 구현한다.
* 단순히 생성자라기 보다는 Parcelable data를 해석할 수 있는 방법의 구현이다.
public Book(Parcel src) {
readFromParcel(src);
}
public void readFromParcel(Parcel src) {
serial = src.readInt();
isbn = src.readString();
title = src.readString();
image = src.readParcelable(Bitmap.class.getClassLoader());
}
public Book(int serial, String isbn, String title, Bitmap image) {
this.serial = serial;
this.title = title;
this.isbn = isbn;
this.image = image;
}
전체 코드는 다음과 같다.
Book.java
( getter/setter의 구현은 필수 적이지 않다 )
package com.tistory.thepassion.pacelable;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
int serial;
String isbn;
String title;
Bitmap image;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(serial);
dest.writeString(isbn);
dest.writeString(title);
dest.writeParcelable(image, flags);
}
public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
public Book createFromParcel(Parcel in) {
return new Book(in);
}
public Book[] newArray(int size) {
return new Book[size];
}
};
public Book(Parcel src) {
readFromParcel(src);
}
public void readFromParcel(Parcel src) {
serial = src.readInt();
isbn = src.readString();
title = src.readString();
image = src.readParcelable(Bitmap.class.getClassLoader());
// image = Bitmap.CREATOR.createFromParcel(src);
}
public Book(int serial, String isbn, String title, Bitmap image) {
this.serial = serial;
this.title = title;
this.isbn = isbn;
this.image = image;
}
public int getSerial() {
return serial;
}
public void setSerial(int serial) {
this.serial = serial;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public Bitmap getImage() {
return image;
}
public void setImage(Bitmap image) {
this.image = image;
}
}
MainActivity.java
package com.tistory.thepassion.pacelable;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
Book book;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res = getResources(); Drawable d = res.getDrawable(R.drawable.book);
Bitmap bitmap = ((BitmapDrawable) d).getBitmap();
book = new Book(1, "1-1-1-1", "슬럼독 밀리어네어", bitmap);
Intent intent = new Intent(getApplicationContext(), BookActivity.class);
intent.putExtra("book", book);
startActivity(intent);
}
}