2016-07-13 1 views
7

Я хочу дать пользователю возможность выбрать, какой цвет кожи будет иметь приложение. Например, я реализую черную кожу с черными цветами с различными тональностями, а также с белой кожей с тональными чертами.Как дать пользователю возможность переключаться между цветами разных цветов в вашем приложении

Какой наилучший способ достижения этого?

Например, я знаю, что в Android есть файл colors.xml, который должен содержать цвета вашего приложения. Каким образом можно иметь два файла цветов или что-то в этом роде и использовать их в зависимости от выбора пользователя? Может быть, файл styles.xml?

Скажите, пожалуйста, Ваше мнение о том, какие whould быть лучшим подходом для достижения этой цели

Спасибо

МОЙ ВИД:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <!-- The main content view --> 
    <RelativeLayout 
     android:id="@+id/main_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <android.support.v4.view.ViewPager 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <android.support.v4.view.PagerTitleStrip 
       android:id="@+id/pager_title_strip" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="top" 
       android:paddingTop="4dp" 
       android:paddingBottom="4dp" 
       style="@style/CustomPagerTitleStrip"/> 
     </android.support.v4.view.ViewPager> 
    </RelativeLayout> 
    <!-- The navigation drawer --> 
    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/drawer_header" 
     app:menu="@menu/drawer_menu" 
     style="@style/NavigationDrawerStyle"/> 
</android.support.v4.widget.DrawerLayout> 

Мой styles.xml файл:

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat"> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
     <item name="actionBarTheme">@style/CustomActionBar</item> 
     <item name="android:textColor">@color/colorFontMenus</item> 
     <item name="itemTextColor">@color/colorFontMenus</item> 
     <item name="itemIconTint">@color/colorFontMenus</item> 
    </style> 

    <style name="CustomActionBar"> 
     <!-- title text color --> 
     <item name="android:textColorPrimary">@color/colorFontMenus</item> 
     <!-- subtitle text color --> 
     <item name="android:textColorSecondary">?android:textColorPrimary</item> 
     <!-- action menu item text color --> 
     <item name="actionMenuTextColor">?android:textColorPrimary</item> 
     <!-- action menu item icon color - only applies to appcompat-v7 icons :(--> 
     <item name="colorControlNormal">?android:textColorPrimary</item> 
    </style> 

    <style name="CustomPagerTitleStrip"> 
     <item name="android:background">@color/mainColorWithAlpha</item> 
    </style> 

    <style name="CustomTextView"> 
     <item name="android:textColor">@color/colorFontContent</item> 
    </style> 

    <style name="CustomScrollBar"> 
     <item name="android:scrollbarThumbVertical">@drawable/scrollbar_green</item> 
    </style> 

    <style name="CustomDrawerHeader"> 
     <item name="android:background">@drawable/drawer_header_background_green</item> 
    </style> 

    <style name="NavigationDrawerStyle"> 
     <item name="android:background">@color/colorPrimaryDark</item> 
    </style> 

</resources> 
+0

У меня нет всех подробностей, чтобы опубликовать правильный ответ, но просто чтобы дать руководство: используйте его со стилем/темой. Здесь вы можете найти, как изменить между ними во время выполнения. Http://stackoverflow.com/questions/19125163/apply-a-theme-to-an-activity-in-android – Budius

+0

@NullPointerException Фактически я делаю это в своем приложении, но Я не изменю целую тему. Я просто изменяю цвет 'Statusbar', цвет панели инструментов, цвет Fab и любой другой цвет, независимо от того, что я хочу программно на основе значения цвета в' SharedPreferences'. Если вы хотите, я могу дать вам мой код. Но если вы хотите проверить sth, я могу предложить вам посмотреть: [android-change-app-theme-runtime] (https://www.linkedin.com/pulse/android-change-app-theme-runtime-ali- muzaffar) –

+0

@ NullPointerException Я написал объяснение о том, как получить это, также опубликовал некоторые источники, чтобы вы могли получить более широкие знания по этому вопросу. –

ответ

1

Это должно быть сделано в стилях/AppTheme.xml

Можно только изменить тему деятельности в методе onCreate() и что только до того, как был вызван super(). Изменение темы довольно прямо вперед, что-то вроде ниже, должны это сделать:

setTheme(someBooleanFlag ? R.style.AppThemeOne : R.style.AppThemeTwo);

Подробнее здесь:

Ali Muzaffar's Medium post on this

Styles and Themes

Material Theme

+0

Joaquim Ley некоторые элементы не могут быть изменены внутри пользовательского стиля «AppTheme» и должны быть изменены внутри других пользовательских стилей, например CustomActionBar, CustomPagerTitleStri p, CustomScrollBar ... и т. Д. Как переключиться на другой цвет кожи на эти пользовательские стили? Я редактировал свой вопрос, добавляя свой файл styles.xml и мой файл макета. – NullPointerException

+0

Вы можете назначить новый стиль своим 'OtherCustomStyle parent =" AppTheme "' –

3

по подбору ng в ответ @Joaquim Ley мы можем изменить тему до super.onCreate().

В моем приложении (на работе) Мой styles.xml:

Это моя тема

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="android:colorAccent">@color/colorPrimary</item> 
    <item name="android:statusBarColor">@color/colorPrimaryDark</item> 
    <item name="android:colorFocusedHighlight">@color/colorPrimary</item> 
    <item name="android:colorControlNormal">@color/amber_300</item> 
    <item name="android:colorControlActivated">@color/amber_300</item> 
    <item name="android:colorControlHighlight">@color/colorControlHighlight</item> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
    <item name="android:windowTranslucentStatus">false</item> 
    <item name="actionBarItemBackground">?attr/selectableItemBackground</item> 
    <item name="colorControlHighlight">@color/colorControlHighlight</item> 
    <item name="android:windowContentTransitions">true</item> 
    <!-- Customize your theme here. --> 
</style> 

по умолчанию А это мой Green Theme:

<style name="AppTheme.Green" parent="AppTheme"> 
    <item name="colorPrimary">@color/green_500</item> 
    <item name="colorPrimaryDark">@color/green_700</item> 
    <item name="android:colorAccent">@color/green_300</item> 
    <item name="android:statusBarColor">@color/green_700</item> 
    <item name="android:colorFocusedHighlight">@color/green_500</item> 
    <item name="android:colorControlNormal">@color/green_300</item> 
    <item name="android:colorControlActivated">@color/green_300</item> 
</style> 

При смене темы:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mPrefs=getSharedPreferences(getResources().getString(R.string.preference_name),MODE_PRIVATE); 
    mEditor=mPrefs.edit(); 
    mEditor.apply(); 
    defaultColor=mPrefs.getInt(getResources().getString(R.string.default_color),0); 
    //you can do some switch case or if else of defaultColor and change theme 
    setTheme(R.style.AppTheme_Green); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_voice_record); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
} 

