前提・実現したいこと
androidでシフト管理アプリを開発しています。
シフトを登録したボタンをクリック→シフトを記入したい日付セルをクリック、でカレンダー上にシフトがのるようになっています。
最後に日付をキーにしてプレファレンスでシフトを記録、参照してOnResumeでシフトが記入されたカレンダーを復元したいのです。
このとき、calenderGridViewにinflateしているcalender_cellのテキスト(tx_shift)を変更したいのですが、viewが指定できず、nullPointExceptionが帰ってきてしまいます。
どのようにすれば、目的のviewを取得できるでしょうか。
また、その他にカレンダーを復元する方法はあるでしょうか。
発生している問題・エラーメッセージ
FATAL EXCEPTION: main Process: com.example.shiftcalender, PID: 25808 java.lang.RuntimeException: Unable to resume activity {com.example.shiftcalender/com.example.shiftcalender.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3158) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3189) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2527) at android.app.ActivityThread.access$900(ActivityThread.java:154) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1389) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread.java:5514) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at com.example.shiftcalender.MainActivity.onResume(MainActivity.java:159) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1259) at android.app.Activity.performResume(Activity.java:6346) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3147) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3189) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2527) at android.app.ActivityThread.access$900(ActivityThread.java:154) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1389) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread.java:5514) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
該当のソースコード
protected void onResume() { super.onResume(); calendarGridView =findViewById(R.id.calendarGridView); mCalendarAdapter = new CalendarAdapter(this); calendarGridView.setAdapter(mCalendarAdapter); View view = mCalendarAdapter.getPositionView(1); date = mCalendarAdapter.getDateText(1); tempShift = CalendarRead(date); if(tempShift != null){ tx_shift = view.findViewById(R.id.tx_shift); //エラーの出る159行目 tx_shift.setText(tempShift); Toast.makeText(this, tempShift,Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "null",Toast.LENGTH_LONG).show(); } } public void CalendarSave(String date, String shiftPT){ SharedPreferences pref = getSharedPreferences("CalendarSave", MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.putString(date, shiftPT); editor.commit(); } public String CalendarRead(String date){ SharedPreferences pref = getSharedPreferences("CalendarSave", MODE_PRIVATE); Toast.makeText(this, pref.getString(date,null),Toast.LENGTH_LONG).show(); return pref.getString(date,null); }
public class CalendarAdapter extends BaseAdapter { private List<Date> dateArray = new ArrayList(); private Context mContext; private DateManager mDateManager; private LayoutInflater mLayoutInflater; private Map<Integer, View> positionView; //カスタムセルを拡張したらここでWidgetを定義 private static class ViewHolder{ public TextView dateText,tx_shift; } public CalendarAdapter(Context context){ mContext = context; mLayoutInflater = LayoutInflater.from(mContext); mDateManager = new DateManager(); dateArray = mDateManager.getDays(); positionView = new HashMap<Integer, View>(36); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null){ convertView = mLayoutInflater.inflate(R.layout.calendar_cell, null); holder = new ViewHolder(); holder.dateText = convertView.findViewById(R.id.dateText); holder.tx_shift = convertView.findViewById(R.id.tx_shift); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } //セルのサイズを指定 float dp = mContext.getResources().getDisplayMetrics().density; AbsListView.LayoutParams params = new AbsListView.LayoutParams(parent.getWidth()/7 - (int)dp, (parent.getHeight()/5 - (int)dp)); convertView.setLayoutParams(params); //日付を月/日で表示 SimpleDateFormat dateFormat = new SimpleDateFormat("M/d", Locale.US); holder.dateText.setText(dateFormat.format(dateArray.get(position))); positionView.put(position, convertView); return convertView; } public View getPositionView(int position){ View targetView = positionView.get(position); return targetView; } public String getDateText(int position){ SimpleDateFormat dateFormat = new SimpleDateFormat("M/d", Locale.US); return dateFormat.format(dateArray.get(position)).toString(); }
試したこと
gridViewからgetChildAtで取れないかと試しましたが、これもnullが帰ってくる。
viewが取れないのであればと、calenderAdapterのgetView内でプレファレンスを調べて、データがあればtx_shiftに代入、と思いましたがgetSharedPrefarencesが使えず…。
手探りで開発しているので的外れな部分が多々あるかと思いますが、何卒よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Android Studio 3.1.2
大元のソースはこちらを参考にさせていただいてます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。