2011-11-23 39 views
51

在我的應用程序中,我有很多課程和活動。 Droid是一個沒有上下文的類。 Mygame是一個擴展SurfaceView並實現SurfaceHolder.Callback的類。 我在mygame類中創建了一個Droid對象,併爲它設置了背景圖像和位置。我爲此編寫的代碼如下所示。如何從沒有上下文的類中調用getResources()?

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10); 

Droid類的構造函數如下所示。

public Droid(Bitmap bitmap, int x, int y) { 

    this.bitmap = bitmap; 
    this.x = x; 
    this.y = y; 
} 

在一個具體方案中,我必須從itself.Here我面臨以下issue.Given德羅伊德類設置在Droid對象的背景圖像和位置是代碼片段來做到這一點。

if(checkflag) 
{ 
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos); 
} 

問題是Droid類沒有上下文。所以我不能在這裏使用getResources()。我試過下面的代碼,但它崩潰。

if(checkflag) 
{ 
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos); 
} 

任何人都可以幫助我。我只想設置背景圖像並將其定位到Droid類本身的Droid對象。

+1

可能重複(http://stackoverflow.com/ 76666589 /使用getresources-in-non-activity-class) –

回答

46

上下文是一個句柄系統;它提供的服務包括解析資源,獲取數據庫和首選項等等。它是一個「接口」,允許訪問特定於應用程序的資源和類以及有關應用程序環境的信息。您的活動和服務還將Context擴展爲繼承所有這些方法以訪問運行該應用程序的環境信息。

這意味着如果您想獲取/修改關於資源的某些特定信息,您必須將上下文傳遞給特定的類。 您可以在構造函數中傳遞上下文像

public classname(Context context, String s1) 
{ 
... 
} 
+0

是否可以爲Droid類設置上下文......它不是擴展活動或任何其他類 –

+2

它不需要擴展活動。從某些活動初始化此類時,您可以將上下文傳遞給此類。 – Ali

28

對此的正常解決方案是在您創建上下文時,或者在首次創建它之後,但在需要使用上下文之前,將該上下文的實例傳遞給該類。

另一種解決方案是使用靜態方法創建一個Application對象來訪問應用程序上下文,儘管它將Droid對象非常緊密地耦合到代碼中。

編輯,實例添加

要麼修改的Droid類是這樣的

public Droid(Context context,int x, int y) { 
    this.bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.birdpic); 
    this.x = x; 
    this.y = y; 
    } 

或創建一個應用程序是這樣的:

public class App extends android.app.Application 
{ 
    private static App mApp = null; 
    /* (non-Javadoc) 
    * @see android.app.Application#onCreate() 
    */ 
    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     mApp = this; 
    } 
    public static Context context() 
    { 
     return mApp.getApplicationContext(); 
    } 
} 

並調用應用程序。 context()無論你需要一個上下文 - 但是請注意,並不是所有的函數都可以在應用上下文中使用,有些只是avai標籤在活動上下文中,但它肯定會滿足您對getResources()的需求。

請注意,您需要添加機器人:在你的清單,這樣的命名你的應用程序定義:

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:name=".App" > 
+0

Usind android位圖還提供了緊密耦合到android代碼。我通常嘗試分離接口相關的代碼和特定的應用程序(我不是成功的) –

+0

@zeetoobiker ...你能解釋這些東西嗎?我ddnt讓你..我不熟悉android。 –

+0

我並不是真正意味着與Android代碼的緊密耦合(假設您使用靜態方法爲應用程序對象授予訪問權限),而是將Droid類緊密耦合到當前的項目中 - 您將不會能夠在不重寫內部部件的情況下在不同的項目中使用它。說實話,處理顯示功能的Android應用中的類將與Android緊密結合,所以我不擔心這一點。 – zeetoobiker

22

例子:獲取APP_NAME字符串:

Resources.getSystem().getString(R.string.app_name) 
+15

這隻使用系統資源,而不是應用程序資源 - 在99%的情況下,它不會工作 – Adam

+0

是的......這對我也不起作用。我需要獲取應用程序資源,以便將enum轉換爲字符串,並且找不到這些資源。最後必須創建一個將enum映射到資源的函數,並使用本文中其他地方討論的Activity。 –

1

這總是對我的作品:

import android.app.Activity; 
import android.content.Context; 

public class yourClass { 

Context ctx; 

public yourClass (Handler handler, Context context) { 
super(handler); 
    ctx = context; 
} 

//Use context (ctx) in your code like this: 
block1 = new Droid(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic), 100, 10); 
//OR 
builder.setLargeIcon(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic)); 
//OR 
final Intent intent = new Intent(ctx, MainActivity.class); 
//OR 
NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
//ETC... 

} 

用都沒有涉及這個問題,但如一個片段來訪問像這樣的系統資源/活動:

public boolean onQueryTextChange(String newText) { 
Activity activity = getActivity(); 
Context context = activity.getApplicationContext(); 
returnSomething(newText); 
return false; 
} 

View customerInfo = getActivity().getLayoutInflater().inflate(R.layout.main_layout_items, itemsLayout, false); 
itemsLayout.addView(customerInfo); 
0

如果u已宣佈,從應用擴展一個類可以很容易做到

這個類就會像一個單身的,所以當u需要上下文u能得到它,就像這樣:

我認爲這是更好的答案和清潔

這裏是我的代碼應用程序包:使用getResources()在非活性類]的

public static String getAppNAme(){ 
    return MyOwnApplication.getInstance().getString(R.string.app_name); 
} 
相關問題