2013-08-02 36 views
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无法找到,因为v查看我的MainActivity不可用。

如何获得我的MainActivity视图以获取我的tabHost?

感谢

回答

2

的问题是,我的tabHost无法找到,因为我 MainActivity认为是不可用的。

由于两个原因,您的单例执行不正确。首先,你自己永远不会实例化一个Activity,这是Android系统应该做的事情。如果您自己实例化Activity,它永远不会进入生命周期回调,因此无法查看它。其次,你不应该使用静态的Activity参考,因为你可能会泄漏它。

如何获取我的MainActivity视图以获取我的tabHost?

你不应该试图从它的外部访问的Activity的观点或内容(因为Android系统的工作方式,这种活动可能也死了,当您尝试访问它)。相反,你应该设置某个地方某个地方或其他需要更新的地方(并且设置Activity来做任何更新)。当你的用户设置了新的语言,你会做

/** 
* 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); 

然后任何其他例如,你可以创建一个自定义Application类你的应用程序,并设置有语言的变化更新Activity可以看到通过当前设置的语言:

((CustomApplication)getApplicationContext()).getCurrentLanguage(); 

和改变周围的东西(这将在onResume()方法T完成帽子将在Activity变得对用户可见之前被调用)。

+0

我只调用一次MainActivity来设置所有选项卡和其他一些东西。我如何更改onResume中的tabHost而不尝试在活动之外访问它?我应该再次启动MainActivity吗? – BigT

+0

@BigT在'onCreate()'方法的'MainActivity'中从'Application'类中获取当前语言。在MainActivity的'onResume()'方法中,再次检查Application类中的当前设置语言,看看它是否与您在'onCreate()'方法中首次看到的语言不同。如果是,那么语言会发生变化,并用新值更新您想要的内容。当用户在首选项中更改语言时,使用'setCurrentLanguage()'。当用户回来时,onResume方法会看到差异并自行更新。 – Luksprog

+0

那么,如果我只是''MainActivity'作为我的'tabHost'的设置,它不会再被调用。在它设置标签后,它会转到第一个标签,并将其称为自己的活动。 'onResume()'方法不会被调用。 – BigT

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

它的工作完美我的应用程序,因为我说我不知道​​你的特定场景是否会导致这种无法工作BLE。