getSupportFragmentManager() is undefined

AndroidAndroid FragmentsActionbarsherlockAndroid Dialogfragment

Android Problem Overview


I'm getting the following error: "The method getSupportFragmentManager() is undefined for the type new View.OnClickListener(){}" in my fragment file shown below.

I have the compatibility library referenced through ABS and the proper imports in place. I reinstalled ABS library w/ the compatibility library, cleaned the project, restarted Eclipse, but nothing has worked.

Essentially, I'm trying to get the fragment to show a date picker through a dialog fragment. Once the date is picked, it must be returned to the fragment so it can be used to calculate information based on that date.

Here's the code for my Fragment:

package com.owentech.abstabsviewpager;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import com.actionbarsherlock.app.SherlockFragment;

public class ObstetricsFragment1 extends SherlockFragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
		Bundle savedInstanceState)
{
	//Fragment Layout
	View view = inflater.inflate(R.layout.obstetricsfragment1, container, false);
	
    Button mPickLMPDate = (Button) view.findViewById(R.id.pickLMPDate);
	
    mPickLMPDate.setOnClickListener(new OnClickListener() {
    	@Override
        public void onClick(View v) {
    		LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
    	    d.show(getSupportFragmentManager(), "dialog");
        }
        
    });
    
	return view;
}

public Dialog onCreateDialog(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	return null;
}

}

Here's the code for the Dialog Fragment:

package com.owentech.abstabsviewpager;

import android.app.Dialog;
import android.os.Bundle;
import android.widget.DatePicker;
import android.app.DatePickerDialog;

public class LMPDatePickerDialogFragment extends ObstetricsFragment1 implements DatePickerDialog.OnDateSetListener {

static LMPDatePickerDialogFragment newInstance() {
	LMPDatePickerDialogFragment d = new LMPDatePickerDialogFragment();
    return d;
}

private int mLMPYear;
private int mLMPMonth;
private int mLMPDay;

public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new DatePickerDialog(getActivity(), this, mLMPYear, mLMPMonth, mLMPDay);
}

public void onDateSet(DatePicker view, int year, int month, int day) {
	mLMPYear = year;
    mLMPMonth = month;
    mLMPDay = day;
}
}

Finally, here's the code for the my activity:

package com.owentech.abstabsviewpager;

import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.ActionBar.Tab;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;


public class Obstetrics extends SherlockFragmentActivity
{
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;

// START Action Bar Menu Items	
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   MenuInflater inflater = getSupportMenuInflater();
   inflater.inflate(R.menu.main_menu, menu);
   return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
	switch (item.getItemId()){
	case R.id.menuLog:
		ChangeLog cl = new ChangeLog(this);
    	cl.getFullLogDialog().show();
		return true;
	case R.id.menuEmail:
		Intent emailIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:[email protected]"));
		startActivity(emailIntent);
		return true;
	case R.id.menuRate:
		Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=appinventor.ai_shawn_m_gee.MedicalDoctor"));
		startActivity(browserIntent);
		return true;
    case android.R.id.home:
        // App icon in action bar clicked; go home
        Intent intent = new Intent(this, Home.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;
	case R.id.menuExit:
		this.finish();
		return true;
    default:
        return super.onOptionsItemSelected(item);
	}
}      
//END Action Bar Menu Items

// START Tabs View Pager (Add tabs by adding mTabsAdapter.addTab)	
@Override
public void onCreate(Bundle savedInstanceState)
{

	// Information you want returned to your application, via onCreate(), if the activity is destroyed and restarted due to some implicit reason		
	super.onCreate(savedInstanceState);
	
	mViewPager = new ViewPager(this);
	mViewPager.setId(R.id.pager);

	setContentView(mViewPager);
	ActionBar bar = getSupportActionBar();
	bar.setDisplayHomeAsUpEnabled(true);
	bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
	mTabsAdapter = new TabsAdapter(this, mViewPager);

	mTabsAdapter.addTab(
			bar.newTab().setText("Wheel"),
			ObstetricsFragment1.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("Physical"),
			HistoryPhysicalFragment2.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("ROS"),
			HistoryPhysicalFragment3.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("CAGE"),
			HistoryPhysicalFragment4.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("SIGECAPS"),
			HistoryPhysicalFragment5.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("Glasgow"),
			HistoryPhysicalFragment6.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("Neuro"),
			HistoryPhysicalFragment7.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("Dermat"),
			HistoryPhysicalFragment8.class, null);
	mTabsAdapter.addTab(
			bar.newTab().setText("Minicog"),
			HistoryPhysicalFragment9.class, null);
}

public static class TabsAdapter extends FragmentPagerAdapter implements
		ActionBar.TabListener, ViewPager.OnPageChangeListener
{
	private final Context mContext;
	private final ActionBar mActionBar;
	private final ViewPager mViewPager;
	private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

	static final class TabInfo
	{
		private final Class<?> clss;
		private final Bundle args;

		TabInfo(Class<?> _class, Bundle _args)
		{
			clss = _class;
			args = _args;
		}
	}

	public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager)
	{
		super(activity.getSupportFragmentManager());
		mContext = activity;
		mActionBar = activity.getSupportActionBar();
		mViewPager = pager;
		mViewPager.setAdapter(this);
		mViewPager.setOnPageChangeListener(this);
	}

