[안드로이드] parcelable에 대해 질문이 있습니다.
조회수 2656회
제가 parcelable 을 통해 자주 쓰는 단어를 리스트 형태로 만드는 것을 하고 있는데요.
리스트까지 구현했고 Edittext를 이용해서 생성하고, 리스트 내에 있는 값을 삭제하는 것까지는 했습니다. 다만,
" 앱을 끄면 리스트 목록이 증발되더라구요. "
그래서 sharedpreference를 사용하려 그랬는데 parcelable는 호환이 안된다고 stack overflow에서 글들이 올라와 있고.. DB를 이용하지 않으면 설정 저장은 어려운 걸까요? 만약 가능하다면 방법 좀 알려주세요 ! ㅠㅠ
MacroActivity.java
package com.example.junseo.test03;
//리스트 표현 액티비티
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by Junseo on 2017-06-30.
*/
public class MacroActivity extends AppCompatActivity {
ListView listview;
ArrayAdapter<String> adapter;
TextView tv;
int Addition = 1;
ArrayList<macro> storage = new ArrayList<>();
ArrayList<String> title = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_macro);
setTitle("나의 상용구");
init();
}
void init(){
listview = (ListView)findViewById(R.id.listview);
tv = (TextView)findViewById(R.id.tv);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, title);
listview.setAdapter(adapter);
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
AlertDialog.Builder dlg = new AlertDialog.Builder(MacroActivity.this);
final int position = i;
dlg.setTitle("삭제")
.setMessage("삭제하시겠습니까 ?")
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
title.remove(position);
storage.remove(position);
adapter.notifyDataSetChanged();
tv.setText("상용구 리스트("+title.size()+"개)");
}
}).show();
return true;
}
});
//리스트 목록을 눌렀을 경우.
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//Intent intent = new Intent(MainActivity.this, Main3Activity.class);
// intent.putExtra("macro", storage.get(i));
// startActivity(intent);
}
});
}
//매크로 수정 액티비티로 넘어간다.
public void onClick(View v){
Intent intent = new Intent(this, MacroupActivity.class);
startActivityForResult(intent, Addition);
}
@Override
//상용구 수정 후, 상용구 개수 표시 및 데이터 가져오기.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == Addition){
if(resultCode == RESULT_OK){
macro r = data.getParcelableExtra("macro"); // macro.java 에 일시적으로 저장된 데이터(putExtra한 데이터)를 가져온다.
title.add(r.getName()); // 상용구 내용을 받아온다.
storage.add(r);
adapter.notifyDataSetChanged();
tv.setText("상용구 리스트("+title.size()+"개)");
}
}
}
}
MacroupActivity.java
package com.example.junseo.test03;
// 리스트에 값을 넣기 위한 Edit 액티비티.
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
public class MacroupActivity extends AppCompatActivity {
EditText etName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_macroup);
setTitle("나의 상용구");
init();
}
void init() {
etName = (EditText) findViewById(R.id.etname);
}
public void onClick(View v) {
if (v.getId() == R.id.btnCancel) {
finish();
} else if (v.getId() == R.id.btnAdd) {
Intent intent = new Intent();
String name =etName.getText().toString(); // 입력 받은 값을 name 값에 넣는다.
macro temp = new macro(name); // name 값을 macro.java에서 구현한 형식에 따라 temp 값에 넣는다.
intent.putExtra("macro", temp); // MacroActivity에 전송하기 위해 macro.java에 일시적으로 저장한다.
setResult(RESULT_OK, intent);
finish();
}
}
}
macro.java (Parcelable)
package com.example.junseo.test03;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by Junseo on 2017-07-03.
*/
public class macro implements Parcelable {
private String name;
public macro(String name){
this.name = name;
}
protected macro(Parcel in) {
name = in.readString();
}
public static final Creator<macro> CREATOR = new Creator<macro>() {
@Override
public macro createFromParcel(Parcel in) {
return new macro(in);
}
@Override
public macro[] newArray(int size) {
return new macro[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
Parcelable 은 Java 의 Serializable 어노테이션을 대체하는 Android 고유의 직렬화 기법으로 Intent 에 객체 데이터를 저장하여 다른 컴포넌트로 전달할 때 사용되는 것입니다.
데이터의 영속화와는 아무런 관련이 없습니다.
DB 를 이용하지 않고 데이터를 영속화 하기 위해서는 말씀하신 것처럼 SharedPreferences 를 이용하면 됩니다.
기본적으로 안드로이드의 SharedPreferences 는 일부 Primitive Type 을 제외한 데이터는 보관할 수 없습니다.
이를 위해서는 저장할 데이터를 모델 클래스로 감싸고, 이것을 GSON 같은 Object-JSON mapper 라이브러리를 이용하여 JSON 스타일의 String 으로 만들고 SharedPreference 에 보관하면 되겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력