1

我的设置页面中有一个开关。切换将语言从英语切换到法语。它可以将所有标签更改为法语,但标签栏保持不变。

我创建了一个单例类并像这样调用它:

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?

谢谢

4

2 回答 2

2

问题是我的 tabHost 找不到,因为我的 MainActivity 的视图不可用。

您的单例实现不正确有两个原因。首先,您永远不会自己实例化 an 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

于 2013-08-07T05:39:18.890 回答
0

我还没有为单例或标签主机尝试过这个,但是如何调整它,它适用于我的应用程序中的文本视图?

如何从其他活动类访问活动视图

总结一下,我是这样做的:

在 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";

它非常适合我的应用程序,因为我说我不知道​​您的特定场景是否会导致这不可行。

于 2013-08-06T21:18:32.693 回答