Android Studio 刷新 activity 并显示当前片段
Android Studio refresh the activity and display the current fragment
我刚刚开始使用 android 工作室,如有任何错误,请多多包涵。我正在尝试使用微调菜单切换应用程序的语言。我已经找到了一些方法来做到这一点,但我试图简化它并看看我是否可以仅通过使用 onOptionsItemSelected 方法来实现。一切正常,应用程序中的语言发生变化,但前提是我在此 activity 中加载另一个片段。我一直在寻找如何刷新 activity 的解决方案,以便用户不必单击任何其他按钮即可看到语言已更改。我想出了一个解决方案来完成 activity 并打算再次启动它,但问题就在这里开始了。 activity 重新启动,但它显示了我在 onCreate 方法上分配的默认片段。我不知道如何让它加载用户当前看到的片段。如果我能让 activity 从 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;
}
很遗憾,我不能只刷新片段。整个 activity 必须刷新,否则导航抽屉不会更改语言,它会保留以前的语言。
编辑:这是 onCreate 中的代码,我在这段代码的末尾添加了片段。但它是主片段,所以每当我用我的方法“刷新”activity 时,它都会加载相同的片段。
@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
而不是使用相同的 Activity 开始新的,并且在 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
}
}
我刚刚开始使用 android 工作室,如有任何错误,请多多包涵。我正在尝试使用微调菜单切换应用程序的语言。我已经找到了一些方法来做到这一点,但我试图简化它并看看我是否可以仅通过使用 onOptionsItemSelected 方法来实现。一切正常,应用程序中的语言发生变化,但前提是我在此 activity 中加载另一个片段。我一直在寻找如何刷新 activity 的解决方案,以便用户不必单击任何其他按钮即可看到语言已更改。我想出了一个解决方案来完成 activity 并打算再次启动它,但问题就在这里开始了。 activity 重新启动,但它显示了我在 onCreate 方法上分配的默认片段。我不知道如何让它加载用户当前看到的片段。如果我能让 activity 从 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;
}
很遗憾,我不能只刷新片段。整个 activity 必须刷新,否则导航抽屉不会更改语言,它会保留以前的语言。
编辑:这是 onCreate 中的代码,我在这段代码的末尾添加了片段。但它是主片段,所以每当我用我的方法“刷新”activity 时,它都会加载相同的片段。
@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
而不是使用相同的 Activity 开始新的,并且在 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
}
}