如何正确获取Context到扩展Fragment的类?

时间:2016-08-15 10:46:04

标签: java android android-fragments android-resources android-context

我在Android中绝对是新手,我发现了一些与上下文有关的事情。

所以我有一个实用程序类,它包含一个实用程序方法,可以创建并返回 Bitmap 图像,这是我的类的代码:

public class ImgUtility {

    /**
     * Method that create the images related to the difficulty of a recepy
     * @param context
     * @param difficulty that represent the number of chef_hat_ok into the final image
     * @return a Bitmap representing the difficult of a recepy
     */
    public static Bitmap createRankingImg(Context context, int difficulty) {

        // Create a Bitmap image starting from the star.png into the "/res/drawable/" directory:
        Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.chef_hat_ok);


        // Create a new image bitmap having width to hold 5 star.png image:
        Bitmap tempBitmap = Bitmap.createBitmap(myBitmap.getWidth() * 5, myBitmap.getHeight(), Bitmap.Config.RGB_565);

        /* Attach a brand new canvas to this new Bitmap.
           The Canvas class holds the "draw" calls. To draw something, you need 4 basic components:
           1) a Bitmap to hold the pixels.
           2) a Canvas to host the draw calls (writing into the bitmap).
           3) a drawing primitive (e.g. Rect, Path, text, Bitmap).
           4) a paint (to describe the colors and styles for the drawing).
         */
        Canvas tempCanvas = new Canvas(tempBitmap);

        // Draw the image bitmap into the cavas:
        tempCanvas.drawBitmap(myBitmap, 0, 0, null);
        tempCanvas.drawBitmap(myBitmap, myBitmap.getWidth(), 0, null);
        tempCanvas.drawBitmap(myBitmap, myBitmap.getWidth() * 2, 0, null);
        tempCanvas.drawBitmap(myBitmap, myBitmap.getWidth() * 3, 0, null);
        tempCanvas.drawBitmap(myBitmap, myBitmap.getWidth() * 4, 0, null);

        return tempBitmap;

    }

}

正如您所看到的,此类包含 createRankingImg ,它将上下文对象作为参数并使用它来创建图像。此对象用于从资源中检索图像(进入 BitmapFactory.decodeResource()方法)。究竟是什么将 Context 对象直接表示为Android应用程序?

我知道要将上下文纳入活动类,我可以使用 getResources()方法。

我的问题是我必须将上下文输入到一个执行 Fragment 的类中。

我有这样的事情:

public class ScreenSlidePageFragment extends Fragment {

    .......................................................................
    .......................................................................
    .......................................................................

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        .....................................................................
        .....................................................................
        .....................................................................

        switch (mPageNumber + 1) {

            case 1:
                imgSlideView.setImageResource(R.drawable.carbonara);
                ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.carbonara));

                ImageView difficultyContainerImageView1 = (ImageView) rootView.findViewById(R.id.difficultyContainer);

                difficultyContainerImageView1.setImageDrawable(new BitmapDrawable(getResources(),     ImgUtility.createRankingImg(getApplicationContext(), 3)));

                break;

        .....................................................................
        .....................................................................
        .....................................................................

        }

        return rootView;
}

我的问题是,在前一个片段类中,我调用方法

ImgUtility.createRankingImg(getResources(), 3)

传递 getResources()输出(我认为给我上下文,IDE会给我以下错误消息:

  

错误的第一个参数类型。找到:'android.content.res.Resources',   必需:'android.content.Context'

所以在我看来,在一个扩展 Fragment 而不是 Activity 的类中, getResources()方法返回资源对象而不是 Context 对象(与Activity类一样)。这是真的吗?为什么呢?

如何在扩展片段的类中获取上下文?究竟什么代表了Android应用中的上下文

4 个答案:

答案 0 :(得分:0)

如果你在一个片段中,你可以打电话给getActivity()。请确保在onActivityCreated回调后调用它,否则该函数将返回null

答案 1 :(得分:0)

有两种方法可以从Fragment类访问资源。 对于您的实用程序方法,您需要将Fragment#getContext()方法作为参数调用。

请注意,您可以通过此方法Fragment#getResources()

直接访问资源类

答案 2 :(得分:0)

仅使用onCreateView创建根视图并获取子视图的实例:

private ImageView difficultyContainerImageView1;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_layout, container, false);
        difficultyContainerImageView1 = (ImageView) rootView.findViewById(R.id.difficultyContainer);
        return rootView;
}

使用onViewCreated设置内容。您可以在getContext中自由调用 getActivity onViewCreated方法:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        difficultyContainerImageView1.setImageDrawable(
                      new BitmapDrawable(getResources(), 
                               ImgUtility.createRankingImg(getContext(), 3)));

}

答案 3 :(得分:-1)

什么是上下文 这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动活动,广播和接收意图等 (请阅读https://developer.android.com/reference/android/content/Context.html

获取上下文,你可以使用getactivity方法,它将返回活动,然后从那里你可以得到它的上下文,比如

Context context = getActivity().getApplicationContext()