2016-12-21 4 views
7

Я знаю, что этот вопрос задавали несколько раз. но я не могу найти проблему в моем случае. Я хочу изменить тему приложения, но мой цветPrimary, colorAccent и т. Д. Не меняются.setTheme не меняет цвета темы

my MainActivity расширяет BasicActivity. это выглядит следующим образом:

public class MainActivity extends BasicActivity { 
    public static String MY_PREFS = "MY_PREFS"; 
    private SharedPreferences mySharedPreferences; 
    int prefMode = Activity.MODE_PRIVATE; 

    private Toolbar toolbar; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private ViewPagerAdapter adapter; 
    private TextView tabOne, tabTwo, tabThree; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

} 
} 

это мой BasicActivity (в данном случае я сделал это еще проще, чтобы показать, что тема взята из R.style):

public class BasicActivity extends AppCompatActivity { 

    public static String MY_PREFS = "MY_PREFS"; 
    int prefMode = Activity.MODE_PRIVATE; 



    protected void onCreate(Bundle savedInstanceState) { 


     JsonParser parser = new JsonParser(getApplicationContext()); 

     int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName()); 
     setTheme(R.style.c_2ecc71_BC6C2B); 


     if (android.os.Build.VERSION.SDK_INT >= 19) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

     } 

     super.onCreate(savedInstanceState); 

    } 

} 

и мой XML:

<style name="c_2ecc71_BC6C2B" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">#2ecc71</item> 
    <item name="colorPrimaryDark">#1ebc61</item> 
    <item name="colorAccent">#BC6C2B</item> 
</style> 

Согласно предыдущим вопросам, этот код должен работать, но в моем случае взгляды, которые colorPrimary в их XML еще грузятся цвета старой темы в InstEd на новом, даже если я установить тему Befo re call setContentView(R.layout.activity_main);

Спасибо!

+1

Вы жестко закодированное тему в BaseActivity, чем получение ссылочного идентификатора ресурса. Вам нужно поставить setTheme (value_from_resourceId); BaseActivity всегда вызывает setTheme (R.style.c_2ecc71_BC6C2B); , чем время выполнения – Stallion

ответ

1

Не уверен, что если вы действительно хотите, чтобы установить его программно, но вы можете попробовать это: How to setTheme to an activity at runtime? It doesn't work call setTheme before onCreate and setContentView

Если вы хотите, чтобы установить его для всего приложения, это может быть проще/очиститель, чтобы установить его в Файл AndroidManifest.xml.

<application android:theme="@style/CustomTheme"> 

Кроме того, я бы избегал использовать имя стиля, в котором есть значения. Точка использования стиля заключается в том, чтобы избежать жесткого кодирования значений и позволить им настраиваться и повторно использоваться. Что делать, если вы хотите изменить colorPrimary, вы также собираетесь изменить свое имя стиля?

+0

Я хочу, чтобы иметь возможность изменять его динамически во время выполнения – Max

+0

Да, это объясняет первая ссылка в ответе. Вы должны сделать это, как этот код: public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setTheme (android.R.style.Theme_Translucent_NoTitleBar); // Установить здесь setContentView (...) } –

0

Чтобы установить тему во время выполнения вы можете использовать следующую строку кода:

setTheme (android.R.style.Theme_Name);

и напишите его перед вызовом метода setContentView() и super.onCreate() внутри метода onCreate().

+0

Уже пробовал .. – Max

1

В файле манифеста убедитесь, что правильная тема к деятельности ....

1

Если вы хотите изменить этот вид материала во время выполнения, вы должны вставить все те "setTheme (android.R.style.Theme_Name);" методы внутри runonUiThread, например:

public class BasicActivity extends AppCompatActivity { 

public static String MY_PREFS = "MY_PREFS"; 
int prefMode = Activity.MODE_PRIVATE; 



protected void onCreate(Bundle savedInstanceState) { 


    JsonParser parser = new JsonParser(getApplicationContext()); 

    int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName()); 

    runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 

        setTheme(R.style.c_2ecc71_BC6C2B); 
        } 
       }); 

    recreate(); 
    if (android.os.Build.VERSION.SDK_INT >= 19) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

    } 

    super.onCreate(savedInstanceState); 

} 

} 

и позвонить заново (после)!

Согласно Android -

недействительного Recreate() Причины этой активности будет воссоздана с новым экземпляром.Это приводит, по существу, к тому же потоку, что и при создании Activity из-за изменения конфигурации - текущий экземпляр перейдет через свой жизненный цикл в onDestroy() и затем создаст новый экземпляр, созданный после него.

+0

не работает ..... – Max

3

При использовании фрагментов, то они будут игнорировать значение, установленное в OnCreate(), если переопределить метод getTheme(), он будет использоваться в пределах фрагментов, а также:

Ответил на разных вопрос: Change Activity's theme programmatically

@Override 
public Resources.Theme getTheme() { 
    Resources.Theme theme = super.getTheme(); 
    theme.applyStyle(R.style.c_2ecc71_BC6C2B, true); 
    return theme; 
} 

Используйте его в MainActivity или ваш BasicActivity в зависимости от того, где вы хотите его применить. Вам больше не нужно будет менять его в onCreate.

+0

это именно то, что мне нужно –

1

Просто измените свою BasicActivity и MainActivity, как показано ниже, и создайте соответствующую тему. Вы можете использовать общие предпочтения для проверки состояния темы во время приложения.

BasicActivity .java

public abstract class BasicActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    try { 
     if (getLayoutID() != 0) { 
      setContentView(getLayoutID()); 
     } 
    } catch (Exception ex) { /* ... */ } 

    final boolean THEME_DARK = true;// read appropriate value from SP or any other storage 

    Toolbar toolbar; 
    if ((toolbar = getToolbar()) != null) { 
     if (THEME_DARK/* check theme type here*/) { 
      toolbar.setPopupTheme(R.style.c_2ecc71_BC6C2B); 
     } 
     try { 
      setSupportActionBar(toolbar); 
     } catch (NoClassDefFoundError e) { 
      // Toast 
      finish(); 
     } 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
     window.setStatusBarColor(getResources().getColor(R.color.colorPrimary)); 
    } 
} 

public abstract Toolbar getToolbar(); 

public abstract int getLayoutID(); 

}  

MainActivity.java

public class MainActivity extends BasicActivity { 

    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public Toolbar getToolbar() { 
     return toolbar == null ? toolbar = (Toolbar) findViewById(R.id.toolbar) : toolbar; 
    } 

    @Override 
    public int getLayoutID() { 
     return R.layout.activity_main; 
    } 
    } 
1

Вы жестко закодированы тему в BaseActivity, а не получать идентификатор ресурса целенаправленные.

Вам нужно положить setTheme(value_from_resourceId);

В настоящее время BaseActivity всегда вызывает независимо от значения, которое вы разобранного

setTheme(R.style.c_2ecc71_BC6C2B); 

чем отсылая значение времени выполнения