Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Adding a simple Fragment

I am pretty new to Android Apps, so I hope I can find some help here. I have already searched for my problem in here and found something, but that does not work.

I want to add a Fragment to a FrameLayout but it does not work. My goal ist to create a Frame (/Framework?) that is always present and the user can interact with it and inside this Frame in a specific "window" I want to display pages/fragments, five in total, and beeing able to switch the pages/fragments at any time, so I have an always present Frame and inside this dynamically changing pages. But for now I am stuck at the very beginning with adding a simple fragment to this Frame (which is already working btw.)

This is all the relevant code I hope: The error occurs in the MainActivity.java (getSupportFragmentManager().beginTransaction().add(R.id.mainFrame, homeFragment).commit();) where it tells me:

Error:(25, 55) error: no suitable method found for add(int,HomeFragment) method FragmentTransaction.add(Fragment,String) is not applicable (argument mismatch; int cannot be converted to Fragment) method FragmentTransaction.add(int,Fragment) is not applicable (argument mismatch; HomeFragment cannot be converted to Fragment)

I already tried to cast homeFragment to Fragment, but that did not work.

MainActivity.java

import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;


public class MainActivity extends FragmentActivity
{
    FragmentTransaction fragmentTransaction;
    HomeFragment homeFragment;

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

        homeFragment = new HomeFragment();
        **getSupportFragmentManager().beginTransaction().add(R.id.mainFrame, homeFragment).commit();**
}

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="MergeRootFrame" >

    <FrameLayout
        android:id = "@+id/mainFrame"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:layout_marginBottom = "@dimen/bottom_Main_Tabs">
        </FrameLayout>

    [...]

</FrameLayout>

fragment_home.xml

<FrameLayout 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"
    tools:context="com.example.HomeFragment"> // it is not really com.example...

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

HomeFragment.java (everything is autogenerated yet, but I already cut something out)

public class HomeFragment extends Fragment
{
    private OnFragmentInteractionListener mListener;


    public static HomeFragment newInstance()
    {
        HomeFragment fragment = new HomeFragment();
        return fragment; // not really neccessary, because it Have shortened it
    }

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

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }

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

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri)
    {
        if (mListener != null)
        {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try
        {
            mListener = (OnFragmentInteractionListener) activity;
        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

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

    public interface OnFragmentInteractionListener
    {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }

}

Can somebody please help me?

John

like image 488
JRsz Avatar asked Sep 09 '14 12:09

JRsz


People also ask

How do I add a fragment?

Add a fragment to an activity You can add your fragment to the activity's view hierarchy either by defining the fragment in your activity's layout file or by defining a fragment container in your activity's layout file and then programmatically adding the fragment from within your activity.

How do you add a fragment to an activity explain with an example?

Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml. In the above code, we have taken button views and linear layout to show different fragments.

Is it possible to use or add fragment without using UI?

However, a fragment is not required to be a part of the activity layout; you may also use a fragment without its own UI as an invisible worker for the activity.

Can we create fragment without activity?

Fragment can't be initiated without Activity or FragmentActivity.


Video Answer


1 Answers

You're mixing up classes from the support library and the new classes available only to newer versions of the OS.

For example, you import android.app.FragmentTransaction (available for API 11+) but the call to getSupportFragmentManager().beginTransaction() returns android.support.v4.app.FragmentTransaction ...

You need to import android.support.v4.app.FragmentTransaction and make sure that your HomeFragment extends android.support.v4.app.Fragment and not android.app.Fragment.

like image 127
2Dee Avatar answered Oct 18 '22 18:10

2Dee