用户自定义布局的简单方法

时间:2012-11-07 19:39:01

标签: java android layout styles themes

下面我有一个应用程序,允许用户选择背景颜色和字体。这将适用于其他活动。然而,这是非常长的并且不容易阅读。有没有办法简化我的方法?

样式

<style name ="redBodyMono">
         <item name="android:textColor">@color/red</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">monospace</item>
    </style>

    <style name ="redTitleMono">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/red</item>
        <item name="android:typeface">monospace</item>
    </style>

    <style name ="blueBodyMono">
         <item name="android:textColor">@color/darkBlue</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">monospace</item>
    </style>

    <style name ="blueTitleMono">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/darkBlue</item>
        <item name="android:typeface">monospace</item>
    </style>

    <style name ="greenBodyMono">
         <item name="android:textColor">@color/green</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">monospace</item>
    </style>

    <style name ="greenTitleMono">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/green</item>
        <item name="android:typeface">monospace</item>
    </style>


    <style name ="redBodySans_Serif">
         <item name="android:textColor">@color/red</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">sans</item>
    </style>

    <style name ="redTitleSans_Serif">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/red</item>
        <item name="android:typeface">sans</item>
    </style>

    <style name ="blueBodySans_Serif">
         <item name="android:textColor">@color/darkBlue</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">sans</item>
    </style>

    <style name ="blueTitleSans_Serif">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/darkBlue</item>
        <item name="android:typeface">sans</item>
    </style>

    <style name ="greenBodySans_Serif">
         <item name="android:textColor">@color/green</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">sans</item>
    </style>

    <style name ="greenTitleSans_Serif">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/green</item>
        <item name="android:typeface">sans</item>
    </style>



    <style name ="redBodySerif">
         <item name="android:textColor">@color/red</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">serif</item>
    </style>

    <style name ="redTitleSerif">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/red</item>
        <item name="android:typeface">serif</item>
    </style>

    <style name ="blueBodySerif">
         <item name="android:textColor">@color/darkBlue</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">serif</item>
    </style>

    <style name ="blueTitleSerif">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/darkBlue</item>
        <item name="android:typeface">serif</item>
    </style>

    <style name ="greenBodySerif">
         <item name="android:textColor">@color/green</item>
        <item name ="android:background">@color/white</item>
        <item name="android:typeface">serif</item>
    </style>

    <style name ="greenTitleSerif">
         <item name="android:textColor">@color/white</item>
        <item name ="android:background">@color/green</item>
        <item name="android:typeface">serif</item>
    </style>


    <style name = "Theme" parent="@android:style/Theme">
        </style>

    <style name = "Theme.RedMono" >
        <item name="textTitle">@style/redTitleMono</item>
        <item name="textBody">@style/redBodyMono</item>

        </style>

    <style name = "Theme.BlueMono" >
        <item name="textTitle">@style/blueTitleMono</item>
        <item name="textBody">@style/blueBodyMono</item>

        </style>

       <style name = "Theme.GreenMono">
        <item name="textTitle">@style/greenTitleMono</item>
        <item name="textBody">@style/greenBodyMono</item>
        </style>



    <style name = "Theme.RedSans" >
        <item name="textTitle">@style/redTitleSans_Serif</item>
        <item name="textBody">@style/redBodySans_Serif</item>

        </style>

    <style name = "Theme.BlueSans" >
        <item name="textTitle">@style/blueTitleSans_Serif</item>
        <item name="textBody">@style/blueBodySans_Serif</item>

        </style>
    <style name = "Theme.GreenSans">
        <item name="textTitle">@style/greenTitleSans_Serif</item>
        <item name="textBody">@style/greenBodySans_Serif</item>

        </style>


    <style name = "Theme.RedSerif" >
        <item name="textTitle">@style/redTitleSerif</item>
        <item name="textBody">@style/redBodySerif</item>

        </style>

    <style name = "Theme.BlueSerif" >
        <item name="textTitle">@style/blueTitleSerif</item>
        <item name="textBody">@style/blueBodySerif</item>

        </style>
    <style name = "Theme.GreenSerif">
        <item name="textTitle">@style/greenTitleSerif</item>
        <item name="textBody">@style/greenBodySerif</item>

        </style>

菜单类

public class UserMenu extends Activity implements OnClickListener {
Button preview, apply;
Spinner spinnerColor, spinnerTypeFace;
SharedPreferences preferences;
public static String theme = "Blue";
    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         preferences = getSharedPreferences("StylePref", 0);
         theme = preferences.getString("THEME", "Blue");
        if(theme.equals("RedMonospace"))
        {
            setTheme(R.style.Theme_RedMono);
        }
        if(theme.equals("RedSerif"))
        {
            setTheme(R.style.Theme_RedSans);
        }
        if(theme.equals("RedSans"))
        {
            setTheme(R.style.Theme_RedSerif);
        }


        if(theme.equals("BlueMonospace"))
        {
            setTheme(R.style.Theme_BlueMono);
        }
        if(theme.equals("BlueSerif"))
        {
            setTheme(R.style.Theme_BlueSans);
        }
        if(theme.equals("BlueSans"))
        {
            setTheme(R.style.Theme_BlueSerif);
        }


        if(theme.equals("GreenMonospace"))
        {
            setTheme(R.style.Theme_GreenMono);
        }

        if(theme.equals("GreenSerif"))
        {
            setTheme(R.style.Theme_GreenSans);
        }

        if(theme.equals("GreenSans"))
        {
            setTheme(R.style.Theme_GreenSerif);
        }

        setContentView(R.layout.activity_user_menu);


        System.out.println("tHE THEME " + theme);

        spinnerColor = (Spinner) findViewById(R.id.spinnerColorMenu);
        spinnerTypeFace = (Spinner) findViewById(R.id.spinnerTypeFaceMenu);

        preview = (Button)findViewById(R.id.previewButton);
           preview.setOnClickListener(this);
           apply = (Button)findViewById(R.id.applyButton);
           apply.setOnClickListener(this);

    }

    public void onClick(View v)


    {
        if(v== preview)
        {
        SharedPreferences.Editor preferencesEditor = preferences.edit();
        String bgColor = spinnerColor.getSelectedItem().toString();
        String typeFace = spinnerTypeFace.getSelectedItem().toString();
        System.out.println(typeFace);
        preferencesEditor.putString("THEME", bgColor+typeFace);
        preferencesEditor.commit();

        if(bgColor.equals("Red") && typeFace.equals("Monospace"))
         {
            Intent intent = getIntent();
            //intent.putExtra("Theme", "Red");
          finish();
          startActivity(intent);
         }

        if(bgColor.equals("Red") && typeFace.equals("Sans"))
        {
        Intent intent = getIntent();
        //intent.putExtra("Theme", "Red");
         finish();
         startActivity(intent);
        }



        if(bgColor.equals("Red") && typeFace.equals("Serif"))
        {
        Intent intent = getIntent();
        //intent.putExtra("Theme", "Red");
         finish();
         startActivity(intent);
        }

        else if(bgColor.equals("Blue")&& typeFace.equals("Monospace"))
        {
         Intent intent = getIntent();
            //intent.putExtra("Theme", "Blue");
          finish();
          startActivity(intent);
        }

        else if(bgColor.equals("Blue")&& typeFace.equals("Sans"))
        {
         Intent intent = getIntent();
            //intent.putExtra("Theme", "Blue");
          finish();
          startActivity(intent);
        }
        else if(bgColor.equals("Blue")&& typeFace.equals("Serif"))
        {
         Intent intent = getIntent();
            //intent.putExtra("Theme", "Blue");
          finish();
          startActivity(intent);
        }

         else if(bgColor.equals("Green")&& typeFace.equals("Monospace"))
         {
             Intent intent = getIntent();
             //intent.putExtra("Theme", "Blue");
           finish();
           startActivity(intent);
         }
         else if(bgColor.equals("Green")&& typeFace.equals("Sans"))
         {
             Intent intent = getIntent();
             //intent.putExtra("Theme", "Blue");
           finish();
           startActivity(intent);
         }
         else if(bgColor.equals("Green")&& typeFace.equals("Serif"))
         {
             Intent intent = getIntent();
             //intent.putExtra("Theme", "Blue");
           finish();
           startActivity(intent);
         }
        }
        else if(v == apply)
        {
            SharedPreferences.Editor preferencesEditor = preferences.edit();
            String bgColor = spinnerColor.getSelectedItem().toString();
            String typeFace = spinnerTypeFace.getSelectedItem().toString();
            preferencesEditor.putString("THEME", bgColor+typeFace);
            preferencesEditor.commit();
            Intent applyIntent = new Intent(this,MyCourses.class);
            startActivity(applyIntent);

        }
}
}

2 个答案:

答案 0 :(得分:0)

不,这是最好的方法。继承可以用来使主题和样式更紧凑,但它并不真正适用于您的情况。

您可以使用if / else if语句在活动中提供稍微好一点的代码。即使把所有主题放在一个hashmap中,否则,没有,没有什么比这更好的了。

答案 1 :(得分:0)

我可能至少会将其分解为另一个类,例如ThemeHandler.getThemeId(String),设置一些静态的最终字符串而不是硬编码,然后返回R.style.whatever。最后,将其应用于setTheme(ThemeHandler.getThemeId(theme));。像这样:

class ThemeHandler {
    public static final String RED_MONO = "RedMonospace";
    public static final String RED_SANS = "RedSans";
    public static final String RED_SERIF = "RedSerif";
    //etc...

    public static int getThemeId(String themeString) {
        if(themeString.equals(RED_MONO)) return R.style.Theme_RedMono;
        else if(themeString.equals(RED_SANS)) return R.style.Theme_RedSans;
        else if(themeString.equals(RED_SERIF)) return R.style.Theme_RedSerif;
        //etc...
        else return R.style.Theme_Blue; //or whatever default
    }
}

//Then, in your onCreate()
String theme = preferences.getString("THEME", "Blue");
setTheme(ThemeHandler.getThemeId(theme));

为了额外的功劳,您可以切换到使用枚举而不是字符串来简化一些事情 - 然后您可以使用switch语句而不是那么多if / else语句。 :)