Это мое первое приложение в работе, но в моем личном приложении я создал BaseActivity и создал метод handleColor(int color,int darkcolor). Но это не изменит Целую тему только Toolbar, StatusBar, NavigationBar и EditText маркера и подчеркивают цвета:

public class BaseActivity extends AppCompatActivity { 

public void handleColor(int color,int darkcolor){ 
    //changing toolbar color 
    if(getSupportActionBar()!=null){ 
     getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color)); 
    } 

    //if bigger than Api 21 change status bar color 
    if(isLolipop()){ 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     window.setStatusBarColor(darkcolor); 
    } 
} 

public boolean isLolipop(){ 
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; 
    } 

} 

При смене цвета я использую материал Диалоги Color Picker.Образец apk: sample.apk и Github: material-dialogs. Если вы хотите посмотреть, как это выглядит, я могу дать вам видео моего приложения.

Цвета из: Material Color Palette

В любом случае я знаю 2 другой подход, если вы хотите один из них я могу объяснить больше.

@Edit : Хорошие новости для вас, я нашел этот репортаж Github: app-theme-engine и его работа хорошая. Вы можете попробовать образец apk. Если вы не можете импортировать его через gradle, попробуйте это: compile 'com.github.naman14:app-theme-engine:[email protected]'

+0

Привет. Спасибо. Можно изменить используемые цвета с помощью файла colors.xml? Это может быть гораздо более эффективным, чем эти два подхода. Например, используя два файла colors.xml или две группы цветов в файле colors.xml с одинаковыми именами для каждого цвета в обеих группах. Это возможно? – NullPointerException

+0

@NullPointerException для вашего первого вопроса: я никогда не видел/не слышал ни одного разработчика, который использует много 'colors.xml', для вашего второго вопроса: вы можете использовать имена цветов только один раз. Но вы можете прочитать эту страницу: [UiModeManager] (https://developer.android.com/reference/android/app/UiModeManager.html) и попытаться реализовать ночной режим. –

+0

Еще один пример: некоторые элементы не могут быть изменены внутри пользовательского стиля «AppTheme» и должны быть изменены внутри других пользовательских стилей, например CustomActionBar, CustomPagerTitleStrip, CustomScrollBar ... и т. Д. Как вы применяете эти пользовательские стили? – NullPointerException

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