54

,我发现了以下错误:“的方法getSupportFragmentManager()是未定义的类型新View.OnClickListener(){}”在下面显示我的片段文件。getSupportFragmentManager()是未定义

我必须通过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:[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 

} 
+0

@tony gil您可以改用[AppCompatActivity](https://developer.android.com/reference/android/support/v7/app/AppCompatActivity.html)。 –

+0

这里有一个赏金,请提出它作为答案,也许你会得到奖励。 :) –

+1

@tony gil你有答案吗? –

回答

9

尝试将您的代码更改为:

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; 
} 
83

你会通过使调用对话框延长FragmentActivity

public class ObstetricsFragment1 extends FragmentActivity{ 

这是固有的支持库,如在DIALOG SPECSSUPPORT LIBRARY SPECS

+2

这是一个令人沮丧的错误,因为向您的课堂添加正确的导入无助于此。 –

+3

非常令人沮丧。 “一只脚在袋子里”,正如我们在葡萄牙语中所说的那样。 –

+0

无法扩展'FragmentActivity',必须扩展'Fragment',因为我使用'Navigation Drawer'片段作为我的基础。任何人都知道解决方法? – Azurespot

4

我做了一个活动摆脱这个问题的在马可的回答差异,看看他居然建议改变:只是

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

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

您需要从SherlockDialogFragment扩展ObstetricsFragment1。

3

如果有人正在使用SherlockActivity而不是SherlockFragment,只需将活动扩展为SherlockFragmentActivity即可。

0

要在片段通话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"); 
    } 

}); 
+1

请说明。一些示例代码也可能很好。 TKS! –

+0

'FragmentActivity.getSupportFragmentManager()'='android.support.v4.app.Fragment.getFragmentManager()'在这种情况下。你不需要嵌套的片段。 –

-1

。在你的项目中的问题,因为您使用的是过时的actionBarSherlock ... 你应该看看Android Support并使用它,因为supportFragmentManager可用。 这是很容易使用它,它加入你的build.gradle

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

后只是FragmentActivity或片段扩展支持从你的活动和片段。 也许你将不得不作出,因为使用福尔摩斯酒吧

你的问题的另一件事是,你从一个片段名为supportFragmentManager的一些变化?你应该叫

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

希望它有助于

+0

“从sherlock迁移到appcompat”应该是一条评论而不是答案。 –

+0

当然,但它是相关的告诉它,此外,我的回答集中于使用FragmentActivity和getChildFragmentManager()的事实 –

+0

是的,但OP *必须*已经使用'FragmentActivity'来首先使用SherlockFragment。你错过的是'Fragment.getFragmentManager()'。您不需要通过使用子片段管理器和嵌套片段来引入另一个变量。本机和支持片段只能访问其类型的管理员。这就是为什么它没有命名为'getSupportFragmentManager'。 –