Stop TabView

1

I have two TabView and the problem is that if for example I have a Toast in Tab2 when opening Tab1 is executed, how can I make it so that it does not "exchange data", that is, if I am in Tab1 or Tab2 that the other does not activate, that this "closed"

FragmentStatePagerAdapter

public class PagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                Tab1 tab1 = new Tab1();
                return tab1;
            case 1:
                Tab2 tab2 = new Tab2();
                return tab2;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

Activity

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Mis Notas"));
tabLayout.addTab(tabLayout.newTab().setText("Favoritas"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
        (getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }
});

EDITO1: @Israel

public class Tab1 extends Fragment {

    public static SqliteDatabase mDatabase;
    public static RecyclerView recyclerview_notas;
    public static ArrayList<Notas> allNotas;
    public static TextView TxtPersistente, RecyclerVacio;
    static public NotasAdapter mAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.tab1,
                container, false);

            RecyclerVacio = (TextView) view.findViewById(R.id.RecyclerVacio);
            recyclerview_notas = (RecyclerView) view.findViewById(R.id.recyclerview_notas);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ContextyMetodos.getAppContext());
            TxtPersistente = new TextView(ContextyMetodos.getAppContext());
            recyclerview_notas.setLayoutManager(linearLayoutManager);
            recyclerview_notas.setHasFixedSize(true);
            //metodoMuestraRecyclerView();
            return view;
        }

        public void metodoMuestraRecyclerView(){

            mDatabase = new SqliteDatabase(ContextyMetodos.getAppContext());
            allNotas = (ArrayList<Notas>) mDatabase.listNotas();

            if (allNotas.size() > 0) {
                RecyclerVacio.setVisibility(View.GONE);
                recyclerview_notas.setVisibility(View.VISIBLE);
                mAdapter = new NotasAdapter(ContextyMetodos.getAppContext(), allNotas);
                recyclerview_notas.setAdapter(mAdapter);
                mAdapter.filter("favorito");

            } else {
                recyclerview_notas.setVisibility(View.GONE);
                RecyclerVacio.setVisibility(View.VISIBLE);
            }
        }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            metodoMuestraRecyclerView();
        }
    }
}

Logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setVisibility(int)' on a null object reference
                                                                   at intento.dos.TabView.Tab1.metodoMuestraRecyclerView(Tab1.java:52)
                                                                   at intento.dos.TabView.Tab1.setUserVisibleHint(Tab1.java:68)
                                                                   at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:157)
                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1266)
                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
                                                                   at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
                                                                   at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                   at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                   at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                   at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458)
                                                                   at android.widget.LinearLayout.measureVertical(LinearLayout.java:746)
                                                                   at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                   at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                   at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458)
                                                                   at android.widget.LinearLayout.measureVertical(LinearLayout.java:746)
                                                                   at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                   at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                   at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2899)
                                                                   at android.view.View.measure(View.java:18799)
                                                                   at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2108)
                                                                   at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1224)
                                                                   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1460)
                                                                   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115)
                                                                   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023)
                                                                   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                   at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                   at android.view.Choreographer.doFrame(Choreographer.java:606)
                                                                   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                   at android.os.Looper.loop(Looper.java:148)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5461)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                   at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
    
asked by UserNameYo 23.06.2017 в 22:56
source

1 answer

1

I propose to overwrite the setUserVisibleHint method in each fragment to know if Fragment is visible, if not, do not load the content of onCreate , and if it is, you have to reload the content of said fragment to rerun the onCreate method from the Adapter (I comment the lines that I have added):

public class Tab1 extends Fragment {

public static SqliteDatabase mDatabase;
public static RecyclerView recyclerview_notas;
public static ArrayList<Notas> allNotas;
public static TextView TxtPersistente, RecyclerVacio;
static public NotasAdapter mAdapter;

static boolean visible = false;// aqui almacenas el estado del Fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.tab1,
            container, false);

        RecyclerVacio = (TextView) view.findViewById(R.id.RecyclerVacio);
        recyclerview_notas = (RecyclerView) view.findViewById(R.id.recyclerview_notas);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ContextyMetodos.getAppContext());
        TxtPersistente = new TextView(ContextyMetodos.getAppContext());
        recyclerview_notas.setLayoutManager(linearLayoutManager);
        recyclerview_notas.setHasFixedSize(true);

        //Si el Fragment esta actualmente en la pantalla, ejecuta el metodo
        if(visible)
            metodoMuestraRecyclerView();


        return view;
    }

    public void metodoMuestraRecyclerView(){

        mDatabase = new SqliteDatabase(ContextyMetodos.getAppContext());
        allNotas = (ArrayList<Notas>) mDatabase.listNotas();

        if (allNotas.size() > 0) {
            RecyclerVacio.setVisibility(View.GONE);
            recyclerview_notas.setVisibility(View.VISIBLE);
            mAdapter = new NotasAdapter(ContextyMetodos.getAppContext(), allNotas);
            recyclerview_notas.setAdapter(mAdapter);
            mAdapter.filter("favorito");

        } else {
            recyclerview_notas.setVisibility(View.GONE);
            RecyclerVacio.setVisibility(View.VISIBLE);
        }
    }

//este metodo se encarga de comprobar si el fragment esta seleccionado
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    visible = isVisibleToUser; //asignamos a la variable declarada arriba, true o false, segun si esta o no seleccionado el fragment
}
}

Now to reload the Fragment in the adapter, the getItemPosition method is overwritten to allow us to notify you of changes:

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            Tab1 tab1 = new Tab1();
            return tab1;
        case 1:
            Tab2 tab2 = new Tab2();
            return tab2;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}
}

Finally, in your Activity, we will notify you of the changes when you click on a tab:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Mis Notas"));
tabLayout.addTab(tabLayout.newTab().setText("Favoritas"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
    (getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
        viewPager.getAdapter().notifyDataSetChanged();
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }
});

The solution I gave you in the comments, setOffscreenPageLimit is valid but with a small detail, and that is that you have to load at least 2 Tabs, that is, you can avoid recreating the 3, 4 ... but always the 1 and 2 will be charged, if you change to 2, 1 will be destroyed to load 3.

    
answered by 24.06.2017 / 14:51
source