Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Android個人開発LT]個人開発始めてみた

bull
April 12, 2022

 [Android個人開発LT]個人開発始めてみた

Android個人開発LTで発表した資料です。
https://connpass.com/event/241867/

https://twitter.com/assa_012
#android_kojinkaihatsu_LT

bull

April 12, 2022
Tweet

Other Decks in Technology

Transcript

  1. Javaで作った時のアプリについて • MVCアーキテクチャの崩壊版 • LocalDateTime使わずCalendar型とDate型 • ActivityResultConstantではなくonActivityResult使っている • Dateの保存はLong型ではなく、String型である •

    pngが使われている 今の時代はwebpかsvg • ConstraintLayout使っていない • findViewById • 自作のデータクラス • データベースは使わずGsonでJson化して保存
  2. kotlin移行するにあたって考えたこと • ios版も出したいと思っていたからKMMの導入あり • KMM使うならLiveDataよりStateFlow使うべきか • Javaを封じ込めたいのでマルチモジュール化してlegacyモジュールに格納すべきか • JetpackComposeの導入するかどうか 使うならsingle Activityにするかどうか

    • 画面遷移はnav graph使うかどうか • Gson保存をデータベース保存(Room)に書き換えるかどうか • アーキテクチャはMVVM+Repository+UseCaseかMVVM+Repoか • pngはwebpに書き換える • build.gradleはktxに変更 • DIはKoinではなくHiltでいいよな...? • Firebase RealtimeDatabaseからFireStoreに入れ替えた方がいい? • github actions使おうか • ktlint入れようか • ListViewをRecyclerViewに変えたい • テストいるか...? • ログいるか..? • バックアップどうしよう
  3. //1つのセルの中身を決める @Override public View getView(int position, View convertView, ViewGroup parent)

    { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); //TODO View view = inflater.inflate(R.layout.grid_item_calendar, parent, false); view.setLayoutParams(new AbsListView.LayoutParams(itemWidth, itemHeight)); holder.baseArea = view; holder.tapArea = view.findViewById(R.id.tap_area); holder.text = (TextView) view.findViewById(R.id.text); holder.backgroundToday = (ImageView) view.findViewById(R.id.calendar_background _today); holder.selectedDay = (ImageView) view.findViewById(R.id.selected_day); holder.imageTime = (ImageView) view.findViewById(R.id.image_time); view.setTag(holder); convertView = view; } } else { holder = (ViewHolder) convertView.getTag(); } // 初期化 holder.imageTime.setVisibility(View.INVISIBL E); holder.selectedDay.setVisibility(View.INVISIB LE); holder.tapArea.setOnClickListener(null); holder.tapArea.setClickable(false); holder.text.setBackgroundDrawable(null); //position:日が0,土が6 updateTextColor(position, holder.text); //HACK:最初の7つだけはどのpageでも日~ 月を表示 if (position < COLUMN_COUNT) { String weeks[] = {"日", "月", "火", "水", "木", "金", "土"}; holder.text.setText(weeks[position]); holder.text.setTypeface(Typeface.DEFAULT); return convertView; } //このconversionViewInfoのindex番号=セ ルの日付 CalendarGridItemEntity entity = calendarManager.conversionViewInfo(positio n - COLUMN_COUNT); List<MedicineRecordEntity> medicines = MedicineTabManager.getInstance(context).fi ndRecordEntitiesByDate(entity.date); holder.baseArea.setVisibility(View.VISIBLE); if (entity.isToday) { holder.backgroundToday.setVisibility(View.VI SIBLE); holder.backgroundToday.setBackgroundRes ource(R.drawable.shape_bg_calendar_today ); }else{ holder.backgroundToday.setVisibility(View.IN VISIBLE); } ClickInfo info = new ClickInfo(); info.date = entity.date; holder.tapArea.setClickable(true); holder.tapArea.setTag(info); holder.tapArea.setOnClickListener(innerClick Listener); holder.text.setText(entity.dateStr); Date today = new Date(); if (medicines.size() > 0 &&
  4. @Override public void onPageSelected (int position) { //枚数が変更になったら情報更新 selectedIndex =

    position; if (calendarListener != null) { calendarListener .onPageSelected(positi on); } adapter.clearSelectIfSet() ; setSelectDateForGridView() ; //今のindex番号を取得 int i = adapter.getDiffMonth(position) ; //HACK:カレンダーボタンを押したとき用の 処理 今日の日付を表示する  indexが隣ではな いから(indexが8→0もあり得るから押すと初期化 する) if(i == 0 && isCalendarMenu ){ Calendar calendar1 = Calendar.getInstance(); calendar1.setTime( new Date()); selectedDate = calendar1.getTime() ; beforeIndex = 0; //HACK:isCalendarMenu はカレンダーボタ ンを押されたらtrue,遷移したらfalseに戻すこ とでカレンダーボタン用処理を実現 isCalendarMenu = false; } //右に1スクロール カレンダー +7日 if(i == beforeIndex + 1){ Calendar calendar1 = Calendar.getInstance(); calendar1.setTime( selectedDate); calendar1.add(Calendar. DAY_OF_MONTH,7 ); selectedDate = calendar1.getTime() ; beforeIndex++; } //左に1スクロール カレンダー -7日 if(i == beforeIndex - 1){ Calendar calendar2 = Calendar.getInstance(); calendar2.setTime( selectedDate); calendar2.add(Calendar. DAY_OF_MONTH,- 7); selectedDate = calendar2.getTime() ; beforeIndex--; } CalenderGridAdapter listAdapter = adapter.getCurrentGridAdapter( viewPage r); //現在位置を表示 if(listAdapter != null){ //selectedDate は選択している日付 listAdapter.setSelectDate( selectedDate ); listAdapter.notifyDataSetChanged() ; } //データをつなげる部分 if (calendarListener != null) { calendarListener .onCalendarItemClick( s electedDate); } }
  5. Java public class ToDo { private final Strnig _mTitle; private

    final String _mText; public ToDo(@NonNull final String aTitle, @Nullable final String aText) { _mTitle = aTitle; _mText = aText; } public String getTitle() { return _mTitle; } public String getText() { return _mText; } }
  6. 改めてktxすごい • view.isVisible = hoge > 0 • val bundle

    = bundleOf( "hoge" to "fuga", "isHoge" to true)
  7. Webpやっぱりすごい 1. 変更したいpngを右クリックする 2. convert png to webpをクリック 3. 75%圧縮でOKなのでconvert

    場合によっては容量が半分以下になる しかもほぼ画質変わらない デメリットないかと