Change the theme of the activity from a fragment

0

I need you to change the theme of my MainActivity when entering a Fragment

HomeFragment.java

getActivity().setTheme(R.style.SoonticketThemeMain);

So far that has not worked for me

This is my Activity

package com.soonticket.activity;

import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.text.Spannable;
import android.text.SpannableString;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.ViewGroup;
import android.widget.Toast;

import com.soonticket.R;
import com.soonticket.fragments.Home;
import com.soonticket.fragments.Profile;
import com.soonticket.util.CustomTypefaceSpan;
import com.soonticket.util.FontChangeCrawler;

public class MainActivity extends AppCompatActivity {
    SharedPreferences prefs = null;
    Menu ActivityMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "fonts/segoeui.ttf");
        fontChanger.replaceFonts((ViewGroup) this.findViewById(android.R.id.content));

        NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_main_view);
        setupDrawerContent(navigationView);

        ActivityMenu = navigationView.getMenu();

        for (int i = 0; i < ActivityMenu.size(); i++) {
            MenuItem mi = ActivityMenu.getItem(i);

            //for aapplying a font to subMenu ...
            SubMenu subMenu = mi.getSubMenu();
            if (subMenu != null && subMenu.size() > 0) {
                for (int j = 0; j < subMenu.size(); j++) {
                    MenuItem subMenuItem = subMenu.getItem(j);
                    applyFontToMenuItem(subMenuItem);
                }
            }

            //the method we have create in activity
            applyFontToMenuItem(mi);
        }

        if (savedInstanceState == null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.main_frame, new Home()).commit();
        }
    }

    private void applyFontToMenuItem(MenuItem mi) {
        Typeface font = Typeface.createFromAsset(getAssets(), "fonts/segoeui.ttf");
        SpannableString mNewTitle = new SpannableString(mi.getTitle());
        mNewTitle.setSpan(new CustomTypefaceSpan("", font), 0, mNewTitle.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        mi.setTitle(mNewTitle);
    }

    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        selectDrawerItem(menuItem);
                        return true;
                    }
                });
    }

    public void selectDrawerItem(MenuItem menuItem) {

        NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_main_view);
        ActivityMenu = navigationView.getMenu();

        // Create a new fragment and specify the fragment to show based on nav item clicked
        Fragment fragment = null;
        Class fragmentClass = null;
        switch (menuItem.getItemId()) {
            case R.id.nav_account:
                fragmentClass = Profile.class;
                break;
            case R.id.nav_favorites:
                Toast.makeText(this, menuItem.getTitle(), Toast.LENGTH_LONG).show();
                break;
            default:
                Toast.makeText(this, menuItem.getTitle(), Toast.LENGTH_LONG).show();
                break;
        }

        try {
            fragment = (Fragment) fragmentClass.newInstance();

            // Insert the fragment by replacing any existing fragment
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.main_frame, fragment).commit();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Highlight the selected item has been done by NavigationView
        menuItem.setChecked(true);

        // Close the navigation drawer
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    public void openDrawer() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.openDrawer(GravityCompat.START);
    }
}

And this is my fragment

package com.soonticket.fragments;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.soonticket.R;
import com.soonticket.activity.MainActivity;
import com.soonticket.util.FontChangeCrawler;

public class Home extends Fragment {

    RelativeLayout DrawerButtonHome;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_home, container, false);

        FontChangeCrawler fontChangeScrollToolbar = new FontChangeCrawler(getActivity().getAssets(), "fonts/r_medium.ttf");
        fontChangeScrollToolbar.replaceFonts((ViewGroup) rootView.findViewById(R.id.scroll_toolbar));

        Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.home_toolbar);
        ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
        ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

        DrawerButtonHome = (RelativeLayout) rootView.findViewById(R.id.drawer_button_home);
        DrawerButtonHome.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ((MainActivity) getActivity()).openDrawer();
            }
        });

        return rootView;
    }
}
    
asked by Abel Enoc Rodríguez 28.11.2017 в 08:45
source

1 answer

0

Technically you can not change a topic of an activity already created. But all is not lost since there is a way to change the "theme".

There is a form called " Pocket ".

How is it done and how does it work?

Basically consite in:

Base Color_1 +  Color intermedio = Theme Color_1

Base Color_2 +  Color intermedio = Theme Color_2

Keep in mind that the average color is the same as the base color, you must place it in the window that contains the instance of your application, something like this:

getWindow().setBackgroundDrawable(new ColorDrawable(isLight ? Color.WHITE : Color.BLACK));

Therefore, when combined with an intermediate color, it gives you two different themes.

If you want an example and more detailed explanation check here . (content in English)

    
answered by 29.11.2017 в 01:43