简体   繁体   中英

Replace ViewPager fragment based on particular condition

I have created a simple ViewPager TabLayout to display 3 fragments inside 3 tabs. Now, if the user opens another activity and makes some changes, and comes back to the activity containing the ViewPager, the 3rd Fragment should be replaced by a new fragment. I do not want the user to see the old 3rd fragment anymore.

When the user comes back to the ViewPager Activity from another activity, the onResume() method is called, and by that we can know whether to replace the 3rd fragment or not.

This is the adapter for the ViewPager :

public class TabsPagerAdapterMain extends FragmentPagerAdapter {

    int mNumOfTabs;

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

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                YourStoryFragment yourStoryTab = new YourStoryFragment();
                return yourStoryTab;
            case 1:
                BrowseStoriesFragment browseStoriesTab = new BrowseStoriesFragment();
                return browseStoriesTab;
            case 2:
                ParseObject collegeObject;
                ParseUser user = ParseUser.getCurrentUser();
                collegeObject = user.getParseObject("college");
                if (collegeObject == null) {
                    CollegeSelectFragment collegeSelectFragment = new CollegeSelectFragment();
                    return collegeSelectFragment;
                } else {
                    YourCollegeFragment yourCollegeTab = new YourCollegeFragment();
                    return yourCollegeTab;
                }

            default:
                return null;
        }
    }

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

The Activity containing the ViewPager :

public class XXXXXXMainTabbed extends AppCompatActivity {
    ViewPager viewPager;
    public Student xxxxxMainStudent;
    private boolean brandNewAccount = false;
    private CharSequence mTitle;
    private long firstTime = 0;

    public int yourStoryFragmentMenuId = 0;
    Fragment globalFragmentThatIsOpen;
    static TextView actionTitle;
    Spinner browse_spinner;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxxxxx_main_tabbed);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setIcon(R.drawable.actionbar_space_between_icon_and_title);
        actionTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
        actionTitle.setTypeface(TypeFaceController.titleFace(getApplicationContext()));

       browse_spinner = (Spinner) toolbar.findViewById(R.id.browse_spinner);
        browse_spinner.setVisibility(View.GONE);


        TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText(" Story").setIcon(R.drawable.browse_tab));
        tabLayout.addTab(tabLayout.newTab().setText(" Browse").setIcon(R.drawable.browse_tab));
        tabLayout.addTab(tabLayout.newTab().setText(" College").setIcon(R.drawable.colleges_tab));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        setTitle("Your Story");



        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent inte = new Intent(getApplicationContext(), WriteStory.class);
                startActivity(inte);
            }
        });

        viewPager = (ViewPager) findViewById(R.id.pager);
        final TabsPagerAdapterMain adapter = new TabsPagerAdapterMain
                (getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setOffscreenPageLimit (4);
        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());

                switch (tab.getPosition()) {
                    case 0:
                        setTitle("Your Story");
                        browse_spinner.setVisibility(View.GONE);
                        break;
                    case 1:
                        setTitle("Browse");
                        browse_spinner.setVisibility(View.VISIBLE);
                        break;
                    case 2:
                        setTitle("Your College");
                        browse_spinner.setVisibility(View.GONE);
                        break;
                    default:
                        setTitle("XXXXXX");
                        browse_spinner.setVisibility(View.GONE);
                        break;
                }
            }

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

            }

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

            }
        });

        // Grab the bundle information
        Intent intentFromPrevious = getIntent();
        Bundle extras = intentFromPrevious.getExtras();

        saveInPreferenceBoolean("LoggedIn",true);

        if (extras != null) {
            brandNewAccount = extras.getBoolean("brandNewAccount");

            xxxxxxMainStudent = (Student) intentFromPrevious.getParcelableExtra("studentObject");

        } else {

        }

        if (brandNewAccount == true) {
            Intent inte = new Intent(getApplicationContext(), WriteStory.class);
            brandNewAccount = false;
            startActivity(inte);
        }

        saveInPreference("firstName", "");
        saveInPreference("lastName", "");
        saveInPreference("countryFrom", "");
        saveInPreference("collegeExists", "");
        saveInPreference("username", "");
        saveInPreference("email", "");
        saveInPreference("password", "");
        saveInPreference("dateOfBirth", "");
        saveInPreference("collegeId", "");
        saveInPreference("courseId", "");
        saveInPreference("facebookAccount", "");

        //updating app version in the user table
        updateUserAppVersion();
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("xxxxxxMainTabbed", "The onResume() event");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //getMenuInflater().inflate(R.menu.home_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        Log.e("postCounter", "" + xxxxxxMainStudent.getPostCount());
        if (isItYourStory() == true) {

            YourStoryFragment obj = new YourStoryFragment();
            if (obj.canEditItem == false) {
                obj.menuTitle = "EDIT";
            } else  {
                if (xxxxxxMainStudent.getPostCount() == 0) {
                    obj.menuTitle = "EDIT";
                }
                else {
                    obj.menuTitle = "DONE";
                }
            }

        }


        return super.onPrepareOptionsMenu(menu);
    }

    public Student getStudentDataFromMain() {
        return this.xxxxxxMainStudent;
    }

    public void displayView(int pos) {

    }

    private void updateUserAppVersion(){
        String appVersionName = getAppVersionName();

        ParseUser user = ParseUser.getCurrentUser();
        user.put("appVersion", appVersionName);

        user.saveInBackground(new SaveCallback() {
            public void done(com.parse.ParseException e) {
                if (e == null) {
                    // Save was successful!
                    Log.e("appVersion", "saved successfully");
                } else {
                    // Save failed. Inspect e for details.
                    Log.e("appVersion", "saved successfully");
                }
            }
        });
    }

    public String getAppVersionName() {
        PackageInfo pInfo = null;
        try {
            pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        String version = pInfo.versionName;

        return version;
    }

    public boolean isItYourStory() {

        if (viewPager.getCurrentItem() == 0) {
            return true;
        }
     return  false;
    }

    // method to save variable in preference
    public void saveInPreference(String name, String content) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(name, content);
        editor.commit();
    }

    // getting content from preferences
    public String getFromPreference(String variable_name) {
        String preference_return;
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        preference_return = preferences.getString(variable_name, "");

        return preference_return;
    }

    // method to save variable in preference
    public void saveInPreferenceBoolean(String name, boolean content){
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean(name, content);
        editor.commit();
    }

    // getting content from preferences
    public boolean getFromPreferenceBoolean(String variable_name){
        boolean preference_return;
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        preference_return = preferences.getBoolean(variable_name, false);

        return preference_return;
    }

    public void setTitle(String title) {
        actionTitle.setText(title);
    }
}

