2013-08-02 37 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。