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.

  • Android guarda el estado de listview con multipleChoice
  • ¿Por qué estoy obteniendo una referencia nula en mi RecyclerView
  • ¿Puede Android Dibujos definidos en XML contienen una ruta de acceso?
  • Cómo determinar mediante programación si android está conectado a wifi?
  • ¿RestKit en android?
  • Mostrar una letra de cadena por letra en un TextView -Android
  • ¿Cómo maneja el XmlPullParser de Android las vulnerabilidades?
  • Android: copia los recursos en el almacenamiento interno
  • Convertir enum enumerado a Ennotación enumerada en android
  • Truecaller android sdk Código de error 3
  • Daga con Android: ¿Cómo inyectar el contexto cuando se utiliza MVP?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.