在onCreate()之后以编程方式更改主题

时间:2017-10-18 18:47:38

标签: java android themes menuitem

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_create: //run NoteActivity in new note mode
            startActivity(new Intent(this, NoteActivity.class));
            break;
        case R.id.action_theme:
            setTheme(R.style.Theme2);
            setContentView(R.layout.activity_main);
            Intent i = getIntent();
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);

            // TODO: show settings activity

            break;
    }

    return super.onOptionsItemSelected(item);
}

我的活动顶部有一个菜单项。我想用它来按下时更改主题。我希望在用户启动程序后执行此操作,它最终将用于循环一堆不同的主题!现在我只想让它与一个人合作。我怎么能这样做?

我的回答

主要活动

SharedPreferences pref;
SharedPreferences.Editor editor;
int check;
int newcheck;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    pref = getApplicationContext().getSharedPreferences("test", Context.MODE_PRIVATE);
    check = pref.getInt("x", 0);
    if(check == 0){
        setTheme(R.style.AppTheme);
    }else{
        setTheme(R.style.Theme2);
    }

    setContentView(R.layout.activity_main);
    noteActivity = new NoteActivity();
    mListNotes = (ListView) findViewById(R.id.main_listview);
}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.action_create: //run NoteActivity in new note mode
                startActivity(new Intent(this, NoteActivity.class));
                break;
            case R.id.action_theme:
                pref = getApplicationContext().getSharedPreferences("test", Context.MODE_PRIVATE);
                editor = pref.edit();
                newcheck = pref.getInt("x",0);
                if(newcheck == 0) {
                    newcheck = 1;
                }else if(newcheck == 1){
                    newcheck = 0;
                }
                editor.clear();//clears the editor to avoid errors
                editor.putInt("x",newcheck);//add in new int
                editor.commit();//commit 

                //restart the activity
                Intent i = getIntent();
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                finish();//close activity - avoid crash
                startActivity(i);//start activity

                //TODO show settings activity
                break;
        }
        return super.onOptionsItemSelected(item);
    }

1 个答案:

答案 0 :(得分:1)

因此,只要我了解您的问题,您就可以考虑考虑选择父Activity并在其中设置Fragment,以便您可以更改{{1}的主题1}}更改主题的控件来自您的父Fragment。所以,这就是你如何实现这种行为。

  • Activity中获取一个片段容器,然后在Activity的{​​{1}}函数中启动该容器中的Fragment
  • 当您有一个菜单选项按钮来决定在onCreate中部署哪个主题时,您可以考虑在点击菜单选项时通过执行另一个片段交易来再次替换Activity
  • 您可以考虑在Fragment中保存所选主题,以便每次Fragment启动时,您都可以通过在SharedPreferences Fragment函数中设置主题来正确设置主题从onCreateView读取所选主题后。

现在,如果您正考虑如何在Fragment中设置主题,那么this post可能会对您有所帮助。为方便起见,我从那里复制代码。

SharedPreferences

我希望你已经有了这个想法。如果还有其他需要澄清的地方,请告诉我。