Android – Fragmento de la biblioteca de soporte no compatible con la plataforma 4.3

Me encuentro con un extraño problema al usar la biblioteca de soporte.


Quiero hacer una pestaña de navegación dinámica con fragmentos de conmutación en la plataforma 2.3.3, al igual que lo hizo la API Demo .

Introduzca aquí la descripción de la imagen


Todo va bien en la plataforma 2.3.3, pero cuando eché un vistazo a la misma actividad en la plataforma 4.3, me pareció algo muy extraño.

El SupportFragmentManagement no puede separar el fragmento, parece que la pestaña que selecciona la devolución de llamada no se ejecutó correctamente;

Las siguientes imágenes muestran cómo mi demo va Introduzca aquí la descripción de la imagen

Y aquí está mi código:

 package net.zengweizhi.android.gettingstarted.lesson05.test; import net.zengweizhi.android.gettingstarted.R; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; 

// usando la api de la biblioteca de soporte

 import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar.Tab; import android.support.v7.app.ActionBar.TabListener; import android.support.v7.app.ActionBarActivity; 
 public class NavigationTabsWithFragmentsV9 extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_navigation_tabs, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.actionButton_addTab: addTab(); break; case R.id.actionButton_removeTab: removeTab(); break; default: break; } return super.onOptionsItemSelected(item); } private int mTabSeq = 0; private void addTab(){ getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mTabSeq++; Tab tab = getSupportActionBar().newTab(); tab.setText("TAB " + mTabSeq); tab.setTabListener(new MyTabListener(this)); getSupportActionBar().addTab(tab); } private void removeTab(){ Tab tab = getSupportActionBar().getSelectedTab(); getSupportActionBar().removeTab(tab); Fragment fragment = getSupportFragmentManager().findFragmentByTag(tab.getText().toString()); getSupportFragmentManager().beginTransaction().remove(fragment).commit(); if( getSupportActionBar().getTabCount() == 0 ){ getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } } private static final class MyTabListener implements TabListener { private NavigationTabsWithFragmentsV9 mActivity; public MyTabListener(NavigationTabsWithFragmentsV9 activity /*,Fragment fragment*/){ mActivity = activity; } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // Do nothing } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { Object obj = tab.getTag(); if( null == obj ){ Bundle args = new Bundle(); args.putString(SimpleFragment.EXTRA_OUTPUT_MESSAGE, tab.getText().toString()); Fragment fragment = Fragment.instantiate(mActivity, SimpleFragment.class.getName(), args); ft.add(android.R.id.content, fragment, tab.getText().toString()); tab.setTag(obj = fragment); } ft.attach((Fragment)obj); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { if( null != mActivity.getSupportFragmentManager().findFragmentByTag(tab.getText().toString()) ){ ft.detach((Fragment)tab.getTag()); } } } public static final class SimpleFragment extends Fragment { public static final String EXTRA_OUTPUT_MESSAGE = "output_message"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragmentView = inflater.inflate(R.layout.fragment_simple, container, false); String outputMesasge = null; if( null != getArguments() ){ outputMesasge = getArguments().getString(EXTRA_OUTPUT_MESSAGE); } if( null == outputMesasge || 0 == outputMesasge.trim().length() ){ outputMesasge = getString(R.string.demo_text); } TextView textView = (TextView) fragmentView.findViewById(R.id.textView_simpleFragmentOutput); textView.setText(outputMesasge); return fragmentView; } } } 

Pero cuando cambio toda la support api a la regular api(default platform api) , todo va bien en la plataforma 4.3 (pero ésta no es compatible con la plataforma 2.3.3);

Introduzca aquí la descripción de la imagen

Aquí está el código (nada diferencia excepto el ActionBar y Fragment API)

 package net.zengweizhi.android.gettingstarted.lesson05.test; import net.zengweizhi.android.gettingstarted.R; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; 

// utiliza la api de la plataforma predeterminada (sólo en v11 y posterior)

 import android.annotation.SuppressLint; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.ActionBar.TabListener; import android.app.Fragment; import android.app.FragmentTransaction; 

@SuppressLint ("NewApi")

 public class NavigationTabsWithFragmentsV14 extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_navigation_tabs, menu); return super.onCreateOptionsMenu(menu); } private int mTabSeq = 0; private void addTab(){ getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mTabSeq++; Tab tab = getActionBar().newTab(); tab.setText("TAB " + mTabSeq); tab.setTabListener(new MyTabListener(this)); getActionBar().addTab(tab); } private void removeTab(){ Tab tab = getActionBar().getSelectedTab(); getActionBar().removeTab(tab); Fragment fragment = getFragmentManager().findFragmentByTag(tab.getText().toString()); getFragmentManager().beginTransaction().remove(fragment).commit(); if( getActionBar().getTabCount() == 0 ){ getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.actionButton_addTab: addTab(); break; case R.id.actionButton_removeTab: removeTab(); break; default: break; } return super.onOptionsItemSelected(item); } private static final class MyTabListener implements TabListener { private NavigationTabsWithFragmentsV14 mActivity; public MyTabListener(NavigationTabsWithFragmentsV14 activity /*,Fragment fragment*/){ mActivity = activity; } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // Do nothing } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { Object obj = tab.getTag(); if( null == obj ){ // initialize fragment to tab Bundle args = new Bundle(); args.putString(SimpleFragment.EXTRA_OUTPUT_MESSAGE, tab.getText().toString()); Fragment fragment = Fragment.instantiate(mActivity, SimpleFragment.class.getName(), args); ft.add(android.R.id.content, fragment, tab.getText().toString()); tab.setTag(obj = fragment); } ft.attach((Fragment)obj); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { if( null != mActivity.getFragmentManager().findFragmentByTag(tab.getText().toString()) ){ ft.detach((Fragment)tab.getTag()); } } } public static final class SimpleFragment extends Fragment { public static final String EXTRA_OUTPUT_MESSAGE = "output_message"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragmentView = inflater.inflate(R.layout.fragment_simple, container, false); String outputMesasge = null; if( null != getArguments() ){ outputMesasge = getArguments().getString(EXTRA_OUTPUT_MESSAGE); } if( null == outputMesasge || 0 == outputMesasge.trim().length() ){ outputMesasge = getString(R.string.demo_text); } TextView textView = (TextView) fragmentView.findViewById(R.id.textView_simpleFragmentOutput); textView.setText(outputMesasge); return fragmentView; } } } 

Puedo hacer una versión compatible usando (values-v14 / classes.xml) y el código siguiente

 try { Class<?> clazz = Class.forName(getString(R.string.class_navigationTabsAndFragmentsActivity)); startActivity(clazz); } catch (ClassNotFoundException ex) { showTextByToast(ex.getMessage()); } 

Pero todavía quiero saber lo que está pasando en la versión de la support library , ¿puede alguien ayudarme a resolver este problema?

Google libera Nexus 5 y una nueva biblioteca de soporte (v19), esta versión corrigió este error Introduzca aquí la descripción de la imagen

  • Biblioteca de soporte de diseño de Android: NavigationView código fuente
  • WearableListView setEnableGestureNavigation no disponible
  • ActionBarActivity detecta un error en el teléfono
  • com.android.support:appcompat-v7 y versión de diseño 23.2.0 error de paquete de bloqueo
  • ActionBarCompat en FragmentActivty
  • Biblioteca de soporte de Android lanzando una excepción de recursos no encontrados
  • PercentRelativeLayout es más performante?
  • ¿Cómo manejar idiomas mixtos RTL y LTR en las notificaciones?
  • ¿Cómo puedo requestDisallowTouchEvents en Android DrawerLayout
  • No se puede agregar la biblioteca de soporte v7 AppCompat
  • ¿Es esto un error en la biblioteca de diseño de soporte para Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.