Click here to Skip to main content
15,889,808 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi, I am using ViewPager to switch between fragments in an activity. Each fragment has its different background color, so I set different Themes. I know i'm supposed to set an activity's Theme before
Java
setContentView(R.layout.activity_walk_through);
. But it's kinda tricky. How do I set different themes for the activity when activity's current item is set to a fragment. Here's my code

What I have tried:

Activity's activity

Java
ViewPagerAdapter viewPagerAdapter;
ViewPager mViewPager;
static final String KEY_IS_FIRST_TIME =  "com.geeks14.sureremit.first_time";
static final String KEY =  "com.com.geeks14.sureremit";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_walk_through);
    viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPagerAdapter.addFragment(new WalkThroughOneFragment(), "Walkthrough One");
    viewPagerAdapter.addFragment(new WalkThroughTwo(), "Walkthrough Two");
    viewPagerAdapter.addFragment(new WalkThroughThreeFragment(), "Walkthrough Three");
    mViewPager = (ViewPager)findViewById(R.id.pager);
    mViewPager.setAdapter(viewPagerAdapter);

    setTitle("");
}
public void setCurrentItem (int item, boolean smoothScroll) {
    mViewPager.setCurrentItem(item, smoothScroll);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> fragmentList = new ArrayList<>();
    private final List<String> fragmentTitleList = new ArrayList<>();
    public ViewPagerAdapter(FragmentManager manager){
        super(manager);
    }
    @Override
    public Fragment getItem(int position){
        return fragmentList.get(position);
    }

    @Override
    public int getCount(){
        return fragmentList.size();
    }
    public void addFragment(Fragment fragment, String title){
        fragmentList.add(fragment);
        fragmentTitleList.add(title);
    }
    @Override
    public CharSequence getPageTitle(int position){
        return fragmentTitleList.get(position);
    }
}


Here's one of my fragment's activity
Java
public static WalkThroughOneFragment newInstance(String param1, String param2) {
        WalkThroughOneFragment fragment = new WalkThroughOneFragment();
        Bundle args = new Bundle();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//i set activity theme here but it did nothing
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_walk_through_one, container, false);
        nextButton = (FontButton)v.findViewById(R.id.FragmentOneNextButton);
        
        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((WalkThroughActivity)getActivity()).setCurrentItem(1, true);//fragment is set here
            }
        });
        return v;
    }
Posted
Updated 7-Mar-18 2:07am
Comments
David Crow 6-Mar-18 8:26am    
Have you tried calling setTheme() before setContentView()?

See here.
EasyHero 6-Mar-18 10:07am    
i'm aware this would work as i stated in my question. But my challenge here is that, the activity doesn't get recreated when switching between fragment views. Hence i would have been able to do this
David Crow 6-Mar-18 10:13am    
Why are you wanting the activity to get recreated when switching between fragments? When ViewPagerAdapter switches to a new fragment, the (parent) activity should remain intact. There are exceptions to this, but they are just that...exceptions.
EasyHero 6-Mar-18 10:24am    
From my question, what i want to achieve is this, as the ViewPagerAdapter changes to a new fragment, i want a new theme set for the parent. calling the setTheme() before the setContentView() would only set the theme once for the activity
David Crow 6-Mar-18 10:35am    
In the onCreateView() method, have you considered creating a ContextThemeWrapper and inflating from it? Something like:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    Context ctx = new ContextThemeWrapper(getActivity(), R.style.some_custom_theme);
    LayoutInflater li = inflater.cloneInContext(ctx);
    ...
    return li.inflate(R.layout.fragment_walk_through_one, container, false);
}

1 solution

Ok, after lots of trial, i finally found this here
All i had to do was hide the status bar, that way, each fragments take up fullscreen. I hid the status bar by placing the code below in the activity i had my fragments in before setContentView()

Java
View decorView = getWindow().getDecorView();
        // Hide the status bar.
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900