0

so i wanted to creat a footer navigtion on the main activity and a fragment view above it but now when i try to use the normal navigtion with the navigtion grafh it just crashes. mainActivity java code:

package com.example.mywatchlist;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Button homeBtn = findViewById(R.id.homeBtn);
        Button profileBtn = findViewById(R.id.profileBtn);
        Button socialBtn = findViewById(R.id.theSocialSearchBtn);
        Button contentBtn = findViewById(R.id.contentContentSearchBtn);



        homeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                homeFragment home = new homeFragment();
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainerView,home).commit();
            }
        });

        profileBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userProfileFragment profile = new userProfileFragment();
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainerView,profile).commit();
            }
        });

        socialBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                socialSearchFragment social = new socialSearchFragment();
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainerView,social).commit();
            }
        });

        contentBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                contentSearchFragment contentSearch = new contentSearchFragment();
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainerView,contentSearch).commit();
            }
        });


    }

}

main activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="632dp"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation" />

    <LinearLayout
        android:id="@+id/footer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <Button
            android:id="@+id/homeBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Go to\nHome"
            android:textSize="12dp" />

        <Button
            android:id="@+id/profileBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="My\nProfile"
            android:textSize="12dp" />

        <Button
            android:id="@+id/theSocialSearchBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Search for\nPeople"
            android:textSize="12dp" />

        <Button
            android:id="@+id/contentContentSearchBtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Search for\nContent"
            android:textSize="12dp" />
    </LinearLayout>
</LinearLayout>

and now it crashes when i try to move in this fragment: fragment to move from java code:

package com.example.mywatchlist;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link contentSearchFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class contentSearchFragment extends Fragment {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public contentSearchFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment contentSearchFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static contentSearchFragment newInstance(String param1, String param2) {
        contentSearchFragment fragment = new contentSearchFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_content_search,container, false);
        // Inflate the layout for this fragment


        Button searchBtn = view.findViewById(R.id.contentContentSearchBtn);

        searchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Navigation.findNavController(view).navigate(R.id.action_contentSearchFragment_to_contentFragment);

            }
        });


        return view;
    }
}

and this is the xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".contentSearchFragment" >

    <TextView
        android:id="@+id/contentSearchTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#C4FF80"
        android:gravity="center"
        android:text="Content search"
        android:textSize="30dp" />

    <Button
        android:id="@+id/contentSearchAddNewContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add new content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFEB3B"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/contentSearchBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#C8C8C8"
            android:ems="10"
            android:hint="Search for content"
            android:inputType="textPersonName"
            android:minHeight="48dp" />

        <Button
            android:id="@+id/contentContentSearchBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Search" />
    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="502dp">

        <TextView
            android:id="@+id/contentSearchData"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="test\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntesttest\ntest\ntest\ntest\ntest\ntest\XXXXXXXXXXXXXXXXXXntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\nXXXXXXXXXXXXXXXXX test\ntest\nXXXXXXXXXXXXXXXX\ntest\ntest\ntest\ntest\ntest" />
    </ScrollView>

</LinearLayout>

and this is the navigtion xml:

<?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/navigation"
    app:startDestination="@id/startFragment">
    <fragment
        android:id="@+id/startFragment"
        android:name="com.example.mywatchlist.startFragment"
        android:label="fragment_start"
        tools:layout="@layout/fragment_start" >
        <action
            android:id="@+id/action_startFragment_to_logInFragment"
            app:destination="@id/logInFragment" />
        <action
            android:id="@+id/action_startFragment_to_registerFragment"
            app:destination="@id/registerFragment" />
    </fragment>
    <fragment
        android:id="@+id/logInFragment"
        android:name="com.example.mywatchlist.logInFragment"
        android:label="fragment_log_in"
        tools:layout="@layout/fragment_log_in" >
        <action
            android:id="@+id/action_logInFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/registerFragment"
        android:name="com.example.mywatchlist.registerFragment"
        android:label="fragment_register"
        tools:layout="@layout/fragment_register" >
        <action
            android:id="@+id/action_registerFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.mywatchlist.homeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" />
    <fragment
        android:id="@+id/userProfileFragment"
        android:name="com.example.mywatchlist.userProfileFragment"
        android:label="fragment_user_profile"
        tools:layout="@layout/fragment_user_profile" />
    <fragment
        android:id="@+id/contentFragment"
        android:name="com.example.mywatchlist.contentFragment"
        android:label="fragment_content"
        tools:layout="@layout/fragment_content" />
    <fragment
        android:id="@+id/contentSearchFragment"
        android:name="com.example.mywatchlist.contentSearchFragment"
        android:label="fragment_content_search"
        tools:layout="@layout/fragment_content_search" >
        <action
            android:id="@+id/action_contentSearchFragment_to_contentFragment"
            app:destination="@id/contentFragment" />
    </fragment>
    <fragment
        android:id="@+id/socialSearchFragment"
        android:name="com.example.mywatchlist.socialSearchFragment"
        android:label="fragment_social_search"
        tools:layout="@layout/fragment_social_search" >
        <action
            android:id="@+id/action_socialSearchFragment_to_userProfileFragment"
            app:destination="@id/userProfileFragment" />
    </fragment>
</navigation>

crashing:

    --------- beginning of crash
2022-07-01 14:32:49.986 25363-25363/com.example.mywatchlist E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mywatchlist, PID: 25363
    java.lang.IllegalStateException: View com.google.android.material.button.MaterialButton{3bedc11 VFED..C.. ...P.... 921,5-1440,173 #7f080237 app:id/contentContentSearchBtn} does not have a NavController set
        at androidx.navigation.Navigation.findNavController(Navigation.kt:71)
        at com.example.mywatchlist.contentSearchFragment$1.onClick(contentSearchFragment.java:73)
        at android.view.View.performClick(View.java:7448)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2022-07-01 14:32:50.027 25363-25363/com.example.mywatchlist I/Process: Sending signal. PID: 25363 SIG: 9

thank you to all the helpers

2 Answers2

0

can you please share the crashing error? It's hard to figure out the error. If you can also add how to reproduce the crash it can be very helpful

TzlilSwi
  • 94
  • 6
0

You forgot to initialize NavHostFragent

so kindly Initiliaze In your OnCreate

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
            .findFragmentById(R.id. fragmentContainerView);
NavController navController = navHostFragment.getNavController();

and for the navigate one fragment to another fragment use navigate

 homeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {navController.navigate(R.id. action_startFragment_to_registerFragment
            }
        });)
Pratik Fagadiya
  • 1,195
  • 7
  • 21