通知をタップして、ナビゲーション グラフで特定の目的地を開こうとしています。次のように保留中のインテントを作成しました-
//this code in service to create notification
OccasionViewerArgs.Builder builderArg = new OccasionViewerArgs.Builder();
builderArg.setPrimaryKey(2);
builderArg.setOccasionClickType("Birthday");
PendingIntent pendingIntent = new NavDeepLinkBuilder(this)
.setGraph(R.navigation.dashboard_navigation)
.setDestination(R.id.occasionViewer)
.setArguments(builderArg.build().toBundle())
.createPendingIntent();
問題:
通知をタップすると、同じフラグメントである「occasionViewer」フラグメントにナビゲートすることを期待していましたが、R.id.occasionViewer
「dashboardFragment」であるナビグラフの宛先フラグメントを開始するようにナビゲートしています。
次のように、同じグラフで目的地を他の目的地のいずれかに変更しようとしましたR.id.addBirthdayFragment
-
PendingIntent pendingIntent = new NavDeepLinkBuilder(this)
.setGraph(R.navigation.dashboard_navigation)
.setDestination(R.id.addBirthdayFragment)
//.setArguments(builderArg.build().toBundle())
.createPendingIntent();
そして、期待どおりに機能しています。つまり、通知をタップすると、addBirthdayFragment に移動します。
これを調べて、私がここで間違ったことを教えてください。提案や助けがあれば、私の一日が楽しくなります。
これがnav_graph(R.navigation.dashboard_navigation)です
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@id/dashboard_navigation"
app:startDestination="@id/dashboardFragment">
<fragment
android:id="@+id/dashboardFragment"
android:name="buzz.anusmarak.ui.dashboard.DashboardFragment"
android:label=""
tools:layout="@layout/fragment_dashboard" >
<action
android:id="@+id/action_dashboardFragment_to_addBirthdayFragment"
app:destination="@id/addBirthdayFragment" />
<action
android:id="@+id/action_dashboardFragment_to_occasionViewer"
app:destination="@id/occasionViewer"/>
</fragment>
<fragment
android:id="@+id/addBirthdayFragment"
android:name="buzz.anusmarak.ui.birthday.AddBirthdayFragment"
android:label="Add Birthday"
tools:layout="@layout/fragment_add_birthday" >
<action
android:id="@+id/action_addBirthdayFragment_to_dashboardFragment"
app:destination="@id/dashboardFragment"
app:popUpTo="@+id/dashboardFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_addBirthdayFragment_to_occasionViewer"
app:destination="@id/occasionViewer"
app:popUpTo="@+id/dashboardFragment"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/occasionViewer"
android:name="buzz.anusmarak.ui.dashboard.occasion_viewer.OccasionViewer"
android:label=""
tools:layout="@layout/fragment_occasion_viewer" >
<argument
android:name="primaryKey"
app:argType="integer"
android:defaultValue="-1" />
<argument
android:name="occasionClickType"
app:argType="string"
android:defaultValue="default" />
<action
android:id="@+id/action_occasionViewer_to_dashboardFragment"
app:destination="@id/dashboardFragment" />
</fragment>
</navigation>
事前にご尽力いただき、ありがとうございました。
編集 1
オブザーバー 以下の通り
private LiveData<Occasion> occasionLiveData;
occasionLiveData = AppRoomDatabase.getDatabase(requireContext().getApplicationContext())
.occasionDao().findOccasionByKey(primaryKey);
occasionLiveData.observe(getViewLifecycleOwner(), new Observer<Occasion>() {
@Override
public void onChanged(Occasion occasion) {
if (occasion != null) {
setupValues(occasion);
}
}
});
Method setupValues(occasion)
、ここでは機会を使用してさまざまな値を更新しています。
onActivityCreated() でオブザーバーを使用しています。
編集 2
オケージョンビューア
public class OccasionViewer extends Fragment implements DatePickerFragment.DatePickerDialogListener
, MenuItem.OnMenuItemClickListener {
private static final String TAG = "OccasionViewer";
private int primaryKey;
private String occasionClickType;
private ImageView isImportantImg, makeCall;
private CircularImageView personImg;
private LiveData<Occasion> occasionLiveData;
.....
public OccasionViewer() {
// Required empty public constructor
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
primaryKey = OccasionViewerArgs.fromBundle(getArguments()).getPrimaryKey();
occasionClickType = OccasionViewerArgs.fromBundle(getArguments()).getOccasionClickType();
Transition sharedElementEnterTransition = TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move);
setSharedElementEnterTransition(sharedElementEnterTransition);
postponeEnterTransition();
}
}
@Override
public void onDestroy() {
occasionLiveData.removeObservers(this);
super.onDestroy();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_occasion_viewer, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
occasionLiveData = AppRoomDatabase.getDatabase(requireContext().getApplicationContext())
.occasionDao().findOccasionByKey(primaryKey);
occasionLiveData.observe(getViewLifecycleOwner(), new Observer<Occasion>() {
@Override
public void onChanged(Occasion occasion) {
if (occasion != null) {
setupValues(occasion);
}
}
});
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
CollapsingToolbarLayout collapsingToolbarLayout = view.findViewById(R.id.collapsing_toolbar);
NavController navController = Navigation.findNavController(view);
Toolbar toolbar = view.findViewById(R.id.toolbar);
personImg = view.findViewById(R.id.person_img);
isImportantImg = view.findViewById(R.id.is_important_img);
toolbar.setTransitionName(occasionClickType+primaryKey+"cardView");
personImg.setTransitionName(occasionClickType+primaryKey+"imageView");
isImportantImg.setTransitionName(occasionClickType+primaryKey+"importantView");
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupWithNavController(collapsingToolbarLayout, toolbar, navController, appBarConfiguration);
.................
}
private void setupValues(Occasion occasion) {
//using occasion to setup values
}
// further method for setup different fields
}
編集3(いくつかの観察)
私のDashboardFragmentにはリサイクルビューがあり、アイテムをクリックするとOccessViewerに移動しますが、通知をタップするとDashboardFragmentに移動し、リサイクルビューアイテムをクリックすると、次のエラーが表示されます:
--------- beginning of crash
07-30 10:56:57.695 16143-16143/buzz.anusmarak E/AndroidRuntime: FATAL EXCEPTION: main
Process: buzz.anusmarak, PID: 16143
java.lang.IllegalArgumentException: Navigation action/destination buzz.anusmarak:id/action_dashboardFragment_to_occasionViewer cannot be found from the current destination Destination(buzz.anusmarak:id/occasionViewer) label= class=buzz.anusmarak.ui.dashboard.occasion_viewer.OccasionViewer
at androidx.navigation.NavController.navigate(NavController.java:931)
at androidx.navigation.NavController.navigate(NavController.java:1128)
at buzz.anusmarak.ui.dashboard.DashboardFragment.onUpcomingOccasionClick(DashboardFragment.java:387)
PSR の追加
ここで問題の PSR を見つけてください。
https://drive.google.com/file/d/1-3yuQU-4YPprZHk5cUGoq20Ck82y3omT/view?usp=sharing
編集 4 (AdrianK が解決)
startPostponedEnterTransition();
私は次のように呼んでいました
private void setupValues(Occasion occasion) {
matchingOccasion = occasion;
collapsingToolbarLayout.setTitle(matchingOccasion.getPersonName());
String personImageID = matchingOccasion.getPersonImage();
if (!personImageID.isEmpty()) {
File filepath = requireContext().getExternalFilesDir(null);
File file = new File(filepath + "/" + personImageID + ".jpeg");
Picasso.with(requireContext()).load(file)
.into(personImg, new Callback() {
@Override
public void onSuccess() {
// startPostponedEnterTransition();
}
.......
問題は次の変更によって修正されます -
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
......
startPostponedEnterTransition();
......
繰り返しになりますが、時間を割いてコードを調べてくれたAdrianKに感謝します。乾杯.. !!