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 .

  • Reutilizar fragmento dentro de AlertDialog
  • Barra de progreso Android DialogFragment
  • ¿Cómo puedo cambiar entre dos fragmentos, sin recrear los fragmentos cada vez?
  • Teclado EditarEdición de Android no mostrado en Fragmento
  • Objetos de comunicación entre fragmentos múltiples en ViewPager
  • El método getFragmentManager () no está definido para el tipo MainActivity
  • Fragmento customAnimation no funciona en Lollipop
  • Interfaz de usuario dinámica con menú deslizante y actionbarsherlock
  • Barra de herramientas no aparece en fragmento con google maps
  • Error de vista de mapa de Android: solo se permite tener un único MapView en un MapActivity
  • Barra de herramientas de Android que no llama a onOptionsItemSelected de fragmentos en Backstack
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.