You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 안드로이드 메모장 소스 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: 안드로이드 메모장 소스 안드로이드 스튜디오 메모장 리스트, 안드로이드 스튜디오 메모장 앱 만들기, 메모장 어플 만들기, 자바 메모장 만들기, 안드로이드 txt 파일 수정
[Java][Android] 메모장 만들기(1. 메모 작성 및 저장)
- Article author: stickode.tistory.com
- Reviews from users: 42670 Ratings
- Top rated: 3.9
- Lowest rated: 1
- Summary of article content: Articles about [Java][Android] 메모장 만들기(1. 메모 작성 및 저장) [Java][Andro] 메모장 만들기(1. 메모 작성 및 저장). teamnova 2021. 2. 9. 13:00. 안녕하세요. 스틱코드를 이용해서 메모장을 구현해볼 예정입니다. …
- Most searched keywords: Whether you are looking for [Java][Android] 메모장 만들기(1. 메모 작성 및 저장) [Java][Andro] 메모장 만들기(1. 메모 작성 및 저장). teamnova 2021. 2. 9. 13:00. 안녕하세요. 스틱코드를 이용해서 메모장을 구현해볼 예정입니다. 안녕하세요. 스틱코드를 이용해서 메모장을 구현해볼 예정입니다. ===================================== 사용된 xml 파일은 스틱코드 포스트로 게시해두었습니다. stickode.com/detail.html?no=1882 스틱코드 s..
- Table of Contents:
태그
관련글
댓글2
공지사항
최근글
인기글
최근댓글
태그
전체 방문자
#6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현
- Article author: mynamewoon.tistory.com
- Reviews from users: 15245 Ratings
- Top rated: 4.0
- Lowest rated: 1
- Summary of article content: Articles about #6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현 안드로이드. #6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA … …
- Most searched keywords: Whether you are looking for #6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현 안드로이드. #6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA … 저번에는 리사이클러뷰 어댑터에서 롱 클릭 리스너를 이용했다면 이번에는 onBind에서 setOnClickListener을 사용해서 작성된 메모를 누르면 DetailActivity로 넘어가서 작성된 메모 내용을 볼 수 있게 할 겁니다…
- Table of Contents:
성장하는데 끝이없다
#6 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 메모 수정 메모 ROOM UPDATE JAVA로 구현 본문
티스토리툴바
검색할 수 있는 메모장 만들기
- Article author: wltsp222-tistroy-com.tistory.com
- Reviews from users: 12887 Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about 검색할 수 있는 메모장 만들기 EditText; import andro.wget.Toast; import com.google.andro.material.floatingactionbutton.FloatingActionButton; import java.text. …
- Most searched keywords: Whether you are looking for 검색할 수 있는 메모장 만들기 EditText; import andro.wget.Toast; import com.google.andro.material.floatingactionbutton.FloatingActionButton; import java.text. 메인화면 메모아이콘,검색버튼,옵션메뉴,수정버튼,삭제버튼,입력버튼 옵션메뉴를 누르면 실시간 검색할수 있다. 삭제할 수있다. 수정할수있다. 입력가능 InsertActivity.java package com.example.ex09; imp..
- Table of Contents:
android – 안드로이드 초간단 메모장 만들기
- Article author: lopicit.tistory.com
- Reviews from users: 35734 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about android – 안드로이드 초간단 메모장 만들기 초간단 메모장 만들기. 간단한 메모장 설명. – 3개의 버튼으로 구성되어 있다.(load, save, delete). – 그 아래 edittext를 통해서 글을 입력하고 … …
- Most searched keywords: Whether you are looking for android – 안드로이드 초간단 메모장 만들기 초간단 메모장 만들기. 간단한 메모장 설명. – 3개의 버튼으로 구성되어 있다.(load, save, delete). – 그 아래 edittext를 통해서 글을 입력하고 … 초간단 메모장 만들기 간단한 메모장 설명 – 3개의 버튼으로 구성되어 있다.(load, save, delete) – 그 아래 edittext를 통해서 글을 입력하고 불러오기하여 수정할 수 있습니다. – load, save, delete를 할때마다..IT 정보 & Tip 을 포스팅하고 있습니다.
- Table of Contents:
android – 안드로이드 초간단 메모장 만들기
티스토리툴바
안드로이드 메모장 앱 만들기
- Article author: cpp-shooter.tistory.com
- Reviews from users: 28223 Ratings
- Top rated: 3.3
- Lowest rated: 1
- Summary of article content: Articles about 안드로이드 메모장 앱 만들기 안드로이드 앱 기초 공부의 일환으로 메모장 앱을 만들어보았다. … 구현한 메인 액티비티와 레이아웃 소스는 아래와 같다. 개발 환경 : Andro … …
- Most searched keywords: Whether you are looking for 안드로이드 메모장 앱 만들기 안드로이드 앱 기초 공부의 일환으로 메모장 앱을 만들어보았다. … 구현한 메인 액티비티와 레이아웃 소스는 아래와 같다. 개발 환경 : Andro … 안드로이드 앱 기초 공부의 일환으로 메모장 앱을 만들어보았다. 버튼을 통해 텍스트파일을 저장,로드,삭제하는 기능을 구현하고 에디트 텍스트 (Edit Text) UI를 통해 메모 텍스트를 멀티라인 입력할 수 있게 하..
- Table of Contents:
CPP-Shooter’s Life
안드로이드 메모장 앱 만들기 본문
티스토리툴바
[안드로이드 스튜디오 APK] 메모장 Memo 오픈 소스
- Article author: spita1.blogspot.com
- Reviews from users: 7524 Ratings
- Top rated: 3.8
- Lowest rated: 1
- Summary of article content: Articles about [안드로이드 스튜디오 APK] 메모장 Memo 오픈 소스 [안드로이드 스튜디오 APK] 메모장 Memo 오픈 소스. 아래 영상은 밑에 보이는 소스를 응용해서 추가적인 기능을 넣어서 영상을 찍은 것입니다. …
- Most searched keywords: Whether you are looking for [안드로이드 스튜디오 APK] 메모장 Memo 오픈 소스 [안드로이드 스튜디오 APK] 메모장 Memo 오픈 소스. 아래 영상은 밑에 보이는 소스를 응용해서 추가적인 기능을 넣어서 영상을 찍은 것입니다.
- Table of Contents:
[Android] 메모장 앱 만들기(2)_Realm DB에 데이터 추가하기 :: Hello World!
- Article author: hjstory115.tistory.com
- Reviews from users: 9377 Ratings
- Top rated: 3.6
- Lowest rated: 1
- Summary of article content: Articles about [Android] 메모장 앱 만들기(2)_Realm DB에 데이터 추가하기 :: Hello World! [Andro] 메모장 앱 만들기(2)_Realm DB에 데이터 추가하기. tjgpwl115 2020. 4. 24. 15:39. 지난 시간은 DB와 연결했다면 이번에는 실제로 메모 작성 페이지와 … …
- Most searched keywords: Whether you are looking for [Android] 메모장 앱 만들기(2)_Realm DB에 데이터 추가하기 :: Hello World! [Andro] 메모장 앱 만들기(2)_Realm DB에 데이터 추가하기. tjgpwl115 2020. 4. 24. 15:39. 지난 시간은 DB와 연결했다면 이번에는 실제로 메모 작성 페이지와 … 지난 시간은 DB와 연결했다면 이번에는 실제로 메모 작성 페이지와 리스트를 보여줄 예정입니다. 먼저, 메모작성 후 데이터들을 보여줄 recyclerview를 사용해봅시다. 1. Recyclerview 사용하기 build.gradle의 de..
- Table of Contents:
TAG
관련글 관련글 더보기
인기포스트
[android/개발자]안드로이드 메모장 앱 만들기 및 마무리하기-2
- Article author: sky17777.tistory.com
- Reviews from users: 38943 Ratings
- Top rated: 3.5
- Lowest rated: 1
- Summary of article content: Articles about [android/개발자]안드로이드 메모장 앱 만들기 및 마무리하기-2 메모장이 마무리 하기위해서 안드로이드의 drawable 그림을 이용해서 만들어 … activity_menu.xml의 버튼을 활용하였으며, 앱의 상태와 소스를. …
- Most searched keywords: Whether you are looking for [android/개발자]안드로이드 메모장 앱 만들기 및 마무리하기-2 메모장이 마무리 하기위해서 안드로이드의 drawable 그림을 이용해서 만들어 … activity_menu.xml의 버튼을 활용하였으며, 앱의 상태와 소스를. 저번 포스팅에 이어서 메모장을 마무리 해보도록 하겠습니다. 메모장이 마무리 하기위해서 안드로이드의 drawable 그림을 이용해서 만들어 보았습니다. 일단 drawable 그림을 넣는 것은 생략하기로 해보겠습니다…
- Table of Contents:
태그
‘IT 관련안드로이드(java kotlin등등) 관련 내용’ Related Articles
공지사항
최근 포스트
태그
검색
전체 방문자
티스토리툴바
txtpad – 메모장, txt 파일 만들기 🗒️ – Google Play 앱
- Article author: play.google.com
- Reviews from users: 5527 Ratings
- Top rated: 3.0
- Lowest rated: 1
- Summary of article content: Articles about txtpad – 메모장, txt 파일 만들기 🗒️ – Google Play 앱 txtpad는 .txt 파일을 만들 수있는 편리하고 간단하며 무료 메모장입니다. 불필요한 것은 없으며 노트를 만들고 편집하기 만하면됩니다. txt 메모를 검색합니다. …
- Most searched keywords: Whether you are looking for txtpad – 메모장, txt 파일 만들기 🗒️ – Google Play 앱 txtpad는 .txt 파일을 만들 수있는 편리하고 간단하며 무료 메모장입니다. 불필요한 것은 없으며 노트를 만들고 편집하기 만하면됩니다. txt 메모를 검색합니다. txtpad는 .txt 파일을 만들 때 편리하고 간단하며 무료 메모장입니다.
- Table of Contents:
앱 정보
데이터 보안
평가 및 리뷰
개발자 연락처
유사한 앱
pohrebniakov의 앱 더보기
See more articles in the same category here: https://chewathai27.com/to/blog.
[Java][Android] 메모장 만들기(1. 메모 작성 및 저장)
안녕하세요.
스틱코드를 이용해서 메모장을 구현해볼 예정입니다.
=====================================
사용된 xml 파일은 스틱코드 포스트로 게시해두었습니다.
stickode.com/detail.html?no=1882
=====================================
1. Activity 간 이동
첫번째로 버튼을 눌러 다른 액티비티로 이동하는 로직을 구현하도록 하겠습니다.
* MainActivity.class / 클릭리스너 및 인텐트
Button write_btn; //작성하기 버튼 private int REQUEST_TEST = 200; write_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 버튼을 눌러 이동할 액티비티를 정해준다 (ex, WriteActivity.class) Intent intent = new Intent(getApplicationContext(), WriteActivity.class); //startActivity(intent); // 해당 액티비티에 단순 값 전달과 이동이면 startActivity startActivityForResult(intent,REQUEST_TEST); // 메모를 작성하고 결과값을 받기 위해 } });
메인 화면에서 작성하기 버튼을 눌러 WriteActivity로 이동
2. 입력값 저장(SharedPreperence)
메모를 작성하여 저장하기 버튼을 눌렀을 때 SharedPreperence로 저장합니다.
* WriteActivity.class
public class WriteActivity extends AppCompatActivity { PreferenceManager pref; Button back_btn; Button save_btn; EditText title; EditText content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_write); pref = new PreferenceManager(); back_btn = findViewById(R.id.back_btn); save_btn = findViewById(R.id.save_btn); // editText 할당 title = findViewById(R.id.memo_title_edit); content = findViewById(R.id.memo_content_edit); back_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); save_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 저장 버튼을 눌러 // 작성한 editText를 저장 String edit_title = title.getText().toString(); String edit_content = content.getText().toString(); // String 값을 JSONObject로 변환하여 사용할 수 있도록 메모의 제목과 타이틀을 JSON 형식로 저장 String save_form = “{\”title\”:\””+edit_title+”\”,\”content\”:\””+edit_content+”\”}”; // key값이 겹치지 않도록 현재 시간으로 부여 long now = System.currentTimeMillis(); Date mDate = new Date(now); SimpleDateFormat simpleDate = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”); String getTime = simpleDate.format(mDate).toString(); Log.d(“WriteActivity”,”제목 : “+edit_title+”, 내용 : “+edit_content+”, 현재시간 : “+getTime); //PreferenceManager 클래스에서 저장에 관한 메소드를 관리 pref.setString(getApplication(),getTime,save_form); // Intent로 값을 MainActivity에 전달 Intent intent = new Intent(); intent.putExtra(“date”,getTime); intent.putExtra(“title”,edit_title); intent.putExtra(“content”,edit_content); setResult(RESULT_OK, intent); finish(); } }); } }
PreferenceManager 클래스는 스틱코드에 있는 ‘sharedpreferences 간편 사용 클래스 만들기’ 포스트를 가져와 사용하였고 필요하거나 없어도 되는 부분은 입맛에 맛게 커스텀해주세요.
* PreferenceManager.class
public class PreferenceManager { public static final String PREFERENCES_NAME = “memo_contain”; private static final String DEFAULT_VALUE_STRING = ” “; private static final boolean DEFAULT_VALUE_BOOLEAN = false; private static final int DEFAULT_VALUE_INT = -1; private static final long DEFAULT_VALUE_LONG = -1L; private static final float DEFAULT_VALUE_FLOAT = -1F; private static SharedPreferences getPreferences(Context context) { return context.getSharedPreferences(PREFERENCES_NAME, context.MODE_PRIVATE); } /* String 값 저장 param context param key param value */ public static void setString(Context context, String key, String value){ SharedPreferences prefs = getPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putString(key, value); editor.apply(); } /* String 값 로드 param context param key return */ public static String getString(Context context, String key){ SharedPreferences prefs = getPreferences(context); String value = prefs.getString(key, DEFAULT_VALUE_STRING); return value; } /* 키 값 삭제 param context param key */ public static void removeKey(Context context, String key){ SharedPreferences prefs = getPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.remove(key); editor.commit(); } /* 모든 저장 데이터 삭제 param context */ public static void clear(Context context){ SharedPreferences prefs = getPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.clear(); editor.commit(); } }
3. 리사이클러뷰 적용
‘리사이클러뷰 구현’ 포스트를 사용하였고, 일부 메모장 앱에 사용할 수 있도록 수정했습니다.
* MemoAdapter.class
public class MemoAdapter extends RecyclerView.Adapter
{ private Activity mcontext; // Memo 객체를 담을 MemoItem / 작성일/제목/내용 이 담긴다 private ArrayList items = new ArrayList<>(); public MemoAdapter(Activity context) { mcontext = context; } // 리사이클러뷰에 데이터 추가 메소드 public void addItem(MemoItem item) { items.add(item); } @NonNull @Override public MemoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { Context context = parent.getContext(); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ; // 미리 만들어 놓은 item_rv_memo.xml 기입 View view = inflater.inflate(R.layout.item_rv_memo, parent, false) ; MemoAdapter.ViewHolder vh = new MemoAdapter.ViewHolder(view) ; return vh; } @Override public int getItemCount() { return items.size() ; } @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onBindViewHolder(@NonNull final MemoAdapter.ViewHolder holder, final int position) { MemoItem item = items.get(position); // 메모 아이템 xml상에 메모 데이터가 적용되도록 세팅 holder.setItem(item); // 메모 아이템 안에 있는 보기 버튼을 클릭하여 상세보기(ViewActivity)로 이동 holder.view_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mcontext, ViewActivity.class); intent.putExtra(“key”,holder.date.getText().toString()); mcontext.startActivity(intent); } }); } // 커스텀 뷰 홀더가 아님 public class ViewHolder extends RecyclerView.ViewHolder{ TextView date; TextView title; Button view_btn; Button delete_btn; ViewHolder(View itemView){ super(itemView); //뷰홀더에 필요한 아이템데이터 findview date = itemView.findViewById(R.id.date_contain);//아이템에 들어갈 텍스트 title = itemView.findViewById(R.id.title_contain);//아이템에 들어갈 텍스트 view_btn = itemView.findViewById(R.id.view_btn); delete_btn = itemView.findViewById(R.id.delete_btn); } //아이템뷰에 binding할 데이터 public void setItem(MemoItem item) { date.setText(item.getDate()); title.setText(item.getTitle()); } } } * MemoItem.class
public class MemoItem { String date; String title; String content; public MemoItem(String date, String title, String content) { this.date = date; this.title = title; this.content = content; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
리사이클러뷰 클래스를 만들었으니 다시 MainActivity로 돌아가 리사이클러뷰를 적용하자.
*MainActivity.class / 리사이클러뷰 및 SharedPreference 데이터 불러오기
RecyclerView recyclerView; MemoAdapter memoAdapter; //onCreate //리사이클러뷰 세팅 LinearLayoutManager linearLayoutManager; recyclerView = findViewById(R.id.memo_rv);//리사이클러뷰 findView linearLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false); memoAdapter = new MemoAdapter(MainActivity.this); recyclerView.setLayoutManager(linearLayoutManager);//linearlayout 세팅 recyclerView.setAdapter(memoAdapter);//adapter 세팅 //쉐어드 모든 키 벨류 가져오기 SharedPreferences prefb =getSharedPreferences(“memo_contain”, MODE_PRIVATE); Collection> col_val = prefb.getAll().values(); Iterator> it_val = col_val.iterator(); Collection> col_key = prefb.getAll().keySet(); Iterator> it_key = col_key.iterator(); while(it_val.hasNext() && it_key.hasNext()) { String key = (String) it_key.next(); String value = (String) it_val.next(); // value 값은 다음과 같이 저장되어있다 // “{\”title\”:\”hi title\”,\”content\”:\”hi content\”}” try { // String으로 된 value를 JSONObject로 변환하여 key-value로 데이터 추출 JSONObject jsonObject = new JSONObject(value); String title = (String) jsonObject.getString(“title”); String content = (String) jsonObject.getString(“content”); // 리사이클러뷰 어뎁터 addItem으로 목록 추가 memoAdapter.addItem(new MemoItem(key, title, content)); } catch (JSONException e) { } // 목록 갱신하여 뷰에 띄어줌 memoAdapter.notifyDataSetChanged(); }
*MainActivity.class / 메모 작성 액티비티에서 작성한 데이터를 받아 리사이클러뷰 목록에 적용 코드
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_TEST) { if (resultCode == RESULT_OK) { // 전달 받은 값 Intent intent = getIntent(); String get_date = data.getStringExtra(“date”); String get_title = data.getStringExtra(“title”); String get_content = data.getStringExtra(“content”); // 리사이클러뷰 목록에 추가 memoAdapter.addItem(new MemoItem(get_date,get_title,get_content)); // 목록 갱신 memoAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this, “작성 되었습니다”, Toast.LENGTH_SHORT).show(); } else { // RESULT_CANCEL Toast.makeText(MainActivity.this, “저장 되지 않음”, Toast.LENGTH_SHORT).show(); } } }
*MainActivity.class / 전체
public class MainActivity extends AppCompatActivity { private int REQUEST_TEST = 200; Button write_btn; PreferenceManager pref; RecyclerView recyclerView; MemoAdapter memoAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pref = new PreferenceManager(); write_btn = findViewById(R.id.write_btn); write_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), WriteActivity.class); startActivityForResult(intent,REQUEST_TEST); } }); //리사이클러뷰 세팅 LinearLayoutManager linearLayoutManager; recyclerView = findViewById(R.id.memo_rv);//리사이클러뷰 findView linearLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false); memoAdapter = new MemoAdapter(MainActivity.this); recyclerView.setLayoutManager(linearLayoutManager);//linearlayout 세팅 recyclerView.setAdapter(memoAdapter);//adapter 세팅 //쉐어드 모든 키 벨류 가져오기 SharedPreferences prefb =getSharedPreferences(“memo_contain”, MODE_PRIVATE); Collection> col_val = prefb.getAll().values(); Iterator> it_val = col_val.iterator(); Collection> col_key = prefb.getAll().keySet(); Iterator> it_key = col_key.iterator(); while(it_val.hasNext() && it_key.hasNext()) { String key = (String) it_key.next(); String value = (String) it_val.next(); try { JSONObject jsonObject = new JSONObject(value); String title = (String) jsonObject.getString(“title”); String content = (String) jsonObject.getString(“content”); memoAdapter.addItem(new MemoItem(key, title, content)); } catch (JSONException e) { Log.d(“MainActivity”,”JSONObject : “+e) } memoAdapter.notifyDataSetChanged(); } //pref.clear(MainActivity.this); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_TEST) { if (resultCode == RESULT_OK) { Intent intent = getIntent(); String get_date = data.getStringExtra(“date”); String get_title = data.getStringExtra(“title”); String get_content = data.getStringExtra(“content”); memoAdapter.addItem(new MemoItem(get_date,get_title,get_content)); memoAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this, “작성 되었습니다”, Toast.LENGTH_SHORT).show(); } else { // RESULT_CANCEL Toast.makeText(MainActivity.this, “저장 되지 않음”, Toast.LENGTH_SHORT).show(); } } } }
4. 메모 상세보기
‘MemoAdapter’ 중간 onBindViewHolder 부분에 있는 메모 상세보기 버튼 클릭리스너가 있다.
SharedPreference로 저장된 Key(작성일)을 호출하여 상세 페이지에 데이터를 표기 한다.
* ViewActivity.class
public class ViewActivity extends AppCompatActivity { PreferenceManager pref; TextView view_title; TextView view_content; Button back_list_btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view); pref = new PreferenceManager(); view_title = findViewById(R.id.view_title); view_content = findViewById(R.id.view_content); back_list_btn = findViewById(R.id.back_list_btn); // 인텐트로 리사이클러뷰 목록 하나의 키값을 받는다 Intent intent = getIntent(); String key = intent.getStringExtra(“key”); String value = pref.getString(getApplication(),key); try { JSONObject jsonObject = new JSONObject(value); String title = (String) jsonObject.getString(“title”); String content = (String) jsonObject.getString(“content”); view_title.setText(title); view_content.setText(content); } catch (JSONException e) { e.printStackTrace(); } back_list_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } }
지금까지 스틱코드를 이용하여 메모장 어플을 만들어 보았습니다.
다음 포스트에는 이어서 메모 수정과 삭제를 올릴 예정입니다.
스틱코드 참고 포스트
* 팀노바 기초 _ 안드로이드 자주쓰는 메소드
stickode.com/detail.html?no=1193
* 팀노바_기초_안드로이드 setOnClickListener
stickode.com/detail.html?no=1351
* sharedpreferences 간편 사용 클래스 만들기
stickode.com/detail.html?no=1548
* 안드로이드 FindView, Button, BackPressed, Dialog, PoPup 등 기타
stickode.com/detail.html?no=1845
*리사이클러뷰 구현
stickode.com/detail.html?no=1504
* SharedPreference 모든 키벨류 불러오기
stickode.com/detail.html?no=1881
* 안드로이드 레이아웃 테두리 넣기
stickode.com/detail.html?no=1171
#6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기
저번에는 리사이클러뷰 어댑터에서 롱 클릭 리스너를 이용했다면 이번에는 onBind에서 setOnClickListener을 사용해서 작성된 메모를 누르면 DetailActivity로 넘어가서 작성된 메모 내용을 볼 수 있게 할 겁니다.
메모를 보고 나서, 수정하고 싶으며 바로 로컬 DB에 내용을 변경해서 리사이클러 뷰에 띄우는거 까지 하겠습니다.
1. 클래스
메모 세부 내용을 보기 위해서 DetailActivity 를 추가 해 줬습니다.
해당하는 xml 파일까지 작성한 모습입니다.
xml 파일은 git을 참고해주세요.
2. RecyclerAdapter
메모 아이템을 삭제한것과 마찬가지로 리사이클러뷰 어댑터 onBind 에서 이벤트를 같이 바인딩해줘
아이템을 클릭하게 되면 DetailActivity로 넘어가게 됩니다.
이때 넘겨주는 데이터는 클릭된 메모 객체이고 intent를 사용하여 넘겨줍니다.
3. DetailActivity
detail 객체를 하나 만들어서 넘겨온 데이터를 받아줍니다.
id, title, des 에서 넘어온 값들을 받아오고, 받은 값들을 다시 DetailActivity에 뿌려주게 되면
아래와 같은 화면이 나타납니다.
+ 버튼은 수정하고 나서 저장할 때, x는 그냥 종료할 때 클릭하는 버튼입니다.
EditText로 구성했기 때문에 DetailActivity에서는 텍스트를 변경 할 수 있습니다.
1. + 버튼 클릭시
+버튼의 이름은 update입니다.
update 버튼을 누르면, EditText 있는 값을 다시 한 번 가져와 줍니다. 이유는 수정된 내용이 존재 할 수도 있기 때문입니다. 그렇게 제목과 본문 내용을 가져와주는데 여기서 다른점은 id 값을 가져와 주는 것입니다.
id 값을 가져오는 이유는 우리는 자동으로 로컬 DB에 저장할 때 id 값을 기본키로 자동으로 생성해줬습니다.
이렇게 자동으로 생성된 키는 현재 우리가 수정된 데이터가 몇 번째 id 값을 가지고 있는지를 가지고 변경을 시켜줄것입니다.
db.userDao().update(title, des, id) 로 만들어주고, 액티비티를 종료 시킵니다.
2. x 버튼 클릭시
x버튼의 이름은 exit이고 종료 버튼을 누르게 되면 그대로 MainActivity로 돌아가게 됩니다.
4. User Class
User 클래스에서 세로 속성 ( attribute )의 이름(domain) 값을 설정해 줍니다.
이유는 UserDao 인터페이스에서 update를 수행할 때 새로 들어온 값을 기존에 있던 값과 대체하기 위해서 입니다.
좀더 자세한건 다음 UserDao 인터페이스 코드를 보시면 이해하실 수 있을 것입니다.
5. UserDao
새로 추가된 부분입니다. update 라고 따로 구성되어있지만, 사용법을 보면 LiveData를 사용해서 바뀔때마다 update를 호출해주면 자동으로 변경되고 값이 바뀌는걸 볼 수 있었습니다. 하지만 저는 지금 자바로만 작성하고 있기 때문에 아무리 눌러도 변경이 되지 않았습니다.
그렇기 때문에 새롭게 쿼리문을 만들어 주었고,
“UPDATE 테이블이름 SET attribute domain WHERE 키”
제꺼의 테이블 이름은 memoTable
db.userDao().update(title, des, id) 로 넘어온 값에서
user_title = :title
user_des = :des
user_id = :id
값으로 변경을 해주게 됩니다.
하지만 여기서도 맨 처음 로컬DB에 삽입했을 때 바로 갱신이 되지 않았습니다
그래서 삽입했을 때 처럼 수정하고 나서도 startActivityForResult 를 사용해서 바로 갱신을 해주려고 했습니다.
그러나 리사이클러뷰에서 넘겨주는것이라 그런지 사용이 되지 않아서 저는 고민을 했습니다.
고민은 startActivityForResult 가 onResume 전에 작동하는 거라면?
안드로이드 생명주기에서 onResume 전에 바로 작동하는 onStart()인데
onStart에서 새롭게 리사이클러 뷰에 데이터를 바꿔주고나서
onCreate에서 바인딩을 해주면 바로 갱신이 되는 것 처럼 보이지 않을까??
라는 생각이였습니다.
6. MainActivity Class
그 고민은 성공적이였습니다.
간단하게 List에 데이터를 전부 담고 리사이클러뷰가 가지고 있는 ArrayList의 값을 갱신해 주게 만드는 부분입니다.
몰론, 좋은 방법인가에 대한 의문은 들었습니다.
onStart를 사용하게 되면 매번 데이터를 갱신해줘야하는거기 때문에 입력화면을 거치지 않아도 계속해서 갱신하게되기 때문에 지금처럼 데이터 양이 적으면 상관없지만, 정말로 데이터의 양이 많아 진다면 속도면에서 느려져서 성능에 저하가 올 거 같기 때문입니다.
7. 실행화면
실행화면입니다.
기조에는 첫번째 메모에는 1 1111 / 두번째 메모에는 2 22222 / 세번째 메모에는 3 33333
이런식으로 입력 받았고 수정까지 완료된 모습입니다.
후기..
빨리 더 능숙하게 다뤄서 디자인패턴을 적용하고 싶은 마음이 ….
항상 느끼지만 하나를 해결하고 나면 더 좋은 방법이 있고, 그 좋은 방법을 쓰기 위해서는
끊임없이 노력하는거 밖에 없는거 같다…
Room 추가, 삭제, 수정 기능 부분만 보실 분은
https://github.com/leewoongi/MemoPad/commit/6c9e30c44bdff2ea9a700e91510de502239bd6f3
전체 프로젝트르 보실 분은
https://github.com/leewoongi/MemoPad
참고하세요~
검색할 수 있는 메모장 만들기
메인화면
메모아이콘,검색버튼,옵션메뉴,수정버튼,삭제버튼,입력버튼
옵션메뉴를 누르면
실시간 검색할수 있다.
삭제할 수있다.
수정할수있다.
입력가능
InsertActivity.java
package com.example.ex09; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class InsertActivity extends AppCompatActivity { MemoDB helper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_insert); getSupportActionBar().setTitle(“메모 입력”); //뒤로가기 getSupportActionBar().setDisplayHomeAsUpEnabled(true); helper=new MemoDB(this); db=helper.getWritableDatabase(); //저장 버튼에 이벤트 달기 FloatingActionButton btnsave=findViewById(R.id.btnsave); btnsave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText edtcontent=findViewById(R.id.edtcontent); String strcontent=edtcontent.getText().toString(); //현재날짜 저장 Date now=new Date(); SimpleDateFormat sdf=new SimpleDateFormat(“yyyy/MM/dd hh:mm ss”); //이상한 시간 조정 sdf.setTimeZone(TimeZone.getTimeZone(“Asia/Seoul”)); String strnow=sdf.format(now); String sql=”insert into memo(content,wdate) values(“; sql += “‘” + strcontent + “‘,”; sql += “‘” + strnow + “‘)”; db.execSQL(sql); Toast.makeText(InsertActivity.this, “저장되었습니다.”, Toast.LENGTH_SHORT).show(); finish(); } }); } //뒤로가기 옵션 버튼에 이벤트주기 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case android.R.id.home: finish(); break; } return super.onOptionsItemSelected(item); } }
activity_insert.xml
MainActivity.java
package com.example.ex09; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.SearchView; import android.widget.TextView; import com.google.android.material.floatingactionbutton.FloatingActionButton; public class MainActivity extends AppCompatActivity { MemoDB helper; SQLiteDatabase db; MyAdapter adapter; Cursor cursor; ListView list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //헤더문구변경 getSupportActionBar().setTitle(“모든 메모”); getSupportActionBar().setIcon(R.drawable.ic_memo); //메모장 어플 getSupportActionBar().setDisplayShowHomeEnabled(true); helper=new MemoDB(this); db=helper.getReadableDatabase(); cursor=db.rawQuery(“select * from memo order by wdate desc”,null); list=findViewById(R.id.list); adapter=new MyAdapter(this,cursor); list.setAdapter(adapter); //리스터를 걸겠다. FloatingActionButton btnwrite=findViewById(R.id.btnwrite); btnwrite.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //activity이동 Intent intent=new Intent(MainActivity.this,InsertActivity.class); startActivity(intent); } }); } class MyAdapter extends CursorAdapter{ public MyAdapter(Context context, Cursor c) { super(context, c); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { //아이템 만들기 return getLayoutInflater().inflate(R.layout.item,parent,false); } @Override public void bindView(View view, Context context, final Cursor cursor) { TextView txtcontent=view.findViewById(R.id.txtcontent); txtcontent.setText(cursor.getString(1)); TextView txtwdate=view.findViewById(R.id.txtwdate); txtwdate.setText(cursor.getString(2)); //ListView에 item을 생성했을때 ImageView btndel=view.findViewById(R.id.btndel); //아이디값 가져오기 final int _id=cursor.getInt(0); //삭제버튼 이벤트 설정 btndel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //CONFRIM AlertDialog.Builder box=new AlertDialog.Builder(MainActivity.this); box.setMessage(_id+”을(를) 삭제하시겠습니까?”); box.setPositiveButton(“확인”, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String sql=”delete from memo where _id=”+_id; db.execSQL(sql); //새로고침 onRestart(); } }); box.setNegativeButton(“닫기”,null); box.show(); } }); ImageView btnupdate=view.findViewById(R.id.btnupdate); btnupdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,UpdateActivity.class); intent.putExtra(“_id”, _id); startActivity(intent); } }); } } //옵션메뉴 생성 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); //검색버튼 MenuItem search=menu.findItem(R.id.search); SearchView view=(SearchView)search.getActionView(); //query text가 변했을 때 발생 //ActionView에 리스너를 걸어준다. view.setOnQueryTextListener(new SearchView.OnQueryTextListener() { //엔터를 칠때 검색 @Override public boolean onQueryTextSubmit(String query) { return true; } @Override public boolean onQueryTextChange(String newText) { String sql=”select * from memo where content like ‘%” + newText + “%'”; cursor=db.rawQuery(sql,null); adapter.changeCursor(cursor); return false; } }); return super.onCreateOptionsMenu(menu); } //옵션메뉴를 눌렀을때 발생하는 이벤트 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case R.id.itemcontent: cursor=db.rawQuery(“select * from memo order by content”,null); break; case R.id.itemwdate: cursor=db.rawQuery(“select * from memo order by wdate desc”,null); break; } //커서내용이 변경되었으므로 바뀐 커서값을 어덥터에서 바꿔줌 adapter.changeCursor(cursor); return super.onOptionsItemSelected(item); } @Override protected void onRestart() { cursor=db.rawQuery(“select * from memo order by wdate desc”,null); adapter.changeCursor(cursor); super.onRestart(); } }
activity_main.xml
MemoDB.java
package com.example.ex09; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; //SQLiteOpenHelper 상속 public class MemoDB extends SQLiteOpenHelper { public MemoDB(@Nullable Context context) { super(context, “memo.db”, null, 1); } //테이블 생성 @Override public void onCreate(SQLiteDatabase db) { db.execSQL(“create table memo(_id integer primary key autoincrement,content text,wdate text)”); db.execSQL(“insert into memo(content,wdate) values(‘수영장 청소’,’2019/11/09 06:10:30′)”); db.execSQL(“insert into memo(content,wdate) values(‘컴퓨터 조립’,’2019/11/19 06:10:30′)”); db.execSQL(“insert into memo(content,wdate) values(‘운동화’,’2019/11/04 06:10:30′)”); db.execSQL(“insert into memo(content,wdate) values(‘스트레칭’,’2019/11/01 06:10:30′)”); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
UpdateActivity.java
package com.example.ex09; import androidx.annotation.NonNull; 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 UpdateActivity extends AppCompatActivity { int _id; MemoDB helper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_update); getSupportActionBar().setTitle(“메모 읽기”); //뒤로가기 getSupportActionBar().setDisplayHomeAsUpEnabled(true); Intent intent=getIntent(); _id=intent.getIntExtra(“_id”,0); helper=new MemoDB(this); db=helper.getWritableDatabase(); Cursor cursor=db.rawQuery(“select * from memo where _id=”+_id, null); if(cursor.moveToNext()){ TextView txtwdate=findViewById(R.id.txtwdate); txtwdate.setText(“작성일:”+cursor.getString(2)); TextView edtcontent=findViewById(R.id.edtcontent); edtcontent.setText(“작성내용:”+cursor.getString(1)); } FloatingActionButton btnsave=findViewById(R.id.btnsave); btnsave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder box=new AlertDialog.Builder(UpdateActivity.this); box.setMessage(“수정하시겠습니까?”); box.setPositiveButton(“확인”, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { EditText edtcontent=findViewById(R.id.edtcontent); String strcontent=edtcontent.getText().toString(); String sql=”update memo set content='” + strcontent + “‘ “; sql += ” where _id=” +_id; db.execSQL(sql); finish(); } }); box.setNegativeButton(“닫기”,null); box.show(); } }); //Toast.makeText(UpdateActivity.this,”_id=”+_id,Toast.LENGTH_SHORT).show(); } //뒤로가기 옵션 버튼에 이벤트주기 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case android.R.id.home: finish(); break; } return super.onOptionsItemSelected(item); } }
activity_update.xml
item.xml
menu.xml
So you have finished reading the 안드로이드 메모장 소스 topic article, if you find this article useful, please share it. Thank you very much. See more: 안드로이드 스튜디오 메모장 리스트, 안드로이드 스튜디오 메모장 앱 만들기, 메모장 어플 만들기, 자바 메모장 만들기, 안드로이드 txt 파일 수정