3

私には3つの活動があります。メイン アクティビティ、設定アクティビティ、セットアップ アクティビティ

メインは設定を開き、セットアップを開きます。

セットアップ アクティビティで、SharedPreferences に保存する言語をユーザーに変更させます

Main と Settings には、SharedPreference の変更のリスナーがあります。

変更時に、これらのアクティビティ (メインと設定) を再作成します。すべてのテキストは新しい言語で表示されますが、アクション バーのタイトルは消えており、デバイスの回転後にのみ (正しい言語で) 再表示されます。setTitle でタイトルを設定しても機能せず、getTitle は正しいテキストを返します。目に見えないだけです。

デバイスを回転させずに ActionBar のタイトルを強制的に表示する方法についてのアイデアはありますか?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    ctx = getBaseContext();

    Language.loadLocale(ctx);
    setContentView(R.layout.activity_main);
    act = this;
    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);


    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
            activeTab = position;
        }
    });


    actionBar.addTab(
            actionBar.newTab()
                    .setText(R.string.title_tab1_active_order_name)
                    .setTabListener(this));

    actionBar.addTab(
            actionBar.newTab()
                    .setText(R.string.title_tab2_history_name)
                    .setTabListener(this));

    actionBar.addTab(
            actionBar.newTab()
                    .setText(R.string.title_tab3_tools_name)
                    .setTabListener(this));

    listenOnLangChange();


}

private void listenOnLangChange(){
    //handles language changes
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

    listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            // Implementation
            if (key.equals("setLanguageKey")){
                Configuration config = Language.loadLocale(ctx);
                onConfigurationChanged(config);
            }
        }
    };

    prefs.registerOnSharedPreferenceChangeListener(listener);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    act.recreate();
}

言語クラスから:

public static Configuration changeLang(String lang, Context ctx)
{

    String languageToLoad  = lang; // your language
    Locale locale = new Locale(languageToLoad);

    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;

    ctx.getResources().updateConfiguration(config,
            ctx.getResources().getDisplayMetrics());

    Log.d("CHANGE", languageToLoad);

    return config;
}


public static Configuration loadLocale(Context ctx)
{
    String langPref = "setLanguageKey";
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    String language = prefs.getString(langPref, "");
    Log.d("LOAD", language);

    return changeLang(language, ctx);
}
4

1 に答える 1

1

アクションバーにカスタムビューを追加して解決する必要がありました。それは機能しますが、おそらく最善の解決策ではありません。

public static void setActionbarTitle(Activity act, String title){
    ActionBar actionBar = act.getActionBar();

    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);

    LayoutInflater inflator = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflator.inflate(R.layout.actionbar_title_layout, null);

    TextView tv = (TextView) v.findViewById(R.id.tv_actionbar_title);
    tv.setText(title);
    tv.setTextColor(Color.WHITE);

    actionBar.setCustomView(v);
}
于 2013-08-12T09:07:17.600 に答える