2011-11-23 20 views
51

Trong đơn xin của tôi, tôi có nhiều lớp học và hoạt động. Droid là một lớp không có ngữ cảnh. Mygame là một lớp mở rộng SurfaceView và triển khai SurfaceHolder.Callback. Tôi đang tạo một đối tượng của Droid trong lớp mygame và thiết lập hình nền và vị trí cho nó. Mã tôi đã viết cho điều này được đưa ra dưới đây.Cách gọi hàm getResources() từ một lớp không có ngữ cảnh?

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

Phương thức khởi tạo của lớp Droid được đưa ra dưới đây.

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

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

Trong một kịch bản đặc biệt tôi phải thiết lập các hình nền và vị trí của đối tượng Droid từ lớp Droid itself.Here tôi đang phải đối mặt với issue.Given dưới đây là đoạn mã để làm điều này.

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

Vấn đề là lớp Droid không có ngữ cảnh. Vì vậy, tôi không thể sử dụng getResources() tại đây. Tôi đã thử mã dưới đây nhưng nó bị treo.

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

Ai cũng có thể giúp tôi. Tôi chỉ muốn thiết lập hình nền và định vị nó cho đối tượng Droid từ chính lớp Droid.

+1

thể trùng lặp của [Sử dụng getResources() trong lớp không hoạt động] (http://stackoverflow.com/ câu hỏi/7666589/sử dụng-getresources-in-non-hoạt động-class) –

Trả lời

46

Một Bối cảnh là một xử lý cho hệ thống; nó cung cấp các dịch vụ như giải quyết tài nguyên, có được quyền truy cập vào cơ sở dữ liệu và sở thích, v.v. Nó là một "giao diện" cho phép truy cập vào các tài nguyên ứng dụng cụ thể và lớp và thông tin về môi trường ứng dụng. Các hoạt động và dịch vụ của bạn cũng mở rộng Ngữ cảnh để họ kế thừa tất cả các phương thức đó để truy cập thông tin môi trường mà ứng dụng đang chạy.

Điều này có nghĩa là bạn phải chuyển ngữ cảnh đến lớp cụ thể nếu bạn muốn nhận/sửa đổi một số thông tin cụ thể về tài nguyên. Bạn có thể vượt qua bối cảnh các nhà xây dựng như

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

là nó có thể thiết lập bối cảnh cho lớp Droid ... nó không phải là mở rộng hoạt động hoặc bất kỳ lớp học khác –

+2

nó không cần phải mở rộng một hoạt động. Bạn có thể chuyển ngữ cảnh cho lớp này khi khởi tạo lớp này từ một số hoạt động. – Ali

28

Giải pháp thông thường cho điều này là chuyển một thể hiện ngữ cảnh cho lớp khi bạn tạo nó, hoặc sau khi nó được tạo lần đầu tiên nhưng trước khi bạn cần sử dụng ngữ cảnh.

Một giải pháp khác là tạo đối tượng ứng dụng với phương pháp tĩnh để truy cập ngữ cảnh ứng dụng mặc dù cặp đôi đối tượng Droid khá chặt chẽ vào mã.

Chỉnh sửa, ví dụ thêm

Hoặc sửa đổi các lớp Droid trở thành một cái gì đó như thế này

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

Hoặc tạo ra một cái gì đó ứng dụng như thế nà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(); 
    } 
} 

Và gọi App. context() bất cứ nơi nào bạn cần một ngữ cảnh - lưu ý tuy nhiên không phải tất cả các chức năng đều có sẵn trên một ngữ cảnh ứng dụng, một số chỉ là avai lable trên một bối cảnh hoạt động nhưng nó chắc chắn sẽ làm với nhu cầu của bạn cho getResources().

Xin lưu ý rằng bạn sẽ cần phải thêm android: tên để định nghĩa ứng dụng của bạn trong manifest, một cái gì đó của bạn như thế này:

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

Usind bitmap android cũng cung cấp khớp nối chặt chẽ với mã android. Tôi thường cố gắng tách biệt mã liên quan đến giao diện và công cụ cụ thể (tôi không phải là người thành công) –

+0

@zeetoobiker ... bạn có thể giải thích những điều này không? I ddnt get you..i không quen thuộc với android. –

+0

Tôi đã không thực sự có nghĩa là khớp nối chặt chẽ với mã Android (giả sử bạn đã cho nó truy cập vào đối tượng Application với một phương thức tĩnh), thay vì lớp Droid sẽ được kết hợp chặt chẽ với dự án mà nó đang ở - bạn sẽ không có thể sử dụng nó trong một dự án khác mà không cần phải viết lại nội bộ. Thành thật mà nói, một lớp học trong một ứng dụng Android đối phó với các chức năng hiển thị sẽ được kết hợp chặt chẽ với Android vì vậy tôi sẽ không lo lắng về điều đó. – zeetoobiker

22

Ví dụ: Bắt app_name chuỗi:

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

Điều này chỉ sử dụng tài nguyên Hệ thống, không phải tài nguyên Ứng dụng - mà trong 99% trường hợp sẽ không hoạt động – Adam

+0

vâng ... điều này cũng không có tác dụng đối với tôi. Tôi cần phải truy cập vào tài nguyên của ứng dụng để có một bản dịch enum thành chuỗi và không tìm thấy chúng. Đã kết thúc việc phải tạo một hàm được ánh xạ enum thành tài nguyên và sử dụng Hoạt động như đã nói ở đâu đó trong bài đăng này. –

1

này luôn luôn làm việc cho tôi:

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... 

} 

Không liên quan đến câu hỏi này nhưng ví dụ sử dụng một Phân đoạn để truy cập tài nguyên/hoạt động của hệ thống như sau:

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

Nó có thể dễ dàng được thực hiện nếu u đã tuyên bố một lớp học kéo dài từ ứng dụng

Lớp này sẽ giống như một singleton, vì vậy khi u cần một bối cảnh u có thể lấy nó chỉ như thế này:

tôi nghĩ rằng đây là câu trả lời tốt hơn và sạch hơn

đây là mã của tôi từ tiện ích trọn gói:

public static String getAppNAme(){ 
    return MyOwnApplication.getInstance().getString(R.string.app_name); 
} 
Các vấn đề liên quan