54

ich die folgende Fehlermeldung erhalten: "Die Methode getSupportFragmentManager() ist nicht definiert für den Typen neue View.OnClickListener() {}" in meiner Fragment-Datei unten.getSupportFragmentManager() ist nicht definiert

Ich habe die Kompatibilitätsbibliothek durch ABS referenziert und die richtigen Importe an Ort und Stelle. Ich habe die ABS-Bibliothek mit der Kompatibilitätsbibliothek neu installiert, das Projekt bereinigt, Eclipse neu gestartet, aber nichts hat funktioniert.

Im Wesentlichen versuche ich das Fragment, um eine Datumsauswahl durch ein Dialogfeldfragment anzuzeigen. Sobald das Datum ausgewählt ist, muss es an das Fragment zurückgegeben werden, damit es zur Berechnung von Informationen auf Grundlage dieses Datums verwendet werden kann.

Hier ist der Code für mein Fragment ist:

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

} 

Hier ist der Code für den 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; 
} 
} 

Schließlich, hier ist der Code für die meine Tätigkeit:

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

genannt @tony gil Sie können stattdessen [AppCompatActivity] (https://developer.android.com/reference/android/support/v7/app/AppCompatActivity.html) verwenden. –

+0

es gibt eine Prämie dort draußen, bitte schlagen Sie es als Antwort vor und vielleicht werden Sie belohnt. :) –

+1

@tony gil Hast du deine Antwort bekommen? –

Antwort

9

Versuchen Sie, Ihren Code zu ändern:

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

Sie, indem sie die Aktivität dieses Problem loszuwerden, der Dialog FragmentActivity

public class ObstetricsFragment1 extends FragmentActivity{ 

dies ist inhärent auf die Support-Bibliothek erweitern nennt, als

+2

Dies ist ein frustrierender Fehler zu haben, wie das Hinzufügen der richtigen Importe zu Ihrer Klasse nicht hilft. –

+3

sehr frustrierend. "ein Fuß in der Tasche", wie wir auf Portugiesisch sagen. –

+0

Kann 'FragmentActivity' nicht erweitern, muss 'Fragment' erweitern, da ich ein' Navigation Drawer'-Fragment als Basis verwende. Wer kennt einen Workaround? – Azurespot

4

in DIALOG SPECS und SUPPORT LIBRARY SPECS gesehen, ich habe diff auf Marcos Antwort, um zu sehen, was er tatsächlich empfohlen hat, zu ändern: nur

zu

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

Sie müssen ObstetricsFragment1 von SherlockDialogFragment erweitern.

3

Falls jemand SherlockActivity anstelle von SherlockFragment verwendet, erweitern Sie einfach die Aktivität auf SherlockFragmentActivity.

0

Um FragmentManager in einem Fragment Anruf getChildFragmentManager() zu erhalten. Siehe this.

Ändern Sie diese

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

}); 

zu

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

}); 
+1

bitte erläutern. einige Beispielcodes könnten auch nett sein. Tks! –

+0

'FragmentActivity.getSupportFragmentManager()' = 'android.support.v4.app.Fragment.getFragmentManager()' in diesem Fall. Sie benötigen dafür keine verschachtelten Fragmente. –

-1

Es gibt ein Problem in Ihrem Projekt ist, weil Sie die ActionBarSherlock verwenden, die veraltet ist ... Sie einen Blick darauf werfen sollte Android Support und verwenden Sie es, weil der supportFragmentManager damit verfügbar ist. Es ist ziemlich einfach, es zu benutzen, fügen Sie es in Ihrem build.gradle

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

Nach nur Ihre Aktivitäten und Fragment mit FragmentActivity oder Fragmente von Unterstützung erstreckt. Vielleicht müssen Sie einige Änderungen vornehmen, weil sherlock bar

Eine andere Sache, über Ihr Problem ist, dass Sie supportFragmentManager aus einem Fragment namens ... sollten Sie

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

Hoffnung ist es hilfreich

+0

"Migration von Sherlock zu appcompat" sollte ein Kommentar sein, keine Antwort. –

+0

Sicher, aber es ist wichtig zu sagen, darüber hinaus, meine Antwort konzentrieren sich auf die Fakten zu verwenden FragmentCtivity und getChildFragmentManager() –

+0

Ja, aber OP * muss * Fragment'Activity' verwenden, um SherlockFragment in erster Linie zu verwenden. Was Sie vermisst haben ist 'Fragment.getFragmentManager()'. Sie müssen keine andere Variable einführen, indem Sie einen untergeordneten Fragmentmanager und verschachtelte Fragmente verwenden. Native- und Support-Fragmente haben nur Zugriff auf ihren Typ von Manager. Deshalb heißt es nicht 'getSupportFragmentManager'. –