0

通知をタップして、ナビゲーション グラフで特定の目的地を開こうとしています。次のように保留中のインテントを作成しました-

//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に感謝します。乾杯.. !!

4

1 に答える 1