	public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args)
	{
		TabInfo info = new TabInfo(clss, args);
		tab.setTag(info);
		tab.setTabListener(this);
		mTabs.add(info);
		mActionBar.addTab(tab);
		notifyDataSetChanged();
	}

	@Override
	public int getCount()
	{
		return mTabs.size();
	}

	@Override
	public Fragment getItem(int position)
	{
		TabInfo info = mTabs.get(position);
		return Fragment.instantiate(mContext, info.clss.getName(),
				info.args);
	}

	public void onPageScrolled(int position, float positionOffset,
			int positionOffsetPixels)
	{
	}

	public void onPageSelected(int position)
	{
		mActionBar.setSelectedNavigationItem(position);
	}

	public void onPageScrollStateChanged(int state)
	{
	}

	public void onTabSelected(Tab tab, FragmentTransaction ft)
	{
		Object tag = tab.getTag();
		for (int i = 0; i < mTabs.size(); i++)
		{
			if (mTabs.get(i) == tag)
			{
				mViewPager.setCurrentItem(i);
			}
		}
	}

	public void onTabUnselected(Tab tab, FragmentTransaction ft)
	{
	}

	public void onTabReselected(Tab tab, FragmentTransaction ft)
	{
	}
}
// END Tabs View Pager

}

Android Solutions


Solution 1 - Android

you will get rid of this problem by making the activity that calls the dialog extend FragmentActivity

public class ObstetricsFragment1 extends FragmentActivity{

this is inherent to the support library, as seen in DIALOG SPECS and SUPPORT LIBRARY SPECS

Solution 2 - Android

Try changing your code to this:

public class ObstetricsFragment1 extends SherlockFragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    //Fragment Layout
    View view = inflater.inflate(R.layout.obstetricsfragment1, container, false);

    Button mPickLMPDate = (Button) view.findViewById(R.id.pickLMPDate);

    mPickLMPDate.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
            FragmentManager fm = ObstetricsFragment1.this.getSherlockActivity().getSupportFragmentManager();
            d.show(fm, "dialog");
        }

    });

    return view;
}

Solution 3 - Android

I did a diff on Marco's answer to see what he actually recommended changing: just

d.show(getSupportFragmentManager(), "dialog");

to

FragmentManager fm = 
    ObstetricsFragment1.this.getSherlockActivity().getSupportFragmentManager();
d.show(fm, "dialog");

Solution 4 - Android

In case anyone is using SherlockActivity instead of SherlockFragment just extend the activity to SherlockFragmentActivity.

Solution 5 - Android

I had a similar problem loading a lesson project (https://developer.android.com/training/multiple-threads).

To resolve, I had to add an external jar (sdk/extras/android/support/v4/android-support-v4.jar).

Hope this helps.

Solution 6 - Android

You need to extend ObstetricsFragment1 from SherlockDialogFragment.

Solution 7 - Android

To get FragmentManager in a fragment call getChildFragmentManager(). See this.

Change this

mPickLMPDate.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
        d.show(getSupportFragmentManager(), "dialog");
    }

});

to

mPickLMPDate.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
        d.show(getChildFragmentManager(), "dialog");
    }

});

Solution 8 - Android

There is a problem in your project because you are using the actionBarSherlock which is deprecated... You should take a look at [Android Support][1] and use it because the supportFragmentManager is available with it. It's pretty easy to use it, add it in your build.gradle

compile "com.android.support:support-core-utils:25.2.0"

After just extends your activities and fragment with FragmentActivity or Fragment from support. Maybe you will have to make some change because of using sherlock bar

Another thing about your problem is that you called supportFragmentManager from a fragment... you should called

getChildFragmentManager() // because it will be a nested fragment

Hope it's helpful [1]: https://developer.android.com/topic/libraries/support-library/features.html

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionShawn GeeView Question on Stackoverflow
Solution 1 - Androidtony gilView Answer on Stackoverflow
Solution 2 - AndroidMarco RSView Answer on Stackoverflow
Solution 3 - AndroidNoumenonView Answer on Stackoverflow
Solution 4 - AndroiderdomesterView Answer on Stackoverflow
Solution 5 - AndroidCharles ThomasView Answer on Stackoverflow
Solution 6 - AndroidKristy WelshView Answer on Stackoverflow
Solution 7 - AndroidfaranjitView Answer on Stackoverflow
Solution 8 - AndroidMathieu BertinView Answer on Stackoverflow