JohnUopini
JohnUopini

Reputation: 970

Dynamically change size of multiple textview from code (without a "on disk" xml theme)?

I have 10 TextViews in my code and i would like to change font size on all of them. On my layout i have used a @style to define common properties however i don't know how to change them all from code once layout is on screen.

What i dont want to do is update N objects but write only in one place. I know that i could use applyTheme but this assumes that you have an XML theme somewhere on disk, i want to be able to scale fonts to any size so this solution is not practical.

Any idea?

Upvotes: 3

Views: 7183

Answers (2)

SHAZAM
SHAZAM

Reputation: 21

Here is the whole code for dynamically change font size and theme

MainActivity:

public class MainActivity extends AppCompatActivity {

    TextView textViewMain;
    Button buttonChangeFont;
    int size, value;
    SharedPreferences pref;
    SharedPreferences.Editor editor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pref = getApplicationContext().getSharedPreferences("MyPref", 0);

        changeTheme();

        setContentView(R.layout.activity_main);

        //References
        textViewMain = findViewById(R.id.textViewMain);
        buttonChangeFont = findViewById(R.id.buttonChangeFont);

        //Set Onclick on button
        buttonChangeFont.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent goToPreview = new Intent(MainActivity.this, PreviewActivity.class);
                startActivity(goToPreview);
            }
        });

        int value = pref.getInt("value", 0);
        textViewMain.setTextSize(value);
    }

    private void changeTheme() {

        String theme = pref.getString("theme", "default");
        if (theme != null && theme.equals("default")) {
            setTheme(R.style.AppTheme);
        } else if (theme != null && theme.equals("black")) {
            setTheme(R.style.BlackTheme);
        } else {
            setTheme(R.style.BlueTheme);
        }
    }

    public void getSize() {


        editor = pref.edit();
        size = getIntent().getIntExtra("size", 14);

        if (size == 14) {
            value = 14;
            editor.putInt("value", value);

        } else if (size == 20) {
            value = 20;
            textViewMain.setTextSize(value);
            editor.putInt("value", value);

        } else {
            value = 30;
            textViewMain.setTextSize(value);
            editor.putInt("value", value);
        }
        editor.commit();
    }

    @Override
    protected void onStart() {
        getSize();
        super.onStart();
    }
}

PreviewActivity:

public class PreviewActivity extends AppCompatActivity {
    TextView textViewSmall, textViewMedium, textViewLarge, textViewPreview;
    Button buttonOK;
    String size;
    int value;
    SharedPreferences pref;
    SharedPreferences.Editor editor;

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

        pref = getApplicationContext().getSharedPreferences("MyPref", 0);
        setContentView(R.layout.activity_preview);

        //TextView References
        textViewLarge = findViewById(R.id.textViewLarge);
        textViewMedium = findViewById(R.id.textViewMedium);
        textViewSmall = findViewById(R.id.textViewSmall);
        textViewPreview = findViewById(R.id.textViewPreview);

        //Button References
        buttonOK = findViewById(R.id.buttonOK);

        //Set Onclick listener to TextView and Button
        textViewSmall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textViewPreview.setTextSize(14);
                size = "small";
            }
        });

        textViewMedium.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textViewPreview.setTextSize(20);
                size = "medium";
            }
        });

        textViewLarge.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textViewPreview.setTextSize(30);
                size = "large";
            }
        });


        buttonOK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (size) {
                    case "small":
                        value = 14;
                        break;

                    case "medium":
                        value = 20;
                        break;

                    case "large":
                        value = 30;
                        break;

                }

                Intent i = new Intent(PreviewActivity.this, MainActivity.class);
                i.putExtra("size", value);
                startActivity(i);
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu options from the res/menu/menu_catalog.xml file.
        // This adds menu items to the app bar.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        editor = pref.edit();

        // User clicked on a menu option in the app bar overflow menu
        switch (item.getItemId()) {

            case R.id.default_theme:

                textViewPreview.setBackgroundColor(Color.WHITE);
                textViewPreview.setTextColor(Color.DKGRAY);

                editor.putString("theme", "default");
                editor.commit();
                changeTheme();
                return true;

            case R.id.black_theme:

                textViewPreview.setBackgroundColor(Color.BLACK);
                textViewPreview.setTextColor(Color.WHITE);

                editor.putString("theme", "black");
                editor.commit();
                changeTheme();
                return true;

            case R.id.blue_theme:

                textViewPreview.setBackgroundColor(Color.BLUE);
                textViewPreview.setTextColor(Color.RED);

                editor.putString("theme", "blue");
                editor.commit();
                changeTheme();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void changeTheme() {

        String theme = pref.getString("theme", "default");
        if (theme != null && theme.equals("default")) {
            setTheme(R.style.AppTheme);
        } else if (theme != null && theme.equals("black")) {
            setTheme(R.style.BlackTheme);
        } else {
            setTheme(R.style.BlueTheme);
        }
    }
}

I am using my own custom theme. To create a custom theme you can reference this article on custom theme creation.

Upvotes: 0

Cheryl Simon
Cheryl Simon

Reputation: 46844

See similar questions:

How to programmatically setting style attribute in a view

android dynamically change style at runtime

android : set textView style at runtime

It sounds like its not possible to change an individual style element at runtime. You could apply a different theme, but then you would need a different theme for every font size you want to support. Annoying, but possible.

Otherwise, you have to come up with a way to reduce the pain of updating all of the textViews. You could store the size in your application class, so it is accessible by all of your activities, and then in onCreate update the size for each TextView.

Upvotes: 2

Related Questions