2016-07-13 19 views
7

Ich möchte dem Benutzer die Möglichkeit geben, welche Farbe Haut die App haben wird. Zum Beispiel, ich würde eine schwarze Haut mit schwarzen Farben mit verschiedenen Tonalitäten und auch eine weiße Haut mit weißen Tonalitäten implementieren.Wie Sie dem Benutzer die Möglichkeit geben zwischen verschiedenen Farben Haut in Ihrer App zu wechseln

Welches ist der beste Ansatz, um dies zu erreichen?

Zum Beispiel weiß ich, dass es eine Datei "colors.xml" in Android gibt, die die Farben Ihrer App enthalten sollte. Wäre eine Möglichkeit, zwei Farben Dateien oder etwas zu haben und die eine oder andere abhängig von der Benutzerauswahl zu verwenden? Vielleicht eine styles.xml Datei?

Bitte sagen Sie mir Ihre Meinung zu dem whould der beste Ansatz sein, diese

Danke

mein Layout zu erreichen:

<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> 

Meine styles.xml Datei:

<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

Ich habe nicht alle Details, um eine richtige Antwort zu posten, aber nur um eine Anleitung zu geben: Verwenden Sie es mit einem Stil/Thema. Hier können Sie finden, wie man zwischen ihnen zur Laufzeit http://stackoverflow.com/questions/19125163/apply-a-theme-to-an-activity-in-android – Budius

+0

@NullPointerException tatsächlich ich mache es in meiner Anwendung aber Ich ändere nicht das ganze Thema. Ich ändere nur 'Statusbar'-Farbe,' Toolbar'-Farbe, Fab-Farbe und jede andere Farbe, was auch immer ich will, programmatisch basierend auf einem Farbwert in 'SharedPreferences'. Wenn Sie möchten, kann ich Ihnen meinen Code geben. Aber wenn du etwas überprüfen willst, kann ich vorschlagen, dass du folgendes siehst: [android-change-app-theme-runtime] (https://www.linkedin.com/pulse/android-change-app-theme-runtime-ali- muzaffar) –

+0

@ NullPointerException Ich habe eine Erklärung geschrieben, wie man das bekommen kann, habe auch einige Quellen gepostet, damit man ein breiteres Wissen über die Sache haben kann. –

Antwort

1

Dies sollte in den Styles/AppTheme.xml

01 erfolgen

Es ist nur möglich, das Thema einer Aktivität in der onCreate() Methode zu ändern, und das nur, bevor super() aufgerufen wurde. Ändern das Thema recht geradlinig ist, so etwas wie unten sollte es tun:

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

Lesen Sie mehr hier:

Ali Muzaffar's Medium post on this

Styles and Themes

Material Theme

+0

Joaquim Ley einige Elemente können nicht geändert werden innerhalb "AppTheme" benutzerdefinierten Stil, und muss innerhalb anderer benutzerdefinierter Stile geändert werden, zum Beispiel CustomActionBar, CustomPagerTitleStri p, CustomScrollBar ... usw. Wie zu anderen Hautfarbe zu diesen benutzerdefinierten Stilen wechseln? Ich habe meine Frage bearbeitet, indem ich meine Datei styles.xml und meine Layoutdatei hinzugefügt habe. – NullPointerException

+0

Sie können einen neuen Stil mit Ihrem 'OtherCustomStyle parent =" AppTheme "' –

3

Regardi ng zu @Joaquim Leys Antwort können wir Theme vor super.onCreate() ändern.

In meiner app (bei der Arbeit) meine styles.xml:

Das ist meine Standard-Theme

<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> 

Und das ist mein Grün Thema:

<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> 

Beim Thema Wechsel:

@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); 
} 

Dies ist meine erste App in Arbeit, aber in meiner persönlichen App habe ich eine BaseActivity erstellt und eine Methode handleColor(int color,int darkcolor) erstellt. Aber das wird nicht ganzes Thema ändern, nur Toolbar, StatusBar, NavigationBar und EditText Marker und Farben unterstreicht:

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; 
    } 

} 

Wenn Farbwechsel i-Material Dialoge Color Picker verwenden.Beispiel apk: sample.apk und Github: material-dialogs. Wenn Sie sehen möchten, wie es aussieht, kann ich Ihnen ein Video meiner App geben.

Farben aus: Material Color Palette

Sowieso weiß, dass ich zwei anderen Ansatz, wenn Sie einer von ihnen möchte ich mehr erklären kann.

@Edit : Gute Nachrichten für Sie, ich fand dieses Github Repo: app-theme-engine und seine Arbeit gut. Sie können Probe apk versuchen. Wenn Sie es nicht über Gradle importieren können, versuchen Sie Folgendes: compile 'com.github.naman14:app-theme-engine:[email protected]'

+0

Hi zuweisen. Vielen Dank. Es ist möglich, die verwendeten Farben mit colors.xml Datei zu wechseln? Es sollte effizienter sein als diese beiden Ansätze. Verwenden Sie beispielsweise zwei colors.xml-Dateien oder zwei Gruppen von Farben in der Datei colors.xml mit denselben Namen für jede Farbe in beiden Gruppen. Ist das möglich? – NullPointerException

+0

@NullPointerException für Ihre erste Frage: Ich habe noch nie einen Entwickler gesehen oder gehört, der viele 'colors.xml' verwendet, für Ihre zweite Frage: Sie können Farbnamen nur einmal verwenden. Aber Sie können diese Seite lesen: [UiModeManager] (https://developer.android.com/reference/android/app/UiModeManager.html) und versuchen, den Nachtmodus zu implementieren. –

+0

Noch ein Gedanke, einige Elemente können nicht im benutzerdefinierten Stil "AppTheme" geändert werden und müssen innerhalb anderer benutzerdefinierter Stile geändert werden, z. B. CustomActionBar, CustomPagerTitleStrip, CustomScrollBar ... usw. Wie wenden Sie diese benutzerdefinierten Stile an? – NullPointerException