android android-fragments actionbarsherlock android-dialogfragment

android - getSupportFragmentManager() no está definido



android-fragments actionbarsherlock (8)

Recibo el siguiente error: "El método getSupportFragmentManager () no está definido para el tipo nuevo View.OnClickListener () {}" en mi archivo de fragmentos que se muestra a continuación.

Tengo la biblioteca de compatibilidad a la que se hace referencia a través de ABS y las importaciones adecuadas en su lugar. Reinstalé la biblioteca ABS con la biblioteca de compatibilidad, limpié el proyecto, reinicié Eclipse, pero nada funcionó.

Básicamente, estoy intentando que el fragmento muestre un selector de fecha a través de un fragmento de diálogo. Una vez que se elige la fecha, debe devolverse al fragmento para que se pueda usar para calcular la información en función de esa fecha.

Aquí está el código para mi Fragmento:

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

Aquí está el código para el Fragmento de diálogo:

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

Finalmente, aquí está el código para mi actividad:

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 }


En caso de que alguien esté usando SherlockActivity lugar de SherlockFragment solo extienda la actividad a SherlockFragmentActivity .


Hay un problema en su proyecto porque está utilizando ActionBarSherlock, que está en desuso ... Debe echar un vistazo al Soporte de Android y usarlo porque el SupportFragmentManager está disponible con él. Es bastante fácil de usar, agrégalo a tu build.gradle

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

Después de ampliar sus actividades y fragmentar con FragmentActivity o Fragment desde el soporte. Tal vez deberás hacer algunos cambios debido al uso de la barra sherlock

Otra cosa sobre su problema es que llamó a supportFragmentManager desde un fragmento ... debería llamar

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

Espero que sea útil


Hice una diferencia en la respuesta de Marco para ver lo que realmente me recomendó cambiar: solo

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

a

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


Intenta cambiar tu código a esto:

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


Necesita extender ObstetricsFragment1 desde SherlockDialogFragment.


Para obtener FragmentManager en un fragmento, llame a getChildFragmentManager() . Mira this.

Cambia esto

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



eliminará este problema haciendo que la actividad que llama al diálogo extienda FragmentActivity

public class ObstetricsFragment1 extends FragmentActivity{

esto es inherente a la biblioteca de soporte, como se ve en DIALOG SPECS y SUPPORT LIBRARY SPECS