teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

バグがあったため修正を追加

2019/12/21 08:43

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -100,4 +100,52 @@
100
100
  });
101
101
 
102
102
  //(後略)
103
+ ```
104
+
105
+ #追記2
106
+ 上のコードでは onAttach 実行時は adapter がまだ new されていないため, NullPointerExeption が発生します.
107
+ onCreateView の adapter 生成部分を onAttack に移すことで解決します.
108
+ 以下のコードでは adapter 生成部分をメソッド化しています.
109
+
110
+ MemoListFragment.java
111
+ ```java
112
+ @Override
113
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
114
+ View view = inflater.inflate(R.layout.fragment_memo_list, container, false);
115
+ fab = view.findViewById(R.id.intentEditMemo);
116
+ //以下を削除
117
+ //realm = Realm.getDefaultInstance(); // Realmをインスタンス化
118
+ //final RealmResults<Memo> result = realm.where(Memo.class).findAll() // テーブルから全レコード取得
119
+ // .sort("id", Sort.DESCENDING);// 降順にソート
120
+ //adapter = new MemoAdapter(result); // その結果をアダプターに渡す
121
+
122
+ recyclerView = view.findViewById(R.id.memoList);
123
+ recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
124
+ recyclerView.setAdapter(adapter);
125
+ recyclerView.setHasFixedSize(true);
126
+ recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
127
+
128
+ return view;
129
+ }
130
+
131
+ //追加
132
+ //MemoAdapter を生成する.
133
+ private MemoAdapter createMemoAdapter(MemoListActivity memoListActivity) {
134
+ realm = Realm.getDefaultInstance(); // Realmをインスタンス化
135
+ final RealmResults<Memo> result = realm.where(Memo.class).findAll() // テーブルから全レコード取得
136
+ .sort("id", Sort.DESCENDING);// 降順にソート
137
+ adapter = new MemoAdapter(result); // その結果をアダプターに渡す
138
+ adapter.setActivity(memoListActivity);
139
+ }
140
+
141
+ //アクティビティに載せられると呼ばれる
142
+ @Override
143
+ public void onAttach(Context context) {
144
+ super.onAttach(context);
145
+ if (context instanceof MemoListActivity) {
146
+ memoListActivity = (MemoListActivity) context;
147
+ //adapter.setActivity(memoListActivity); //削除
148
+ adapter = createMemoAdapter(memoListActivity); //追加
149
+ }
150
+ }
103
151
  ```

2

文言追加

2019/12/21 08:43

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ---
6
6
  #追記
7
7
 
8
- EditMemoFragment への遷移をアクティビティ(に新設したメソッド)に集約して, MemoListFragment での新規ボタン押下時および MemoAdapter による既存選択時(?)にそのメソッドを呼ぶように修正するコードです.
8
+ EditMemoFragment への遷移をアクティビティ(に新設したメソッド)に集約して, MemoListFragment での新規ボタン押下時および MemoAdapter (を設定した RecyclerView) による既存選択時(?)にそのメソッドを呼ぶように修正するコードです.
9
9
 
10
10
  **※テストは出来ていません**
11
11
 

1

回答追加

2019/12/19 15:18

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -1,3 +1,103 @@
1
1
  ドキュメントをご確認ください.
2
2
 
3
- Fragment.getFragmentManager() は, そのフラグメントが Activity に接続した状態でなければ null を返します.
3
+ Fragment.getFragmentManager() は, そのフラグメントが Activity に接続した状態でなければ null を返します.
4
+
5
+ ---
6
+ #追記
7
+
8
+ EditMemoFragment への遷移をアクティビティ(に新設したメソッド)に集約して, MemoListFragment での新規ボタン押下時および MemoAdapter による既存選択時(?)にそのメソッドを呼ぶように修正するコードです.
9
+
10
+ **※テストは出来ていません**
11
+
12
+ MemoListActivity.java
13
+ ```java
14
+ //(前略)
15
+
16
+ //追加
17
+ //EditMemoFragment に遷移する
18
+ void replaceToEditMemoFragment(String id) {
19
+ Bundle bundle = new Bundle();
20
+ bundle.putString("id", id);
21
+ EditMemoFragment fragment = new EditMemoFragment();
22
+ fragment.setArguments(bundle);
23
+ getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
24
+ }
25
+
26
+ //(後略)
27
+ ```
28
+
29
+ MemoListFragment.java
30
+ ```java
31
+ //(前略)
32
+
33
+ //追加
34
+ //アクティビティに載せられると呼ばれる
35
+ @Override
36
+ public void onAttach(Context context) {
37
+ super.onAttach(context);
38
+ if (context instanceof MemoListActivity) {
39
+ memoListActivity = (MemoListActivity) context;
40
+ adapter.setActivity(memoListActivity);
41
+ }
42
+ }
43
+
44
+ //追加
45
+ //アクティビティから外されると呼ばれる
46
+ @Override
47
+ public void onDetach() {
48
+ super.onDetach();
49
+ memoListActivity = null;
50
+ adapter.setActivity(null);
51
+ }
52
+
53
+ //(中略)
54
+
55
+ //新規作成ボタン
56
+ fab.setOnClickListener(new View.OnClickListener() {
57
+ @Override
58
+ public void onClick(View view) {
59
+ memoListActivity.replaceToEditMemoFragment("");
60
+ //以下削除
61
+ //Bundle bundle = new Bundle();
62
+ //bundle.putString("id", "");
63
+ //EditMemoFragment fragment = new EditMemoFragment();
64
+ //fragment.setArguments(bundle);
65
+ //FragmentTransaction transaction = getFragmentManager().beginTransaction();
66
+ //transaction.replace(R.id.container, fragment.newInstance(),"EditMemoFragment").commit();
67
+ }
68
+ });
69
+
70
+ //(後略)
71
+ ```
72
+
73
+ MemoAdapter.java
74
+ ```java
75
+ public class MemoAdapter extends RealmRecyclerViewAdapter<Memo, MemoAdapter.MemoViewHolder> {
76
+ private MemoListActivity memoListActivity; //追加
77
+ private OrderedRealmCollection<Memo> mDataset;
78
+
79
+ //追加
80
+ //フラグメント遷移処理メソッドを持つアクティビティを設定
81
+ void setActivity(MemoListActivity memoListActivity) {
82
+ this.memoListActivity = memoListActivity;
83
+ }
84
+
85
+ //(中略)
86
+
87
+ // アイテムクリックされたら編集画面へ
88
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
89
+ @Override
90
+ public void onClick(View v) {
91
+ final String id = obj.getId();
92
+ memoListActivity.replaceToEditMemoFragment(id); //追加
93
+ //以下削除
94
+ //Bundle bundle = new Bundle();
95
+ //bundle.putString("id", id);
96
+ //EditMemoFragment fragment = new EditMemoFragment();
97
+ //fragment.setArguments(bundle);
98
+ //fragment.getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
99
+ }
100
+ });
101
+
102
+ //(後略)
103
+ ```