[안드로이드] parcelable에 대해 질문이 있습니다.

조회수 2655회

제가 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 에 보관하면 되겠습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)