2011-06-21 45 views
4

是否有可能开展的任何活动之前得到设备的宽高比?的getContext没有活动

我根据我的设备是否被标识为“长”或“not_long”试图设置宽度。这应该在活动启动很久之前可用,但我不确定我可以在哪里获得此变量。此方法执行时,活动不可用。另外为了避免内存泄漏,我不想将活动传递到包含以下方法的类中。

这里是失败的调用方法:

public int getDefaultWidth() { 
     Configuration myConfig = new Configuration(); 
     myConfig.setToDefaults(); 
     myConfig = getResources().getConfiguration(); 

     switch (myConfig.screenLayout & Configuration.SCREENLAYOUT_LONG_MASK) { 

      case Configuration.SCREENLAYOUT_LONG_NO: { 
       return this._defaultWidth; 
      } 
      case Configuration.SCREENLAYOUT_LONG_YES: { 
       return this._defaultWidthLong; 
      } 
      case Configuration.SCREENLAYOUT_LONG_UNDEFINED: { 
       return this._defaultWidth; 
      } 
     } 
     return this._defaultWidth; 
    } 

回答

0

您的应用程序的应用程序上下文的任何活动之前创建的。一个应用程序有一个有效的上下文,所以你可以用它来获取你需要什么,设置静态或者成员变量,然后引用,在你的第一个活动。

应用程序上下文可以通过添加扩展应用一个新的类,使在AndroidManifest.xml中的小变化进行处理

清单:

<application android:enabled="true"... 
    android:name=".Foo"> 
... 
</application> 

添加新类到您的项目扩展应用:

public class Foo extends Application { 

private int mWidth; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    // do stuff to set mWidth using the Application context like: 
    // mWidth = getResources().getConfiguration().blahblahblah 
} 

public int getWidth() { 
    return mWidth; 
} 

从您的活动,只需这样做是为了获得宽度:

int width = ((Foo)getApplication()).getWidth(); 
+0

是的,这正是我所做的。谢谢。除了我们有一个正在初始化的全局CustomApplication类,并且我设置了初始化我的类的宽度和高度。 – dropsOfJupiter

0

这哪里是在执行?我没有看到你如何执行代码,也没有从Context中继承的实例。服务从Context继承,BroadcastReceiver的onReceive被赋予Context。

此外,强似一个语境中,你可以只通过在从那里过这种方法被称为配置对象。

+0

你是对的。我找到了起点。它是因为启动我的课程的文件是静态的,我无论如何都无法获得上下文。所以我在初始化过程中调用了这个类,并且能够传递活动上下文。谢谢。 – dropsOfJupiter

0

当你调用从活动中这种方法。你可以传递“this”作为getDefaultWidth()方法的参数。然后,您可以将其用作上下文。

public int getDefaultWidth(Context context) { ... } 

,并在activitym这样称呼它

int width = getDefaultWidth(this) 
+0

除了我的课程没有在活动中调用。这是问题所在。 COntext不可用,因为启动它的类是静态的。所以我需要首先在父类上设置上下文,然后通过它将上下文传递给我的类。感谢您的帮助。 – dropsOfJupiter