java android android-fragments android-tabhost activitygroup

java - Android 1.6 y Fragmento y Tabhost



android-fragments android-tabhost (2)

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

En ese momento, utilicé el truco ActivityGroup para mostrar las actividades anidadas en una pestaña, pero estoy muy descontento con este método, ya que es un verdadero dolor manejar algunas funciones.

Escuché sobre el paquete de compatibilidad de Fragments API para 1.6 y un Fragment ve perfecto para lo que quiero hacer (mostrar vistas / características anidadas dentro de una pestaña con efectos de transición y esas cosas) pero no puedo hacer que funcione con un TabHost (era destinado a 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 ha encontrado una vista para el ID 0x1020011 para el 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); } }


¿Por qué no creas tu propia barra de pestañas? Es muy fácil de construir. Simplemente agregue un LinearLayout con algunos botones en él y configure onClickListener para cambiar los fragmentos utilizando FragmentManager. El administrador de fragmentos se puede obtener a partir de una actividad FragmentActivity.

FragmentManager fragmentManager = getSupportFragmentManager();

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


El problema es que su MyActivity intenta llegar a MainActivity utilizando android.R.id.tabcontent como un identificador de contenedor. Esto no es posible. En su lugar, MyActivity debe tener su propio diseño (por ejemplo, un FrameLayout) que se puede usar como elemento principal para el Fragmento. En este diseño, debe existir una vista a la que se pueda hacer referencia por ID.

Digamos que tienes un diseño llamado activity_layout.xml que contiene un FrameLayout con el id ''framelayout''. Luego 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 poder trabajar por su cuenta. Trate de hacer que funcione primero, y luego incruste MyActivity en MainActivity contiene el TabHost.