Crash al devolver el fragmento como una pestaña. Ver con la misma ID
Mi actividad principal tiene una ActionBar con dos pestañas. La pestaña 1 es un ListFragment y la pestaña 2 es un fragmento que utiliza la biblioteca HeaderListView. Cuando abre la aplicación, aparece la pestaña 1. Cuando cambia a la pestaña 2 y, a continuación, vuelve a la pestaña 1 y finalmente regresa a la pestaña 2, la aplicación se bloquea con lo siguiente:
09-12 13:19:22.440 21772-21772/com.iosharp.android.smoothstreams E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.iosharp.android.smoothstreams, PID: 21772 java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.widget.AbsListView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/header_list_view. Make sure other views do not use the same id.
Id / header_list_view sólo se utiliza en la pestaña 2 y sólo en el método onCreateView () y no se inflama en la pestaña 1. Estoy perplejo en cuanto a dónde ir desde aquí. También por lo que vale la pena estoy usando android.app.v4.support.Fragment
- Ver Gone cuando se hace clic fuera de esa vista
- Las vistas agregadas a TableLayout no se muestran mediante programación
- ¿Cómo mantener los atributos de diseño en la vista personalizada android combinada?
- Cómo obtener la ventana de un InputMethodService?
- listview que tiene viewpager en cada elemento de lista en android
Las partes relevantes del fragmento de la lengüeta 2:
public class ProgrammeListFragment extends Fragment { private static final String TAG = ProgrammeListFragment.class.getSimpleName(); private ArrayList<Programme> mProgrammes; private ArrayList<Day> mDays; private Date mNow; private HeaderListView mHeaderListView; static private SectionAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNow = new Date(); mProgrammes = ProgrammeStore.get(getActivity()).getProgrammes(); Collections.sort(mProgrammes, new Programme()); mProgrammes = trimProgrammes(mProgrammes); mDays = setupDays(mProgrammes); } @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.progamme_header_list, container, false); mHeaderListView = (HeaderListView) v.findViewById(R.id.header_list_view); mAdapter = new SectionAdapter() { @Override public int numberOfSections() { return mDays.size(); } @Override // TODO: sometimes -1 is passed as int section, this needs to be looked at later public int numberOfRows(int section) { if (section > -1) { return mDays.get(section).getLineUp().size(); } else { return 1; } } @Override public View getRowView(int section, int row, View convertView, ViewGroup parent) { convertView = getActivity().getLayoutInflater().inflate( R.layout.programme_list_item, null); //set views return convertView; } @Override public Day getSectionHeaderItem(int section) { return mDays.get(section); } @Override public int getSectionHeaderItemViewType(int section) { return super.getSectionHeaderItemViewType(section); } @Override public boolean hasSectionHeaderView(int section) { return true; } @Override public View getSectionHeaderView(int section, View convertView, ViewGroup parent) { convertView = getActivity().getLayoutInflater().inflate(R.layout.programme_list_header, null); // set views return convertView; } @Override public Programme getRowItem(int section, int row) { return mDays.get(section).getLineUp().get(row); } }; mHeaderListView.setAdapter(mAdapter); return v; } }
Las partes relevantes de MainActivity que instancian los fragmentos y las pestañas:
public class MainActivity extends ActionBarActivity { private static final String TAG = MainActivity.class.getSimpleName(); private static final String KEY_TAB = "tab"; private Fragment fragmentChannels = new ChannelListFragment(); private Fragment fragmentProgrammes = new ProgrammeListFragment(); private int mCurrentTab; private ActionBar mActionBar; private ArrayList<Channel> mChannels; private ArrayList<Programme> mProgrammes; private ProgressDialog mProgressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); mActionBar = getSupportActionBar(); mActionBar.setTitle(R.string.app_name); mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mActionBar.addTab(mActionBar.newTab().setText(R.string.channels_title).setTabListener(new TabListener(fragmentChannels))); mActionBar.addTab(mActionBar.newTab().setText(R.string.programmes).setTabListener(new TabListener(fragmentProgrammes))); // Get singletons mProgrammes = ProgrammeStore.get(getApplication()).getProgrammes(); mChannels = ChannelStore.get(getApplicationContext()).getChannels(); } }
Y por si acaso dos métodos de la clase TabListener tengo:
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { fragmentTransaction.replace(R.id.fragmentContainer, fragment); } public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { fragmentTransaction.remove(fragment); }
- Vista de navegación inferior con elemento personalizado (actionLayout)
- ¿Cómo puede saber si una vista es visible en la pantalla en Android?
- Android: Transparente WebView sobre previsualización de cámara
- Viewpager + webview, cómo detener la carga de la webview
- Android Imageview rellena el ancho de la pantalla
- GetHeight para View que tiene visibilidad = ido
- ¿Hay una manera de localizar de forma programática todas las ventanas dentro de una aplicación determinada?
- Android: Error al crear una instancia de una vista personalizada en XML
Esto es un problema en HeaderListView. Establecer un id en el listview ( listView.setId(1)
) a cualquier entero resuelve el problema.