Saltar al contenido

Forzar la dirección de diseño RTL no funciona para la aplicación

Contamos con tu apoyo para difundir nuestras crónicas en referencia a las ciencias informáticas.

Solución:

El error más oscuro de la historia. Como mencioné en la pregunta, la mayor parte de este código fue heredado. Terminó siendo un problema del operador bit a bit que estaba arruinando las banderas de la aplicación. &= estaba siendo utilizado en lugar de & para comprobar si se ha establecido una bandera.

Como se señaló en los comentarios, el código se tomó de un ejemplo en una publicación de blog de desarrolladores de Android, lo que explica por qué tantos otros se han encontrado con este mismo problema. Presenté un informe de error y, desde entonces, la publicación del blog se actualizó silenciosamente. Aquí está el código original, que eliminé. &= de. No utilice el siguiente código tal como está. Necesitas cambiar &= a &:

isDebuggable = (appContext.getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0;

Prueba esto…

  1. Cree una clase para mantener el estado de la aplicación global.

    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. Especifique la clase global para su AndroidManifest.xml, que hará que se cree una instancia de esa clase con su configuración regional guardada, cuando se cree el proceso para su aplicación/paquete. Me gusta, android:name="com.your.package.YourGlobalClass" android:supportsRtl="true"

  3. Crea los siguientes dos métodos en tu MainActivity.java (donde quieras).

    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. Feliz codificación…

Acuérdate de que tienes la capacidad de agregar una reseña .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *