Android:如何在调用onCreate之前设置静态值

时间:2011-09-07 14:48:22

标签: android

我希望在创建活动之前或至少在启动活动之前设置“选项”。如果有办法通过AndroidManifest做到这一点?考虑这个例子,我们有一个全局配置类,在onCreate中用来实例化一个对象(为简洁起见,不完全是OO)

public class Global {
    public static boolean visible = false;
}
public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // here is where we want the most up-to-date value of visible
        MyObject obj = new MyObject(Global.visible);
    }
}

显然,在这种情况下,“可见”将是“假的”。如果这是某种API库,我们希望为用户提供将“可见”设置为“true”的选项。

更新1

目标是将全局类放在预编译的库中,并由开发人员利用该库设置其值。我正在寻找开发人员在创建应用程序时执行此操作的最简单方法;我认为清单可能是要走的路,但我不知道如何通过xml注入“可见”的值。以下使用首选项的答案很好,但只涵盖用户的观点。

更新2 恕我直言,使用资源在这里效果最好。

<bool name="visible">true</bool>
public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // here is where we want the most up-to-date value of visible
        Resource res = getResource();
        MyObject obj = new MyObject(res.getBoolean(R.bool.visible));
    }
}

3 个答案:

答案 0 :(得分:1)

我认为使用SharedPreferences会使用Global.visible作为默认值来执行您要查找的内容。然后,如果用户将其更改为true,则会使用该值。

boolean makeVisible = PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
  "MyVisiblePreference",
  Global.visible);
MyObject obj = new MyObject(makeVisible);

要在不重新编译或设置(通过“首选项”活动)的情况下允许首选项可更新,您可以从resources加载默认首选项:

<bool name="MyVisiblePreference">true</bool>

以类似方式引用它:

boolean makeVisible = PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
   "MyVisiblePreference",
   getResources().getBoolean(R.bool.MyVisiblePreference));

如果开发者未将偏好设置为false,则默认为true(基于resources值)。

答案 1 :(得分:0)

对于简单对象,您可以像这样创建它们:(基于您的代码示例)

public static boolean visible = false;

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // here is where we want the most up-to-date value of visible
        MyObject obj = new MyObject(Global.visible);
    }
}

对于更复杂的对象,您可以使用static initializer进行初始化,如下所示:

public static boolean visible;

static {
    visible = false;
}

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // here is where we want the most up-to-date value of visible
        MyObject obj = new MyObject(Global.visible);
    }
}

答案 2 :(得分:0)

您可以继承android.app.Application,此类包含您可以覆盖的方法onCreate。您的子类必须在AndroidManifest.xml的{​​{1}}中定义。在创建应用程序中的所有其他组件之前(在任何<application name="YourApplication">onCreate之前)调用应用程序的Activity