2011-06-21 42 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