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 のビューが利用できないため、my が見つからないことです。

tabHost を取得するために MainActivity のビューを取得するにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

問題は、MainActivity のビューが利用できないため、tabHost が見つからないことです。

シングルトンの実装は、2 つの理由で正しくありません。まず、自分で をインスタンス化することActivityはありません。これは、Android システムが行うべきことです。自分でをインスタンス化するActivityと、ライフサイクル コールバックに入らないため、ビューがありません。第二に、静的Activity参照はリークのリスクがあるため、絶対に使用しないでください。

tabHost を取得するために MainActivity のビューを取得するにはどうすればよいですか?

外部からのビューまたはコンテンツにアクセスしようとしないでください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 に答える