54

sto ottenendo il seguente errore: "Il metodo getSupportFragmentManager() non è definito per il tipo di nuova View.OnClickListener() {}" nel mio file frammento illustrato di seguito.getSupportFragmentManager() è indefinito

Ho la libreria di compatibilità a cui fa riferimento l'ABS e le importazioni corrette in posizione. Ho reinstallato la libreria ABS con la libreria di compatibilità, pulito il progetto, riavviato Eclipse, ma non ha funzionato.

In sostanza, sto cercando di ottenere il frammento per mostrare un selezionatore di date attraverso un frammento di dialogo. Una volta che la data è stata scelta, deve essere restituita al frammento in modo che possa essere utilizzata per calcolare le informazioni in base a tale data.

Ecco il codice per il mio 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; 
} 

} 

Ecco il codice per la finestra di dialogo 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; 
} 
} 

Infine, ecco il codice per la mia attività:

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 È possibile utilizzare [AppCompatActivity] (https://developer.android.com/reference/android/support/v7/app/AppCompatActivity.html). –

+0

c'è una taglia là fuori, per favore proponila come risposta e forse sarai ricompensato. :) –

+1

@tony gil Hai ricevuto la risposta? –

risposta

9

Prova a cambiare il tuo codice a questo:

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

si sbarazzarsi di questo problema, rendendo l'attività che richiama la finestra di estendere FragmentActivity

public class ObstetricsFragment1 extends FragmentActivity{ 

questo è inerente alla libreria di supporto, come si vede nella DIALOG SPECS e SUPPORT LIBRARY SPECS

+2

Si tratta di un errore frustrante, poiché aggiungere le importazioni corrette alla classe non è di aiuto. –

+3

molto frustrante. "un piede nella borsa", come diciamo in portoghese. –

+0

Impossibile estendere 'FragmentActivity', deve estendere' Fragment' perché sto usando un frammento 'Navigation Navigation 'come base. Qualcuno sa una soluzione? – Azurespot

4

ho fatto un Differenza sulla risposta di Marco per vedere cosa ha effettivamente raccomandato di cambiare: solo

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

a

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

È necessario estendere ObstetricsFragment1 da SherlockDialogFragment.

3

Se qualcuno utilizza SherlockActivity anziché SherlockFragment, è sufficiente estendere l'attività a SherlockFragmentActivity.

0

Per ottenere FragmentManager in un frammento, chiamare getChildFragmentManager(). Vedere this.

Modificare questa

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

}); 

a

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

}); 
+1

si prega di esporre. anche qualche codice di esempio potrebbe essere bello. tks! –

+0

'FragmentActivity.getSupportFragmentManager()' = 'android.support.v4.app.Fragment.getFragmentManager()' in questo caso. Non hai bisogno di frammenti annidati per questo. –

-1

C'è un problema nel vostro progetto, perché si utilizza l'ActionBarSherlock che è deprecato ... Si dovrebbe dare un'occhiata a Android Support e usarlo perché supportFragmentManager è disponibile con esso. E 'abbastanza facile da usare, aggiungerlo nel vostro build.gradle

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

Dopo appena estende le vostre attività e frammento con FragmentActivity o Frammento di un sostegno. Forse si dovrà fare qualche cambiamento a causa del usando la barra di Sherlock

Un'altra cosa circa il tuo problema è che hai chiamato supportFragmentManager da un frammento ... si dovrebbe chiamato

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

Spero che sia utile

+0

"Migrazione da sherlock ad appcompat" dovrebbe essere un commento e non una risposta. –

+0

Certo, ma è importante dirlo, inoltre, La mia risposta si concentra sui fatti per usare FragmentActivity e getChildFragmentManager() –

+0

Sì, ma OP * deve usare * FragmentActivity già per usare SherlockFragment in primo luogo. Quello che ti sei perso è 'Fragment.getFragmentManager()'. Non è necessario introdurre un'altra variabile utilizzando un gestore frammenti figlio e frammenti nidificati. I frammenti nativi e di supporto hanno accesso solo al loro tipo di manager. Ecco perché non è denominato 'getSupportFragmentManager'. –

Problemi correlati