0

Я абсолютно новый в 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() метод.

Моя проблема заключается в том, что я должен получить контекст в класс, который exetends Фрагмент.

У меня есть что-то вроде этого:

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 сообщит мне следующее сообщение об ошибке:

Неверный тип 1-го аргумента. Найдено: «android.content.res.Resources», требуется: «android.content.Context»

Так что, мне кажется, что в класс, который расширяет фрагмент и не активностьgetResources() метод return a Ресурсы объект вместо a Контекст объект (как сделано в класс Activity). Это правда? Зачем?

Как я могу получить контекст внутри класса, который расширяет Fragment? И что именно представляет собой Контекст в приложении для Android?

+2

Используйте getContext() вместо getResources(). Обратите внимание, getContext() может быть нулевым. –

+0

Если вы посмотрите на Android JavaDoc для объекта Context, он точно объяснит, что это такое. Вы также заметите, что классы активности расширяют контекст –

+0

При использовании 'getActivity' в коде фрагмента убедитесь, что вы правильно обрабатываете все события attach/detach, поэтому вы используете правильную активность (и не храните ее где-нибудь (плохая практика) , или сбой на «null», когда фрагмент отсоединен. Для доступа к ресурсам довольно часто достаточно контекста приложения, что является более разумным для хранения локально внутри фрагмента, что дает вам доступ к ним, даже если он отключен от активности (но все же лучший практика заключается в том, чтобы не полагаться на какой-либо сохраненный контекст, а работать с текущим, правильно управляя отдельным режимом). – Ped7g

ответ

0

Если вы находитесь во фрагменте, вы можете, например, позвонить getActivity(). Пожалуйста, убедитесь, что вы вызываете его после обратного вызова onActivityCreated, иначе функция вернет null.

0

Существует два способа доступа к ресурсам из класса Фрагмент. Для вашего метода утилиты вам необходимо вызвать метод Fragment#getContext() в качестве параметра.

Имейте в виду, что вы можете получить доступ непосредственно к классу ресурсов этим методом Fragment#getResources()

0

Создать BaseContext класс, отформатируйте его в Application классе

public final class BaseContext { 

    private static Context CONTEXT; 

    public static void initialise(Context context) { 
     CONTEXT = context; 
    } 

    public static Context getContext() { 
     synchronized (BaseContext.class) { 
      if (BaseContext.CONTEXT == null) 
       throw new NullPointerException("Base Context not initialised. Call BaseContext.initialise()"); 
      else 
       return BaseContext.CONTEXT.getApplicationContext(); 
     } 
    } 
} 

Сейчас в не Activity и не Fragment класса вы можете получить контекст, просто позвонив BaseContext.getContext();

0

Используйте onCreateView только для создания корневого представления и получения экземпляра subv iews:

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))); 

} 
-1

что контекст Это абстрактный класс, реализация которого обеспечивается Android системы. Это позволяет получить доступ к конкретному приложению ресурсов и классам, а также до-вызовов для операций на уровень приложений, такие как запуск деятельности, вещание и прием намерений и т.д. (читать в https://developer.android.com/reference/android/content/Context.html

)

для получения контекста , вы можете использовать метод getactivity, он будет возвращать активность и оттуда вы можете получить его контекст, что-то вроде

Context context = getActivity().getApplicationContext() 
Смежные вопросы