getSupportFragmentManager() 未定义
Posted
技术标签:
【中文标题】getSupportFragmentManager() 未定义【英文标题】:getSupportFragmentManager() is undefined 【发布时间】:2012-10-24 02:56:48 【问题描述】:我收到以下错误:“方法 getSupportFragmentManager() 在我的片段文件中未定义类型 new View.OnClickListener()”下面。
我有通过 ABS 引用的兼容性库和适当的导入。我用兼容性库重新安装了 ABS 库,清理了项目,重新启动了 Eclipse,但没有任何效果。
基本上,我试图让片段通过对话框片段显示日期选择器。选择日期后,必须将其返回到片段,以便根据该日期计算信息。
这是我的片段的代码:
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;
这是对话框片段的代码:
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;
最后,这是我的活动的代码:
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:support@medicaldoctorapps.com"));
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
【问题讨论】:
@tony gil 你可以改用AppCompatActivity。 那里有一个赏金,请提出它作为答案,也许你会得到奖励。 :) @tony gil 你得到答案了吗? 没有发布任何新内容 【参考方案1】:您将通过使调用对话框的活动扩展 FragmentActivity 来解决此问题
public class ObstetricsFragment1 extends FragmentActivity
这是支持库所固有的,如 DIALOG SPECS 和 SUPPORT LIBRARY SPECS 所示
【讨论】:
这是一个令人沮丧的错误,因为将正确的导入添加到您的类没有帮助。 非常令人沮丧。正如我们在葡萄牙语中所说的,“袋中的一只脚”。 无法扩展FragmentActivity
,必须扩展Fragment
,因为我使用Navigation Drawer
片段作为我的基础。有人知道解决方法吗?【参考方案2】:
尝试将您的代码更改为:
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;
【讨论】:
【参考方案3】:我对 Marco 的回答做了一个比较,看看他实际上建议改变什么:只是
d.show(getSupportFragmentManager(), "dialog");
到
FragmentManager fm =
ObstetricsFragment1.this.getSherlockActivity().getSupportFragmentManager();
d.show(fm, "dialog");
【讨论】:
【参考方案4】:如果有人使用SherlockActivity
而不是SherlockFragment
,只需将活动扩展到SherlockFragmentActivity
。
【讨论】:
【参考方案5】:我在加载课程项目时遇到了类似的问题 (https://developer.android.com/training/multiple-threads)。
要解决这个问题,我必须添加一个外部 jar (sdk/extras/android/support/v4/android-support-v4.jar)。
希望这会有所帮助。
【讨论】:
【参考方案6】:您需要从 SherlockDialogFragment 扩展 ObstetricsFragment1。
【讨论】:
【参考方案7】:在片段调用getChildFragmentManager()
中获取FragmentManager
。
见this.
改变这个
mPickLMPDate.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
d.show(getSupportFragmentManager(), "dialog");
);
到
mPickLMPDate.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
d.show(getChildFragmentManager(), "dialog");
);
【讨论】:
请详细说明。一些示例代码也可能很好。 tks!FragmentActivity.getSupportFragmentManager()
= android.support.v4.app.Fragment.getFragmentManager()
在这种情况下。为此,您不需要嵌套片段。【参考方案8】:
您的项目中存在问题,因为您正在使用已弃用的 actionBarSherlock... 您应该查看 Android Support 并使用它,因为 supportFragmentManager 可用。 使用起来很简单,把它添加到你的 build.gradle 中
compile "com.android.support:support-core-utils:25.2.0"
只需使用来自支持的 FragmentActivity 或 Fragment 扩展您的活动和片段。 也许你会因为使用夏洛克酒吧而不得不做出一些改变
关于您的问题的另一件事是您从片段中调用了 supportFragmentManager...您应该调用
getChildFragmentManager() // because it will be a nested fragment
希望对你有帮助
【讨论】:
“从 sherlock 迁移到 appcompat”应该是评论而不是答案。 当然,但是告诉它是相关的,此外,我的回答集中在使用 FragmentActivity 和 getChildFragmentManager() 的事实 是的,但 OP 必须首先使用FragmentActivity
才能使用 SherlockFragment。你错过的是Fragment.getFragmentManager()
。您不需要通过使用子片段管理器和嵌套片段来引入另一个变量。本机和支持片段只能访问其类型的管理器。这就是为什么它没有被命名为getSupportFragmentManager
。以上是关于getSupportFragmentManager() 未定义的主要内容,如果未能解决你的问题,请参考以下文章
getSupportFragmentManager() 未定义
方法“getSupportFragmentManager()”不受支持
如何在 ArrayAdapter 中调用 getSupportFragmentManager()
getSupportFragmentManager()方法找不到
如何从片段中调用 getSupportFragmentManager()?
getSupportFragmentManager().findFragmentById 为 android 片段中的谷歌地图返回 null?