【问题标题】:Android Studio refresh the activity and display the current fragmentAndroid Studio 刷新 Activity 并显示当前 Fragment
【发布时间】:2020-07-31 00:12:00
【问题描述】:

我刚开始使用 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);
    }
}

【问题讨论】:

  • 添加您在 onCreate 中显示片段的代码

标签: java android android-studio android-fragments onresume


【解决方案1】:

您应该调用recreateonCreate 方法,而不是使用相同的Activity 开始新的,您必须在初始化默认片段之前检查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
        }
    }

【讨论】:

  • 感谢您的回答,效果很好!我在模拟器上遇到了问题,当我使用它时,语言并不总是完全改变,它只在当前片段上发生了变化,但是当我点击另一个片段时,它又回到了以前的语言。但我在物理设备上试过了,它按我想要的方式工作,非常感谢!
  • 如果你使用 androidx appcompat 可能是这个库的错误。你可以搜索一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多