我在设置页面中有一个切换按钮。切换可将语言从英语切换为法语。它适用于将所有标签更改为法语,但标签栏保持不变。
我创建了一个单例类,并按如下方式调用它:
Singleton.getInstance().changeTabLang();
这是获取我的MainActivity的一个实例并调用此函数:
public void changeTabLang(){
tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
for (int i = 0; i < tabHost.getTabWidget().getTabCount(); i++) {
((TextView) tabHost.getTabWidget().getChildAt(i)).setText(R.string.loginTab);
}
}
这是我的单身人士:
public class Singleton {
private static MainActivity instance = null;
private Singleton() { }
public static MainActivity getInstance() {
if (instance == null) {
if (instance == null) {
instance = new MainActivity ();
}
}
return instance;
}
}
问题是无法找到我的tabHost
,因为我的MainActivity视图不可用。
如何获取MainActivity的视图以获取我的tabHost?
由于
答案 0 :(得分:2)
问题是我的tabHost无法找到,因为我的视图 MainActivity不可用。
由于两个原因,您的单例实现不正确。首先,您从不自己实例化Activity
,这是Android系统应该做的事情。如果你自己实例化Activity
它永远不会进入生命周期回调,所以没有它的视图。其次,你永远不应该使用静态Activity
引用,因为你冒泄漏的风险。
如何获取MainActivity的视图以获取我的tabHost?
您不应该尝试从外部访问Activity
的视图或内容(由于Android系统的工作方式,当您尝试访问时,该活动也可能已经死亡)。相反,您应该在某处设置一些标志或其他需要更新的标志(并设置Activity
进行任何更新)。例如,您可以为应用创建自定义Application
类,并在那里设置语言更改更新:
/**
* register the custom application class in your manifest under the
* application tag with android:name="your.package.CustomApplication"
**/
public class CustomApplication extends Application {
public static final int ENGLISH_LANGUAGE = 0x3333;
public static final int FRENCH_LANGUAGE = 0x4444;
private int currentLanguage = ENGLISH_LANGUAGE;
public int getCurrentLanguage() {
return currentLanguage;
}
public void setCurrentLanguage(int currentLanguage) {
this.currentLanguage = currentLanguage;
}
}
然后,当您的用户设置新语言时,您将执行以下操作:
((CustomApplication)getApplicationContext()).setCurrentLanguage(CustomApplication.FRENCH_LANGUAGE);
然后任何其他Activity
都可以通过以下方式查看当前的设置语言:
((CustomApplication)getApplicationContext()).getCurrentLanguage();
并更改内容(这将在onResume()
方法中完成,该方法将在Activity
对用户可见之前调用。
答案 1 :(得分:0)
我没有为单身人士或tabhost尝试这个,但是如何适应这个,这适用于我的应用程序中的textview?
how access activity view from other activity class
总结一下,我这样做了:
在MainActivity中:
public static string fred="";
... onResume() {
TextView frederick = (TextView) findViewById(R.id.status_text); //status_text is a textview in my xml
frederick.setText(fred);
}
在其他活动中:
MainActivity.fred="updating fred";
它完全适用于我的应用程序,正如我所说,我不知道您的特定情况是否会导致此操作无效。