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'。 –

相關問題