2016-02-15 78 views
0

我想添加主題到我的應用程序。爲此,我添加了顏色選擇器對話框。如何動態設置主題?

當用戶將選擇從應用程序應該改變的顏色選擇器的主題顏色,我想改變導航欄和浮動按鈕的顏色。

我如何動態設置的主題?

謝謝。

編輯:

設置活動。

public class Settings extends AppCompatActivity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 


     final ColorPickerDialog colorPickerDialog = new ColorPickerDialog(); 
     colorPickerDialog.initialize(R.string.dialog_title, new int[]{Color.CYAN, Color.LTGRAY, Color.BLACK, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.GRAY, Color.YELLOW}, Color.YELLOW, 3, 2); 
     colorPickerDialog.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener() { 

      @Override 
      public void onColorSelected(int color) { 


       Toast.makeText(Settings.this, "selectedColor : " + color, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     LinearLayout theme = (LinearLayout)findViewById(R.id.theme); 

     theme.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       colorPickerDialog.show(getSupportFragmentManager(), "colorpicker"); 
      } 
     }); 
    } 

} 

回答

1

您可以在活動中使用setTheme()並重新創建活動
OR
您可以使用您的活動setTheme()和手動設置的顏色(工具欄背景,晶圓廠顏色,狀態欄的顏色),如果你確切地知道,哪些顏色你想改變。

注意setTheme()動態設置的主題,但它不會重新繪製你的活動。因此,setTheme()之後的所有內容都已使用您的新主題! (可以在Lollipop/Marchmallow的最近應用列表中看到 - >即使沒有重新創建活動,應用頂部的顏色也會在setTheme()之後更改)。

好像沒有辦法動態創建一個主題。所以我建議只提供選擇預定義的主題(使用XML)並應用這些主題。完全動態變色的解決方法是自行更改所有元素的顏色。我給我寫了一個爲工具欄和操作欄執行此操作的方法。因此,繼承人的方法中,基於所述enum Colors {RED, GREEN, BLUE}

private void setColors(COLORS color) { 
    int toolbarColor = 0; 
    int statusbarColor = 0; 
    switch (color) { 
     case GREEN: 
      setTheme(R.style.AppTheme_NoActionBar_Green); 
      toolbarColor = R.color.green; 
      statusbarColor = R.color.greenDark; 
      break; 
     case RED: 
      setTheme(R.style.AppTheme_NoActionBar_Red); 
      toolbarColor = R.color.red; 
      statusbarColor = R.color.redDark; 
      break; 
     case BLUE: 
      setTheme(R.style.AppTheme_NoActionBar_Blue); 
      toolbarColor = R.color.blue; 
      statusbarColor = R.color.blueDark; 
      break; 
    } 
    mToolbar.setBackgroundColor(ContextCompat.getColor(MainActivity.this, toolbarColor)); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, statusbarColor)); 
    } 
} 

其中AppTheme.NoActionBar.Green,AppTheme.NoActionBar.Red和AppTheme.NoActionBar.Blue延伸AppTheme.NoActionBar和僅覆蓋原色,初級深色和口音顏色。

+0

請檢查編輯的問題。這是我的設置活動。你能指導一下那個代碼嗎?謝謝。 @Valentin Kuhn – user5881997

+0

對不起,我昨天沒有任何時間。 我再次查找它,它真的好像沒有辦法動態創建主題。我建議只給出不同的預定義主題(用XML定義)並應用這些主題。解決方法是手動設置顏色,但這不會真的改變主要/重音顏色... 我給我寫了一個方法來應用基於ENUM的不同主題(這裏是:RED,GREEN,BLUE),請參閱下一條評論 –

+0

無法將其放入評論中,而是編輯我的答案 –

0

您不能動態設置主題。你可以,但是,設置一個主題你叫setContentView之前,所以我建議你保存你的主題SharedPreferences,當用戶選擇新的主題,重新啓動活動並應用新的主題。

+0

你可以指導我一個這樣的例子? – user5881997

+0

活動有方法setTheme。在styles.xml中創建幾個主題資源,併爲該方法提供不同的主題。 –