JavaでAndroidの家計簿アプリを開発しています。
今回やりたいことは、
ActivityのListViewで選択したアイテムをタップした際に当該アイテムのデータを引数として渡し、
遷移先のFragment画面へ移動した際に、上記データをEditTextへ反映し、update, deleteを行う仕様にしたいです。
以前、別画面で画面遷移を実装した際は、Fragment→Fragment間の移動(それぞれ乗っかっているActivityが違った為)でnewInstanceを使うことで実装が出来ました。
SearchFragment.java
searchListView.setOnItemClickListener((adapterView, view1, position, id) -> { BudgetTrackerSpending spending = searchedSpendingList.get(position); MainActivity mainActivity = ((MainActivity)getActivity()); if(mainActivity != null) { Fragment fragment = AddSpendingFragment.newInstance(spending); mainActivity.getSupportFragmentManager() .beginTransaction() .replace(R.id.main_container, fragment) .addToBackStack(null) .commit(); } });
但し、今回はActivity→Fragment間の移動になり、
下記の様に実装した所、エラーが発生してしまいました。
SpendingTrackerActivity.java
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { BudgetTrackerSpending spending = budgetSpendingListItems.get(position); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); Fragment fragment = AddSpendingFragment.newInstance(spending); fragmentTransaction.replace(R.id.main_container, fragment).commit(); } });
追記 11/30/2022
修正依頼のご指摘の中で、
Fragmentに入れ替える必要があるとの事でしたので、
下記2行に入れ替えてみたのですが、
IllegalArgumentExceptionが表示され、
エラー発生個所の表示がコンソール上にされなかったため、
原因の特定に苦労しております。
Fragment fragment = AddSpendingFragment.newInstance(spending);
fragmentTransaction.replace(R.id.main_container, fragment).commit();
追記 12/01/2022
今回の大まかな流れは下記となります。
SpendingTrackerActivity.java(LiveData/購入履歴閲覧画面)
↓
ListView内のアイテムをクリック
↓
AddSpendingFragment.javaへ移動(ここで、データ編集または削除を実施)
↓
編集/削除後にSpendingTrackerActivity.javaに戻る。
AddSpendingFragment.javaはフラグメント画面となり、AddBudgetTracker.java(Activity/コンテナ)上で運用しております。
流れとしましては、AddBudgetTracker.java上で上記AddSpendingFragment.javaを含めて下記3つのFragmentを運用しています。
1:AddSpendingFragment.java - 購入履歴入力画面
2:AddIncomeFragment.java - 収入履歴入力画面
3:AddBankFragment.java - 銀行残高入力画面
その為、SpendingTrackerActivity.javaのListView内のアイテムをクリックした段階で、
AddBudgetTracker.javaコンテナの中からAddSpendingFragment.javaに移動する形にしたいです。
追記 12/01/2022 2回目
今回のご指摘の中で、アクティビティ1が不要になることについてご説明頂きましてありがとうございました。
アクティビティ1(下記SpendingTrackerActivity.java/Expenses画面)につきましては、独立したアクティビティとして運用しておりました。
下記画面青枠内のAddBudgetTracker.java(データ追加/編集/削除コンテナ)上では、
今回データ編集用の画面として使うAddSpendingFragment.javaを運用しており、
AddBudgetTracker.javaはデータ追加用の画面をまとめたコンテナとなりますので、
SpendingTrackerActivityを当該コンテナ上でフラグメントとして運用するのが現実的に難しかと思っております。
追記 12/07/2022
何度もすみません。
SpendingTrackerActivity.java
↓
AddBudgetTracker
↓
AddSpendingFragment
の流れで、以前頂いたサンプルコードを元に実装を試してみたのですが、
AddSpendingFragmentの部分でNullPointerExceptionが発生してしまいました。
SpendingTrackerActivityのlistViewをクリック→AddBudgetTrackerを呼び出し listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Intent intent = new Intent(SpendingTrackerActivity.this, AddBudgetTracker.class); intent.putExtra(AddBudgetTracker.EXTRA_DATA, (BudgetTrackerSpending)listView.getItemAtPosition(position)); startActivity(intent); }
↓
AddBudgetTracker.javaからAddSpendingFragmentへreplace FragmentManager fm = getSupportFragmentManager(); fm.setFragmentResultListener(REQUEST_EDIT, this, (requestKey, result) -> { finish(); }); if(savedInstanceState == null) { BudgetTrackerSpending budgetTrackerSpending = (BudgetTrackerSpending)getIntent().getSerializableExtra(EXTRA_DATA); fm.beginTransaction().replace(R.id.activity_add_container, AddSpendingFragment.newInstance(REQUEST_EDIT, budgetTrackerSpending)).commit(); }
↓
public static AddSpendingFragment newInstance(String requestKey, BudgetTrackerSpending spending) { AddSpendingFragment fragment = new AddSpendingFragment(); Bundle args = new Bundle(); args.putString(ARG_REQUESTKEY, requestKey); args.putSerializable(ARG_DATA, spending); fragment.setArguments(args); return fragment; } <省略> public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_add_spending, container, false); <省略> String requestKey = getArguments().getString(ARG_REQUESTKEY); ←ここでNullpointerエラー発生 <省略> }
エラー内容
FATAL EXCEPTION: main Process: com.myproject.offlinebudgettrackerappproject, PID: 22194 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference at com.myproject.offlinebudgettrackerappproject.AddSpendingFragment.onCreateView(AddSpendingFragment.java:129)
下記、GitHub上のそれぞれのページになります。
SpendingTrackerActivity.java
https://github.com/yakusugi/OfflineBudgetTrackerAppProject/blob/master/app/src/main/java/com/myproject/offlinebudgettrackerappproject/SpendingTrackerActivity.java
AddBudgetTracker.java
https://github.com/yakusugi/OfflineBudgetTrackerAppProject/blob/master/app/src/main/java/com/myproject/offlinebudgettrackerappproject/AddBudgetTracker.java
AddSpendingFragment.java
https://github.com/yakusugi/OfflineBudgetTrackerAppProject/blob/master/app/src/main/java/com/myproject/offlinebudgettrackerappproject/AddSpendingFragment.java
全体
https://github.com/yakusugi/OfflineBudgetTrackerAppProject/tree/master

回答1件
あなたの回答
tips
プレビュー