Android: Acceso a Mapview Fragmento interno con ViewPager

Estoy utilizando View Pager para mostrar tres vistas.

"Filter","Streets","Around" 

Cada vista se define por fragmento.

QUÉ QUIERO: Quiero utilizar Mapview dentro de mi FilterFragment.

QUE HE HECHO :

Quiero utilizar el fragmento del filtro MapView dentro pero no podría funcionar con éxito. Y Obtener Log cate Error:

android.view.InflateException: Binary XML file line #33: Error inflating class com.google.android.maps.MapView

También he buscado en la red y Stackoverflow sobre este problema y encontré el acoplamiento y el acoplamiento pero no podría poder encontrar este acoplamiento relacionado a mi problema mientras que estoy usando fragmento con ViewPager.

He puesto mi código como abajo.

Aquí está My Code para MainViewPager.java:

  package com.example.viewpageractivitydemo; import com.example.viewpageractivitydemo.viewpager.TitlePageIndicator; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.Log; public class MainViewPager extends FragmentActivity { TestFragmentAdapter adapter; ViewPager pager; @Override protected void onCreate(Bundle arg0) { // TODO Auto-generated method stub super.onCreate(arg0); Log.i("MainViewPager","Inside Oncreate"); setContentView(R.layout.mainviewpager); pager = (ViewPager) findViewById(R.id.pager); adapter = new TestTitleFragmentAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.indicator); indicator.setViewPager(pager); pager.setCurrentItem(1); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); // pager.setCurrentItem(1); } } 

Aquí está Code for TestFragmentAdapter.java

 package com.example.viewpageractivitydemo; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.util.Log; public class TestFragmentAdapter extends FragmentPagerAdapter { protected static final String[] CONTENT = new String[] { "Filter", "Streets", "Around" }; public String TAG = "TestFragmentAdapter"; private int mCount = CONTENT.length; public TestFragmentAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public Fragment getItem(int position) { // TODO Auto-generated method stub Log.i(TAG, "Inside getItemMethod with position " + position); if (position == 0) { Log.i("TestFragmentAdapter","Inside if Condition"); return FilterFragment.newInstance(position); } else if (position == 1) { return StreetsFragment.newInstance(position); } else if (position == 2) { return AroundFragment.newInstance(position); } else { return null; } // return MainFragment.newInstance(CONTENT[position % CONTENT.length]); } @Override public int getCount() { // TODO Auto-generated method stub return mCount; } public void setCount(int count) { if (count > 0 && count <= 10) { mCount = count; notifyDataSetChanged(); } } } 

Aquí está Mi código para FilterFragment.java:

 package com.example.viewpageractivitydemo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class FilterFragment extends Fragment { /* * @Override protected Class<? extends Activity> getActivityClass() { // * TODO Auto-generated method stub return MyFilterActivity.class; } */ public static Fragment newInstance(int position) { Log.i("FilterFragment","Inside New Instasnce"); FilterFragment filterFragment = new FilterFragment(); return filterFragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub Log.i("FilterFragment","Inside OcCreateView"); View view = inflater.inflate(R.layout.filter, null); return view; } } 

Aquí está My Code para filter.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#C6CDD4" android:gravity="center" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#93A4BA" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_margin="5dp" android:gravity="center" android:text="Where Am I" android:textColor="#ffffff" android:textSize="18dp" android:textStyle="bold" > </TextView> </LinearLayout> <com.google.android.maps.MapView android:id="@+id/whereami_mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0-PaH6rk7RKrZSMd_lqdrZi6FazYyIlX5r6YFyA" android:clickable="true" /> <!-- <com.google.android.maps.MapView android:id="@+id/whereami_mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0-PaH6rk7RKrZSMd_lqdrZi6FazYyIlX5r6YFyA" /> --> </LinearLayout> </LinearLayout> 

Por favor, alguien puede sugerirme respuesta para resolver mi problema. He pasado muchas horas en esto. Todavía no obtengo ninguna idea sobre mi pregunta. Tiembla con anticipación.

Puede utilizar LocalActivityManager para alojar una actividad dentro de un fragmento. Es una clase obsoleta, pero ofrece la solución más simple.

Aquí está el código de un fragmento ( MyFilterFragment en su código). YourMapActivity es una actividad básica que extiende MapActivity .

 public class MapFragment extends Fragment { private static final String KEY_STATE_BUNDLE = "localActivityManagerState"; private LocalActivityManager mLocalActivityManager; protected LocalActivityManager getLocalActivityManager() { return mLocalActivityManager; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle state = null; if (savedInstanceState != null) { state = savedInstanceState.getBundle(KEY_STATE_BUNDLE); } mLocalActivityManager = new LocalActivityManager(getActivity(), true); mLocalActivityManager.dispatchCreate(state); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //This is where you specify you activity class Intent i = new Intent(getActivity(), YourMapActivity.class); Window w = mLocalActivityManager.startActivity("tag", i); View currentView=w.getDecorView(); currentView.setVisibility(View.VISIBLE); currentView.setFocusableInTouchMode(true); ((ViewGroup) currentView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); return currentView; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBundle(KEY_STATE_BUNDLE, mLocalActivityManager.saveInstanceState()); } @Override public void onResume() { super.onResume(); mLocalActivityManager.dispatchResume(); } @Override public void onPause() { super.onPause(); mLocalActivityManager.dispatchPause(getActivity().isFinishing()); } @Override public void onStop() { super.onStop(); mLocalActivityManager.dispatchStop(); } @Override public void onDestroy() { super.onDestroy(); mLocalActivityManager.dispatchDestroy(getActivity().isFinishing()); } } 

Editar: Desde que se publicó esta respuesta, Google ha lanzado Google Maps Android API con soporte de fragmentos con una clase MapFragment oficial.

Para utilizar Google Maps, tienes que extender MapActivity , que no hiciste. Echa un vistazo a este ejemplo en los documentos. En el espíritu de la facilidad de mantenimiento, no recurriría a soluciones que usan funcionalidad obsoleta.

Una solución más sólida es extender MapActivity y copiar la implementación que falta de FragmentActivity . Si no desea o necesita compatibilidad con versiones anteriores de Android, use MapActivity lugar de FragmentActivity , que debería incluir la funcionalidad necesaria para mostrar Fragment en Android 3.0 y versiones posteriores.


Edit: aquí hay un proyecto que lo hizo por ti .

  • Fragmento addToBackStack () y popBackStackImmediate () no funciona
  • Fragmento predeterminado del cajón de navegación
  • Android TabLayout ViewPager no inflar el fragmento de la pestaña en backstack
  • Cómo manejar múltiples fragmentos para una sola actividad
  • ¿Hay una manera de mostrar fragmentos en TabHost?
  • Viewpager y FragmentPagerAdapter: Eliminación de la vista de página
  • No se puede encontrar el girador después de girar la pantalla
  • Backstack desgaste androide no funciona
  • Acceso a getString () en un fragmento que implementa un viewpager
  • Android: navegar hasta la actividad principal recrea la actividad principal
  • Diferencia entre el uso de Contexto y getactivity en fragmento?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.