it-swarm.com.ru

setTheme не меняя цвета темы

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

моя 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);

}
}

это моя базовая активность (в данном случае я сделал еще проще показать, что тема взята из 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, по-прежнему загружают цвета старой темы вместо новой, даже если я установил тему перед вызовом setContentView(R.layout.activity_main);

Спасибо!

9
Max

Вы пытаетесь расширить одну из более новых тем Android (выше API 21). В дополнение ко всем ответам выше, вы можете поместить свою тему в styles.xml (v21).

Более подробная информация здесь https://developer.Android.com/training/material/compatibility.htmlenter image description here

4
BMU

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

Ответил на другой вопрос: Изменить тему Активности программно

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

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

4
Björn Kechel

Если вы хотите изменить такие вещи во время выполнения, вы должны вставить все эти "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 -

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

1
omriherman

Не уверен, если вы действительно хотите установить это программно, но вы можете попробовать это: Как установитьTheme для действия во время выполнения? Это не работает, вызовите setTheme перед onCreate и setContentView

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

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

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

1
Scott Merritt

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

1
tapsey

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

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

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

setTheme(R.style.c_2ecc71_BC6C2B);

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

1
Sreehari

Просто измените ваши 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
young

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

setTheme (Android.R.style.Theme_Name);

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

0
Sharanjeet Kaur