开发者

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

开发者 https://www.devze.com 2023-01-31 16:47 出处:网络
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 ho开发者_如何学Cwever i don\'t know how to change them

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 ho开发者_如何学Cwever 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?


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消