代码之家  ›  专栏  ›  技术社区  ›  Ruslanas BalčiÅ«nas

如何覆盖Android应用程序中的配置?

  •  3
  • Ruslanas BalčiÅ«nas  · 技术社区  · 8 年前

    已解决 (底部溶液)

    在我的活动中,我需要读取首选项,然后覆盖配置。在构造函数上下文中尚未就绪:

    尝试调用虚拟方法的java。lang.字符串android。所容纳之物上下文空对象引用上的getPackageName()'

    在里面 onCreate 太迟了:

    Java语言lang.IllegalStateException:getResources()已被调用

    引用自 上下文主题包装器 documentation :

    这个[ 应用OverrideConfiguration ]方法只能调用一次,并且必须在调用getResources()或getAssets()之前调用。

    什么是覆盖配置的正确时间和地点?

    代码摘录自我的当前 工作 解决方案如下。

    class OverrideActivity extends AppCompatActivity {
    
        // ...
    
        private boolean __overrideConf = false;
    
        @Override
        public Resources getResources() {
            if (!__overrideConf) {
                // ...
                // read shared preferences needs context
                // ...
                applyOverrideConfiguration(configuration);
                __overrideConf = true;
            }
            return super.getResources();
        }
    }
    

    解决方案 (重写受保护的方法 attachBaseContext )

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        applyOverrideConfiguration(new Configuration());
    }
    
    2 回复  |  直到 8 年前
        1
  •  7
  •   Ruslanas BalčiÅ«nas    8 年前

    解决方案 (重写受保护的方法 attachBaseContext )

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        // copypaste safe code
        applyOverrideConfiguration(new Configuration());
    }
    
        2
  •  -1
  •   Vibhuti    5 年前

    升级到appcompat 1.2.0解决了java的问题。lang.IllegalStateException:getResources()已被调用。 替换appcompat依赖项应用程序级生成。gradle带着这个

    dependencies {
       implementation 'androidx.appcompat:appcompat:1.2.0'
    }