更改应用中的标签名称

时间:2013-08-02 16:26:42

标签: android singleton

我在设置页面中有一个切换按钮。切换可将语言从英语切换为法语。它适用于将所有标签更改为法语,但标签栏保持不变。

我创建了一个单例类,并按如下方式调用它:

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?

由于

2 个答案:

答案 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";

它完全适用于我的应用程序,正如我所说,我不知道您的特定情况是否会导致此操作无效。