我刚开始使用android studio,请原谅我的错误。我正试图通过使用微调器菜单来切换应用程序的语言。我已经找到了一些方法来实现这一点,但我试图简化它,看看是否可以通过使用onOptionsItemSelected方法来实现。一切都很好,应用程序中的语言也发生了变化,但前提是我在这个活动中加载了另一个片段。我一直在寻找一个如何刷新活动的解决方案,这样用户就不必点击任何其他按钮就能看到语言发生了变化。我想出了一个解决方案来完成活动,并打算重新开始,但问题开始了。活动重新启动,但它显示了我在onCreate方法上分配的默认片段。我不知道如何让它加载用户当前看到的片段。如果我能让活动从onResume方法开始加载,而不是再次从onCreate开始加载,那就太好了,我认为它会显示当前片段。有可能做到这一点吗?有没有其他简单的方法可以让它用新语言显示当前片段?也许没有简单的方法,我应该重新开始?请帮帮我。这就是我尝试过的:
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
Configuration configuration = new Configuration();
Intent intent = new Intent();
switch (item.getItemId()){
case R.id.action_polski:
Locale localePl = new Locale("pl");
Locale.setDefault(localePl);
configuration.locale = localePl;
getBaseContext().getResources().updateConfiguration(configuration,getBaseContext().getResources().getDisplayMetrics());
finish();
startActivity(new Intent(this, MainActivity.class));
overridePendingTransition(0, 0);
break;
case R.id.action_english:
Locale localeEn = new Locale("en");
Locale.setDefault(localeEn);
configuration.locale = localeEn;
getBaseContext().getResources().updateConfiguration(configuration,getBaseContext().getResources().getDisplayMetrics());
finish();
startActivity(new Intent(this, MainActivity.class));
overridePendingTransition(0, 0);
break;
}
return true;
}
不幸的是,我不能只是刷新片段。必须刷新整个活动,因为否则导航抽屉不会更改语言,而是保持以前的语言。
编辑:这是onCreate中的代码,我在这段代码的末尾添加了片段。但这是家的碎片,所以每当我"刷新";我的方法的活动加载了相同的片段。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hideSystemUI();
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.bringToFront();
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new HomeFragment()).commit();
navigationView.setCheckedItem(R.id.nav_home);
}
}
您不应该用相同的"活动"开始新的活动,而应该调用recreate
,并且在onCreate
方法中,您必须在初始化默认片段之前检查savedInstanceState == null
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
Configuration configuration = new Configuration();
Intent intent = new Intent();
switch (item.getItemId()){
case R.id.action_polski:
Locale localePl = new Locale("pl");
Locale.setDefault(localePl);
configuration.locale = localePl;
getBaseContext().getResources().updateConfiguration(configuration,getBaseContext().getResources().getDisplayMetrics());
recreate()
break;
case R.id.action_english:
Locale localeEn = new Locale("en");
Locale.setDefault(localeEn);
configuration.locale = localeEn;
getBaseContext().getResources().updateConfiguration(configuration,getBaseContext().getResources().getDisplayMetrics());
recreate()
break;
}
return true;
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
// init default fragment
}
}