2015-10-24 6 views
2

В Android Studio я объявил некоторые пользовательские стили с некоторыми пользовательскими атрибутами, как следующие два:Динамически извлекать пользовательские стили объявлены в «styles.xml»

<resources> 

<!-- Base application theme. --> 
<style name="AppThemeBlueDark" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/AppThemeBlueDarkColorPrimary</item> 
    <item name="colorPrimaryDark">@color/AppThemeBlueDarkColorPrimaryDark</item> 
    <item name="colorAccent">@color/AppThemeBlueDarkColorAccent</item> 
    <item name="android:colorBackground">@color/AppThemeBlueDarkBackground</item> 

    <item name="my_type">my_theme</item> 
    <item name="my_id">0</item> 
    <item name="my_name">Dark Blue</item> 
    <item name="my_default">true</item> 
</style> 

<style name="AppThemeBlueLight" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/AppThemeBlueLightColorPrimary</item> 
    <item name="colorPrimaryDark">@color/AppThemeBlueLightColorPrimaryDark</item> 
    <item name="colorAccent">@color/AppThemeBlueLightColorAccent</item> 
    <item name="android:colorBackground">@color/AppThemeBlueLightBackground</item> 

    <item name="my_type">my_theme</item> 
    <item name="my_id">1</item> 
    <item name="my_name">Light Blue</item> 
    <item name="my_default">false</item> 
</style> 

</resources> 

Теперь я хочу, чтобы создать пользовательский класс Java который может извлекать все мои определенные стили без предварительного знания о том, сколько они и их имена; что-то вроде:

public class ThemeChanger { 

// Populate myThemes 
public void ThemeChanger() { 
    TypedArray theme_res = R.style.getStyleNames(); 
} 
} 

}

Очевидно, что метод "getStyleNames()" чистая фантазия!

Возможно ли это в какой-то мере?

Конечной целью является создание универсального многоразового класса, который сможет управлять и изменять темы приложения, просто определяя темы в стандартном «styles.xml», но с этими настраиваемыми атрибутами, без необходимости изменять класс если я решит использовать разные темы/имена.

Большое спасибо за любую помощь.

ответ

1

я нашел решение (возможно, не самый элегантный) с помощью Java Reflection:

import java.lang.reflect.Field; 

public class ThemeChanger { 

ThemeChanger(Context context){ 
    Field[] myFields; 
    String myFullNameStyle; 
    String myNameStyle; 

    // Get all styles using reflection 
    myFields = R.style.class.getFields(); 
    // Drill in into single style resource 
    for (int i=0; i<myFields.length; i++) { 
     myFullNameStyle = myFields[i].toString(); 
     if (myFullNameStyle.length()>0) { 
      int pos = myFullNameStyle.lastIndexOf('.'); 
      if (pos!=-1) { 
       myNameStyle = myFullNameStyle.substring(pos + 1); 
       myNameStyle = myNameStyle.replace('_', '.'); 
       int myStyleId = context.getResources().getIdentifier(myNameStyle, "style", context.getPackageName()); 
       if (myStyleId != 0) { 
        int myTypeId[] = {R.attr.my_type}; 
        String myType = context.obtainStyledAttributes(myStyleId, myTypeId).getString(0); 
        if (myType == "my_theme") { 
         // Do all things with other custom attrs, 
         // like populating a array to use with a menù 
        } 
       } 
      } 
     } 
    } 
} 
} 

Во всяком случае, спасибо за ваши усилия.

0

Нет, вы делаете это совершенно неправильно.

Заканчивать документации здесь - Create Custom View

Все, что вам нужно сделать, это в этой ссылке. Следуйте за ним точно. Ваши пользовательские атрибуты должны быть в пределах <declare-styleable>, и вы укажете эти атрибуты через TypedArray в своем коде.

Таким образом, вы должны следовать этому документу слово за слово

+0

Несомненно, я ошибаюсь, но я не понимаю вашего ответа. Я не хочу применять этот стиль к пользовательскому представлению. Эти стили предназначены для тем. То, что я хочу сделать, - создать экземпляр этого класса в onCreate() основного действия. В конструкторе этого класса я хочу получить все стили, у которых есть пользовательский attr «my_type» = «my_theme», а затем получить их имена, my_id, my_name и my_default в массив. Этот массив будет использоваться для выбора menù для динамического изменения темы приложения. Таким образом, я могу повторно использовать этот класс во всех моих проектах без каких-либо изменений. Еще раз спасибо. –

Смежные вопросы