更改主题后无限循环
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()
}
在我的应用程序的工具栏中有 '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()
}