Бесконечная л oop после смены темы - PullRequest
0 голосов
/ 26 февраля 2020

на панели инструментов моего приложения есть действие «изменить тему». Когда пользователь выбирает его, отображается диалоговое окно с двумя вариантами: светлая тема и темная тема. каждый меняет тему приложения. но когда я выбираю один, активность воссоздается и возвращается на первое место. тема не меняется. это метод 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();
}

}

1 Ответ

0 голосов
/ 26 февраля 2020

Вы можете изменить тему деятельности до того, как будет вызван super.onCreate Например:

@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()
}
...