Android 1.6 & Fragmento y Tabhost

Estoy trabajando en la actualización de una aplicación de Android (compatibilidad 1.6) que utiliza un TabHost para mostrar 3 pestañas diferentes con actividades anidadas.

En el momento que usé el truco de ActivityGroup para mostrar actividades anidadas en una pestaña, pero estoy muy descontento con este método, ya que es un verdadero dolor para manejar algunas características.

He oído hablar del paquete de compatibilidad Fragments API para 1.6 y un Fragment parece perfecto para lo que quiero hacer (mostrar vistas anidadas / características dentro de una pestaña con efectos de transición y cosas) pero no puedo hacerlo funcionar con un TabHost Para trabajar con una Action Bar pero no está disponible en el paquete de compatibilidad).

¿Alguno de ustedes encontró una manera de crear tal estructura en sus aplicaciones?

Mi error aquí es:

 ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable 

Para iniciar la actividad ComponentInfo {com.XXX}: java.lang.IllegalArgumentException: No se encontró ninguna vista para id 0x1020011 para fragmento MyFragment

CÓDIGO

Main.xml

 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dp" android:layout_weight="1" /> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0" /> </LinearLayout> </TabHost> 

MainActivity.java

 public class MainActivity extends TabActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Resources res = getResources(); final TabHost tabs = getTabHost(); TabHost.TabSpec spec; Intent i; i = new Intent(this, MyActivity.class); spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i); tabs.addTab(spec); } } 

MyActivity.class

 public class MyActivity extends FragmentActivity { private static String TAG = "MyActivity"; private static FragmentManager fragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ListeResultatFragment fragment = MyFragment.newInstance(); fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment"); fragmentTransaction.commit(); } } 

MyFragment.java

 public class MyFragment extends Fragment { public static MyFragment newInstance() { MyFragment instance = new MyFragment(); return instance; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container, false); } } 

El problema es que su MyActivity intenta llegar a la MainActivity adjuntando usando android.R.id.tabcontent como un identificador de contenedor. Esto no es posible. En su lugar, MyActivity necesita tener su propio diseño (por ejemplo, FrameLayout) que puede utilizarse como el padre del Fragmento. En esta disposición, debe existir una vista que pueda ser referenciada por id.

Digamos que usted tiene un diseño llamado activity_layout.xml que contiene un FrameLayout con el id 'framelayout'. A continuación, puede modificar el método MyActivity en MyActivity a algo como esto:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View parent = getLayoutInflater().inflate(R.layout.activity_layout, null); setContentView(parent); fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment fragment = MyFragment.newInstance(); fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment"); fragmentTransaction.commit(); } 

En otras palabras, MyActivity necesita ser capaz de trabajar por su cuenta. Intente que funcione primero y, a continuación, incorpore MyActivity en MainActivity contiene el TabHost.

¿Por qué no crear su propia barra de tabulación. Es muy fácil de construir. Sólo tiene que añadir un LinearLayout con algunos botones en él y establecer el onClickListener para cambiar fragmentos con el FragmentManager. El administrador de Fragmentos se puede obtener de una FragmentActivity.

 FragmentManager fragmentManager = getSupportFragmentManager(); 

En el controlador onClick, sólo realiza una transacción para cambiar a los fragmentos correctos.

  • ¿Cómo ejecutar pruebas de unidad para Android no está en el dispositivo o emulador?
  • ¿Se puede usar Android Studio para ejecutar proyectos Java estándar?
  • Cómo configurar / obtener datos de perfil con XMPP usando Smack
  • Hola World Android App, Error: espacio de trabajo \ appcompat_v7 \ res \ values-v21 \ styles_base.xml Ningún recurso encontrado que coincida con el nombre dado
  • Android: intervalos de tiempo con sueño profundo (System.nanoTime (), System.currentTimeMillis (), SystemClock.elapsedRealtimeNanos ())
  • ¿Asignación de objetos durante el dibujo / diseño?
  • Cómo configurar el encabezado de autorización (OAuth token) en una solicitud Android OKHTTPClient
  • Convertir doble en cadena
  • Error al seleccionar texto de Textview (java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) comienza antes de 0)
  • Error al analizar xml: prefijo sin consolidar con el SDK de Facebook
  • Retrofit + OkHttp está bien al enviar solicitudes GET, pero da SocketTimetout al enviar POST
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.