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.
- Fragmento no se actualizará después de la notificación de apertura
- Dos diseños de marco en el ejemplo de FragmentTabs de Android Support4Demos
- DialogFragment: Utilizar AlertDialog con diseño personalizado
- Elementos compartidos que animan entre fragmentos
- Estado de error: active SupportMapFragment {} ha borrado el índice: -1
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.
- FragmentActivity no se puede probar a través de ActivityInstrumentationTestCase2
- Cómo configurar Custom ListView en Android Fragement?
- ¿Cómo se puede mostrar un Snackbar desde un fragmento en la vista correcta?
- DialogFragment bloquea la aplicación en el cambio de orientación
- Llamar a startIntentSenderForResult de Fragment (sin usar la actividad existente) (Android Billing v3)
- Separador de sombras entre fragmentos de Android
- Inflar fragmentos con el paquete de compatibilidad android
- UnsupportedOperationException AudioEffect: operación de parámetro no válida
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 .
- Autenticación con certificados de cliente con PhoneGap
- Android – Stop (Interceptar) C2DM Notificación de empuje si la aplicación está en ejecución?