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.