更改主题后无限循环

Infinite loop after change theme

在我的应用程序的工具栏中有 'change theme' action.when 用户 select 它,显示的对话框有两个 option:light 主题和深色主题。每个更改应用程序的主题。但是当我 select 一个时,activity 重新创建并且 Returns 到第一位。主题不变。 这是 onCreate() 方法

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

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    drawer = findViewById(R.id.drawer);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this,
            drawer,
            toolbar,
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);

    drawer.addDrawerListener(toggle);
    toggle.syncState();

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Note note = new Note();
            note.setText("text");
            note.setTitle("title");
            NoteLab.get(NoteListActivity.this).addNote(note);
            Intent intent = NoteEditActivity.newIntent(NoteListActivity.this, note);
            startActivity(intent);
        }
    });

    recycler = findViewById(R.id.recycler_view);
    recycler.setLayoutManager(new LinearLayoutManager(this));

    updateUI();

和 updateUI():

public void updateUI() {
     mNotes = NoteLab.get(this).getNotes();

    if (mAdapter == null) {
        mAdapter = new NotesAdapter(mNotes, this);
        recycler.setAdapter(mAdapter);
    } else {
        mAdapter.setNotes(mNotes);
        mAdapter.notifyDataSetChanged();
    }
}

显示对话框:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.action_settings:
            startActivity(new Intent(this, PreferencesActivity.class));
            return true;
        case R.id.action_themes:
            DialogFragment dialog = new ThemesDialog();
            dialog.show(getSupportFragmentManager(), "tag");

        default:
            return super.onOptionsItemSelected(item);
    }
}

这是我更改主题的地方:

public class ThemesDialog extends DialogFragment {

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    String[] strings = getResources().getStringArray(R.array.themes);
    return new AlertDialog.Builder(getActivity())
            .setItems(strings, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    getActivity().setTheme(R.style.DarkTheme);
                }
            })
            .create();
}

}

您可以在调用 super.onCreate 之前更改 activity 主题 例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
  // get flag from sharedPreferences
  if(flag){
      setTheme(R.style.YourFirstTheme)
  } else {
      setTheme(R.style.YourSecondTheme)
  }

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // ...
  // other stuff 
  // ...
}

在你的对话框中 onClick:

@Override
public void onClick(DialogInterface dialog, int which) {
    // save your appropriate them in SharedPreferences before calling  
    // before calling below line
    getActivity().recreate()
}