1

I have a bottom navigation activity ,In bottom navigation activity I have 3 icons Home,Reminders,settings.

For this I have 3 fragments, Home fragment, Reminder fragment and settings fragment. I don't have anything in fragments all are empty fragments except Home fragment. In Home Fragment I have a Tab layout but I didn't added anything with tab layout.

After running the project the Home fragment is not get displayed (default when app get launched). It shows only the bottom navigation view.

If I clicked on reminders Icon app get crashed with the following error.

Error:

java.lang.IllegalArgumentException: No view found for id 0x7f080076 (com.aviz.www.reminder:id/reminders_Fragment) for fragment Reminders{2eca87b #0 id=0x7f080076}
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1413)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

MainActivity.xml

 <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 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/Conslayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

 <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

        <android.support.design.widget.BottomNavigationView
            android:id="@+id/navigation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="0dp"
            android:layout_marginStart="0dp"
            android:background="?android:attr/windowBackground"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:menu="@menu/navigation" />

    </android.support.constraint.ConstraintLayout>

MainActivity

public class MainActivity extends AppCompatActivity
                          implements Home.OnFragmentInteractionListener,
                          Reminders.OnFragmentInteractionListener,
                          Settings.OnFragmentInteractionListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    switchToHomeFragment();
                    break;
                case R.id.navigation_dashboard:
                    switchToRemindersFragment();
                    break;
                case R.id.navigation_notifications:
                    switchToSettingsFragment();
                    break;
            }
            return false;
        }
    };

    public void switchToHomeFragment() {
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.home_Fragment, new Home()).commit();
    }
    public void switchToRemindersFragment() {
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.reminders_Fragment, new Reminders()).commit();
    }
    public void switchToSettingsFragment() {
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.settings_Fragment, new Settings()).commit();
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }
}

Home Fragment XML

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/home_Fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".Fragments.Home">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:title="@string/app_name">

        </android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            style="@style/MyCustomTabLayout"
            android:layout_height="wrap_content">

            <android.support.design.widget.TabItem
                android:id="@+id/tabItem_Today"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Today" />

            <android.support.design.widget.TabItem
                android:id="@+id/tabItem_ThisWeek"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This Week" />

            <android.support.design.widget.TabItem
                android:id="@+id/tabItem_ThisMonth"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This Month" />

        </android.support.design.widget.TabLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />



</FrameLayout>

Home.java

public class Home extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

    public Home() {

    }

    public static Home newInstance(String param1, String param2) {
        Home fragment = new Home();
        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) {
        return inflater.inflate(R.layout.fragment_home, container, false);
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(Uri uri);
    }
}

In Home.java all codes are auto generated code when I create the Home fragment.

Nikson
  • 900
  • 2
  • 21
  • 51

1 Answers1

3

in this line:

manager.beginTransaction().replace(R.id.reminders_Fragment, new Reminders()).commit();

R.id.reminders_Fragment 

is a container id which will be wrapped around Remainders Fragment but i can not see any container in your Home layout with this id

even below code has same problem because you do not have any container with used settings_Fragment id in your home layout:

manager.beginTransaction().replace(R.id.settings_Fragment, new Settings()).commit();

if you want every time one of your fragment be shown add one FrameLayout and use its id for container otherwise use one FrameLayout for every fragment and use id of FrameLayouts for transactions

You can use below code to select a default tab on resume:

onResume(){
   super.onResume();
   if(tabLayout.getSelectedTabPosition == -1)
       tabLayout.getTabAt(0).select();
}
ygngy
  • 3,630
  • 2
  • 18
  • 29
  • I am new to Android ,Here you mentioned I did not have any containers ,So how to implement it further.Please guide me to solve this – Nikson Apr 10 '18 at 15:46
  • @Nikson if you want every time one of your fragment be shown add one FrameLayout and use its id for container otherwise use one FrameLayout for every fragment and use id of FrameLayout for transactions – ygngy Apr 10 '18 at 15:49
  • I have added the FrameLayout and in which place I should use the id of FrameLayout – Nikson Apr 10 '18 at 15:50
  • @Nikson `manager.beginTransaction().replace(R.id.FRAMELAYOUT_ID_HERE, new FRAGMENT_HERE()).commit();` – ygngy Apr 10 '18 at 15:51
  • by default in Home tab it's not showing the Home fragment ,But If I clicked on Home Icon It is get displayed ,How to solve this – Nikson Apr 10 '18 at 15:56
  • Did I missed anything – Nikson Apr 10 '18 at 15:56
  • @Nikson see this answer https://stackoverflow.com/questions/31891178/android-support-design-widget-tablayout-select-tab-programmatically/31919302 – ygngy Apr 10 '18 at 16:02
  • After I run the app ,Home fragment should be get displayed but for me it is showing the plain bottom navigation.If I clicked on Home icon at the bottom navigation ,Home Fragment gets displayed How to solve this – Nikson Apr 10 '18 at 16:08
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/168662/discussion-between-wizard-and-nikson). – ygngy Apr 10 '18 at 16:32
  • @Nikson use above link – ygngy Apr 10 '18 at 16:37
  • @Nikson add this to `onResume()` method `if(tabLayout.getSelectedTabPosition < 0) { tabLayout.getTabAt(0).select()` – ygngy Apr 10 '18 at 16:59
  • Thanks for your time ,will apply the code and let you know the results. Thanks again – Nikson Apr 11 '18 at 03:44
  • can you help me to solve this issue https://stackoverflow.com/questions/50066346/cardview-gridlayout-with-recyclerview-is-not-fit-for-all-screen-sizes-in-andro – Nikson Apr 27 '18 at 16:41