FragmentManager findFragmentByTag 在 Android 4.0.4 和 Android 4.4.2 上的不同行为

FragmentManager findFragmentByTag different behavior on Android 4.0.4 and Android 4.4.2

我对这个问题有疑问: https://code.google.com/p/android/issues/detail?id=13252

问题是更改 Android 设备的语言时,某些组件(例如 RadioButton 和 CheckBox)未更新为新语言。我有两个片段,FragmentA 和 FragmentB。在我的 FragmentActivity 中,我添加了 FragmentA。从 Fragment A 中,我添加了 FragmentB。我应用了一个变通方法,我调用一个方法 FragmentA 或 FragmentB 来明确地将语言设置为正确的语言。

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
 Fragment f = null;
   
 if ((f = fm.findFragmentByTag(FragmentB.TAG)) != null) {
  Log.e(TAG, FragmentB.TAG+ " is visible");
  ((FragmentB)f).refreshLocale();
 } else {
  Log.e(TAG, FragmentB.TAG+ " is NOT visible");
 }

 if ((f = fm.findFragmentByTag(FragmentA.TAG)) != null) {
  Log.e(TAG, FragmentA.TAG+ " is visible");
  ((FragmentA)f).refreshLocale();
        } else {
                Log.e(TAG, FragmentA.TAG+ " is NOT visible");
 }
    }
}

我上面所做的是在 Activity 恢复时通过它们的标签找到片段,然后在每个片段中调用 refreshLocale() 方法,以便应用正确的语言。修复有效,但在我的两个测试设备中存在行为不一致的情况。

在我的 Galaxy S5(4.4.2) 中,FragmentA 和 FragmentB 的语言都使用解决方法进行了更新。但是对于我的 Xperia Mini Pro (4.0.4),只有 FragmentB,即当前可见的 Fragment,被更新了。我将日志放入我的代码中,我发现 FragmentA 和 FragmentB 实际上都是可见的,我的代码到达了 FragmentA 的 refreshLocale() 方法,但不知何故文本仍然没有更新为新语言。

refreshLocale() 方法示例:

public void refreshLocale() {
    if (m_recallValues != null) {
        m_recallValues.setText(R.string.recall_values);
    }

    if (m_recallValuesRun != null) {
        m_recallValuesRun.setText(R.string.recall_run);
    }
}

对这个问题有什么想法吗? 谢谢。

那是因为 FragmentManager 您试图找到片段 B 的那个无法找到所述片段。片段 B 是从片段 A 开始的,因此使用 child FragmentManager。您应该改用片段 A 中的 getChildFragmentManager()

这可能有帮助:Child FragmentManager