Force RTL layout direction not working for app

后端 未结 2 1129
南方客
南方客 2020-12-14 16:49

I\'m trying to add RTL language support in my app (specifically Arabic right now). I\'ll be supporting English as well. What I\'ve done:

  • Set minSdkVersion to 1
2条回答
  •  孤城傲影
    2020-12-14 17:25

    Try this...

    1. Create a class to maintain global application state.

      public class YourGlobalClass extends Application {
      
        @Override
        public void onCreate() {
        updateLanguage(this, null);
        super.onCreate();
        }
      
      public static void updateLanguage(Context ctx, String lang) {
      
       Configuration cfg = new Configuration();
       LocalSharedManager manager = new LocalSharedManager(ctx);
       String language = manager.GetValueFromSharedPrefs("force_locale");
      
          if (TextUtils.isEmpty(language) && lang == null) {
             cfg.locale = Locale.getDefault();
             String tmp_locale = "";
             tmp_locale = Locale.getDefault().toString().substring(0, 2);
             manager.SaveValueToSharedPrefs("force_locale", tmp_locale);
      
         } else if (lang != null) {
             cfg.locale = new Locale(lang);
             manager.SaveValueToSharedPrefs("force_locale", lang);
      
         } else if (!TextUtils.isEmpty(language)) {
             cfg.locale = new Locale(language);
         }
         ctx.getResources().updateConfiguration(cfg, null);
        }
      
      }
      
    2. Specify global class to your AndroidManifest.xml's tag, which will cause that class to be instantiated with your saved locale, when the process for your application/package is created. Like, android:name="com.your.package.YourGlobalClass" android:supportsRtl="true"

    3. Create following two methods in your MainActivity.java (wherever you want).

      public class MainActivity extends ActionBarActivity{
      
         .......
      
         // Implement OnclickListener for english_locale button
         findViewById(R.id.english_locale).setOnClickListener(new OnClickListener()
           {
      
              @Override
              public void onClick(View v)
              {
                  changeEnglish();
              }
           });
      
          // Implement OnclickListener for arabic_locale button
          findViewById(R.id.arabic_locale).setOnClickListener(new OnClickListener()
             {
      
                @Override
                public void onClick(View v)
                 {
                    changeArabic();
                  }
             });
      
          /**
          * Method that Update UI for Arabic locale.
          */
          public void changeArabic() {
               new AsyncTask() {
      
               @Override
               protected Void doInBackground(Void... params) {
                    String app_locale = "ar";
                    Locale locale = new Locale(app_locale);
                    Locale.setDefault(locale);
      
                    //Configuration to query the current layout direction.
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getResources().updateConfiguration(config,
                      getResources().getDisplayMetrics());
                    Bidi bidi = new Bidi(app_locale,
                      Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
                    bidi.isRightToLeft();
                    YourGlobalClass.updateLanguage(getActivity(), "ar");
      
                    //Refreshing current fragment
      
                    Intent i = getActivity().getIntent();
                    startActivity(i);
                    getActivity().finish();
                 return null;
                }
      
             }.execute();
           }
      
              /**
              * Method that Update UI for Default(English) locale.
              */
            public void changeEnglish() {
      
                new AsyncTask() {
      
                @Override
                protected Void doInBackground(Void... params) {
                    String app_locale = "en";
                    Locale locale = new Locale(app_locale);
                    Locale.setDefault(locale);
      
                    //Configuration to query the current layout direction.
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getResources().updateConfiguration(config,
                      getResources().getDisplayMetrics());
                    Bidi bidi = new Bidi(app_locale,
                      Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
                    bidi.isLeftToRight();
                    YourGlobalClass.updateLanguage(getActivity(), "en");
      
                    //Refreshing current fragment
                    Intent i = getActivity().getIntent();
                    startActivity(i);
                    getActivity().finish();
      
                return null;
                }
      
             }.execute();
           }
      
         ......
        //MainActivity end
      }
      
    4. Happy coding...

提交回复
热议问题