What should I do to set YourCollegeFragment in the 3rd tab when onResume() of the activity is called?

You would want to change the layouts inflated in the Fragment rather than replacing the frament itself. Inside the fragment, inflate the layouts based on your condition and inflate views accordingly. Here is a sample code i tried.

public class DemoFragment extends Fragment {

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

    if (your condition is true) {
        // layout_one will be the layout for your CollegeSelectFragment
        rootview = inflater.inflate(R.layout.layout_one, container, false);
    } else {
       // layout_one will be the layout for your YourCollegeFragment
        rootview = inflater.inflate(R.layout.layout_two, container, false);
    }
    setupViews(rootview);
    return rootview;
}


private void setupViews(View v) {
    if (your condition is true -- same as above check) {
        // find and set view that are in the layout_one.xml 
        TextView bigText = (TextView) v.findViewById(R.id.bigText);
        bigText.setText("set from code");
    } else {
        // find and set view that are in the layout_two.xml
        TextView bigText2 = (TextView) v.findViewById(R.id.bigText2);
        bigText2.setText("big text 2 set from code");
    }

}

}

You can create a variable to denote various situations and based on that flag, you can create the instance of the fragment you want.

In your adapter create a flag say

int conditionFlag;

Now create a public method to update this flag.

public void updateFlag(int flag){
    this.flag = flag;
}

In your activity, make the adapter object at class level and on its onResume() method, update the flag based on your condition like

adapter.updateFlag(flag);
adapter.notifyDataSetchanged();

In case notifyDataSetChanged() doesn't work you can follow these solutions

https://stackoverflow.com/a/8024557/1320616

https://stackoverflow.com/a/7287121/1320616

I have solved this issue after reading @kaaloraat's suggestion. I have created a fragment to work as a root fragment and this fragment is responsible to show the particular fragment based on a condition.

Here is the Root Fragment class :

public class RootCollegeFragment extends Fragment {

    private static final String TAG = "RootFragment";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        /* Inflate the layout for this fragment */
        View view = inflater.inflate(R.layout.root_fragment_college, container, false);

        ParseObject collegeObject;
        ParseUser user = ParseUser.getCurrentUser();
        collegeObject = user.getParseObject("college");
        if (collegeObject == null) {
            CollegeSelectFragment collegeSelectFragment= new CollegeSelectFragment();
            this.getFragmentManager().beginTransaction()
                    .replace(R.id.root_frame, collegeSelectFragment,null)
                    .addToBackStack(null)
                    .commit();
        } else {
            YourCollegeFragment yourCollegeFragment= new YourCollegeFragment();
            this.getFragmentManager().beginTransaction()
                    .replace(R.id.root_frame, yourCollegeFragment,null)
                    .addToBackStack(null)
                    .commit();
        }



        return view;
    }

    @Override
    public void onResume() {
        Log.e("RootCollegeFragment", "onResume of RootCollegeFragment");
        ParseObject collegeObject;
        ParseUser user = ParseUser.getCurrentUser();
        collegeObject = user.getParseObject("college");
        if (collegeObject == null) {
            CollegeSelectFragment collegeSelectFragment= new CollegeSelectFragment();
            this.getFragmentManager().beginTransaction()
                    .replace(R.id.root_frame, collegeSelectFragment,null)
                    .addToBackStack(null)
                    .commit();
        } else {
            YourCollegeFragment yourCollegeFragment= new YourCollegeFragment();
            this.getFragmentManager().beginTransaction()
                    .replace(R.id.root_frame, yourCollegeFragment,null)
                    .addToBackStack(null)
                    .commit();
        }
        super.onResume();
    }


}

I have let the adapter to just call the root fragment, which in turn will decide the fragment to open up.

The Adapter code :

public class TabsPagerAdapterMain extends FragmentPagerAdapter {

    int mNumOfTabs;

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

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                YourStoryFragment yourStoryTab = new YourStoryFragment();
                return yourStoryTab;
            case 1:
                BrowseStoriesFragment browseStoriesTab = new BrowseStoriesFragment();
                return browseStoriesTab;
            case 2:
                RootCollegeFragment rootCollegeFragment = new RootCollegeFragment();
                return rootCollegeFragment;

            default:
                return null;
        }
    }

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

Thats is! Simple and clean!

PS: This was also very useful

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM