2013-04-23 4 views
0

Хорошо, вопрос есть. В моем приложении Android у меня есть два отдельных действия для опций и для основной деятельности. В основной деятельности есть место, когда он проверяет изменения в параметрах и применяет стили. Это выглядит следующим образом:Как обрабатывать несколько методов Android?

if (prefs.getBoolean("opt_changed", true)) { 
     Theme = prefs.getInt("theme", Theme); 
     Font = prefs.getInt("font", Font); 
     Size = prefs.getInt("size", Size); 

     SetApplicableStyle(this, Theme, Font, Size); 

     /** Setting opt_changed to false. */ 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putBoolean("opt_changed", false); 
     editor.commit(); // apply changes 
    } 

SetApplicableStyle метод, называемый здесь, выглядит следующим образом:

public void SetApplicableStyle (DTypeActivity dTypeActivity, int Theme, int Font, int Size) { 
    // Retrieving the EditText and the View as objects 
    final EditText edit_text = (EditText) findViewById(R.id.editText1); 
    final View main_view = (View) findViewById(R.id.mainview); 

    // Setting the theme 
    switch(Theme){ 
    case 1: 
     SetThemeLight (this); 
    break; 
    case 2: 
     SetThemeBlue (this);   
    break; 
    case 3: 
     SetThemeDark (this); 
    break; 
    } 

    // Setting the font 
    switch(Font){ 
    case 1: 
     SetFontSans (this); 
    break; 
    case 2: 
     SetFontSerif (this);   
    break; 
    case 3: 
     SetFontMono (this); 
    break; 
    } 

    // Setting the size 
    switch(Size){ 
    case 1: 
     SetSizeSm (this); 
    break; 
    case 2: 
     SetSizeMd (this);  
    break; 
    case 3: 
     SetSizeBg (this); 
    break; 
    } 
} 

И как пример из Set[Something][Somewhat] методов, есть SetThemeLight один:

public void SetThemeLight (DTypeActivity dTypeActivity) { 
     final EditText edit_text = (EditText) findViewById(R.id.editText1); 
     final View main_view = (View) findViewById(R.id.mainview); 
     main_view.setBackgroundDrawable(getResources().getDrawable(R.drawable.grey_background)); 
     edit_text.getBackground().setAlpha(0); 
     edit_text.setTextColor(getResources().getColor(R.color.DrText)); 

} 

Мой вопрос касается количества методов, которые используются в этом простом приложении. Я думал об уменьшении количества кода и реализовал метод SetApplicableStyle. Теперь я думаю, было бы хорошо избавиться от Set[Something][Somewhat] и вывести линии из них прямо в случаи переключателей SetApplicableStyle. Моя основная забота - это количество методов, но я знаю, что огромные методы также являются плохой практикой. Что было бы лучшим решением здесь?

Полный исходный код доступен here.

ответ

1

Я предполагаю, что вы дублируете большую часть кода в методах SetThemeX. Таким образом, я бы рекомендовал введение класс, который отражает суть темы и использовать это:

class MyTheme { 
    public int background; 
    public int alpha; 
    public int color; 
    public MyTheme(int background, int alpha, int color) { 
     this.background = background; 
     this.alpha = alpha; 
     this.color = color; 
    } 
} 

сделать один метод, чтобы установить тему:

public void setTheme(DTypeActivity dTypeActivity, MyTheme theme) { 
    final EditText edit_text = (EditText) findViewById(R.id.editText1); 
    final View main_view = (View) findViewById(R.id.mainview); 
    main_view.setBackgroundDrawable(getResources().getDrawable(theme.background)); 
    edit_text.getBackground().setAlpha(theme.alpha); 
    edit_text.setTextColor(getResources().getColor(theme.color)); 
} 

И держать карту где-то, в котором вы храните эти темы:

Map<Integer, MyTheme> themes = new HashMap<>(); 
themes.put(1, new MyTheme(R.drawable.grey_background, 0, R.color.DrText)); 
// put other themes 

В вашем методе SetApplicableStyle вы можете просто использовать

public void SetApplicableStyle (DTypeActivity dTypeActivity, int theme, int font, int size) { 
    setTheme(dTypeActivity, themes.get(theme); 
    // set font and size similarly 
} 
+0

Я бы предложил только установить HashMap в отдельный метод 'lookupStyle' или что-то в этом роде и использовать его в методе' setApplicableStyle', так как я не вижу другого способа для доступа к карте из любого места. Если я объявляю карту в «OnCreate», у меня возникают проблемы с ее доступом из «OnResume», но мне она нужна в обоих. В любом случае, спасибо за эту идею. – wswld

+0

@VsevolodGlumov да, вы должны сделать карту глобально доступной как-то. Я проигнорировал это в своем ответе, потому что это полностью зависит от структуры вашего приложения. Я помню, что я использовал объект контекста глобального приложения, когда я когда-то делал приложение для Android, но это может вызвать проблемы, если процесс уничтожается для выпуска ресурсов. –