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
我对这个问题有疑问: 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