studio - programacion android pdf 2018




java.lang.IllegalStateException: no se puede cambiar la etiqueta del fragmento (4)

Hola. Recibo este error mientras uso un visor de página y un adaptador para deslizarse en 3 fragmentos.

aquí está mi página

public class FreedomPageAdapter extends FragmentPagerAdapter {

    private List<Fragment> listFragment;


    public FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) {

        super(fm);
        this.listFragment = listFragment;
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
     */
    @Override
    public Fragment getItem(int position) {
        // TODO Auto-generated method stub
        return listFragment.get(position);
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return listFragment.size();
    }

Así es como defino la página vista.

viewPager = (ViewPager) findViewById(R.id.pager);

        viewPager.setOnPageChangeListener(this);

        savedListFragment = new SubscribedFragment();

        fragmentList.add(savedListFragment);

        fragmentList.add(savedListFragment);

        fragmentList.add(savedListFragment);

        viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(),
                fragmentList));



    private FragmentManager fragmentManager() {
        return getSupportFragmentManager();
    }

    private FragmentTransaction getFragmentTransaction() {
        return fragmentManager().beginTransaction();
    }

oyente de vista de página

/*
     * (non-Javadoc)
     * 
     * @see android.support.v4.view.ViewPager.OnPageChangeListener#
     * onPageScrollStateChanged(int)
     */
    @Override
    public void onPageScrollStateChanged(int arg0) {

    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled
     * (int, float, int)
     */
    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {

    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected
     * (int)
     */
    @Override
    public void onPageSelected(int position) {
        actionBar.setSelectedNavigationItem(position);

    }

Objeto de fragmento personalizado

   public class SubscribedFragment extends Fragment{

    /* (non-Javadoc)
     * @see android.app.Fragment#onCreate(android.os.Bundle)
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

    }

    /* (non-Javadoc)
     * @see android.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.discussion_list_layout, container);
    }

}

Rastreo completo de la pila de error:

    05-02 19:15:44.599: E/AndroidRuntime(19839): FATAL EXCEPTION: main
05-02 19:15:44.599: E/AndroidRuntime(19839): java.lang.IllegalStateException: Can't change tag of fragment SubscribedFragment{41157420 id=0x7f070005 android:switcher:2131165189:0}: was android:switcher:2131165189:0 now android:switcher:2131165189:1
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:398)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:389)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:99)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:800)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.view.ViewPager.populate(ViewPager.java:991)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.View.measure(View.java:15518)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.View.measure(View.java:15518)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.View.measure(View.java:15518)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2434)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.View.measure(View.java:15518)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.Choreographer.doFrame(Choreographer.java:532)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.os.Handler.handleCallback(Handler.java:725)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.os.Looper.loop(Looper.java:137)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at android.app.ActivityThread.main(ActivityThread.java:5226)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at java.lang.reflect.Method.invokeNative(Native Method)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at java.lang.reflect.Method.invoke(Method.java:511)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-02 19:15:44.599: E/AndroidRuntime(19839):    at dalvik.system.NativeStart.main(Native Method)

El siguiente método debe devolver un fragmento para cada pestaña:

@Override
public Fragment getItem(int position) {
    //Add some code
    //to verify that it will not return null
    return listFragment.get(position);
}

El código está bien, pero asegúrese de que listFragment contenga tres Fragmentos diferentes y que el fragmento no sea nulo.


En mi caso, no estaba devolviendo una Instancia de fragmento para una posición en particular. Creo que FragmentPagerAdapter está recibiendo nulo en lugar del TAG. Es por eso que se muestra " No se puede cambiar la etiqueta del fragmento " Corríjame si me equivoco.


Has creado una instancia de la clase SubscribedFragment ()

savedListFragment = new SubscribedFragment();

y luego pasó la lista de estos objetos a ViewPager Adpater:

FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment)

que recibe Lista de tipo Fragmento en su constructor. Dado que el constructor recibe el tipo de lista de fragmentos, intente convertir cada fragmento de lista guardado en el fragmento antes de agregarlo a la lista y luego pasarlo al constructor del adpater:

fragmentList.add((Fragment)savedListFragment);
viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(), fragmentList));

Probablemente sea porque estás agregando la misma instancia de fragmento tres veces a la lista. Debe crear una nueva instancia para cada página.

Además, sugiero que busques en FragmentStatePagerAdapter si no estás demasiado lejos en el desarrollo. Puede ser una mejor opción si desea actualizar el contenido de los fragmentos de la actividad principal.





android-fragments