프래그먼트에서 컨텍스트 사용


664

조각으로 컨텍스트를 얻는 방법은 무엇입니까?

나는 누구의 생성자 맥락에서 소요 내 데이터베이스를 사용할 필요가 있지만, getApplicationContext()그리고 FragmentClass.this내가 무엇을 할 수 있는지 작동하지 않습니다?

데이터베이스 생성자

public Database(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

답변:


1313

을 사용 getActivity()하면 a와 관련된 활동이 반환 fragment됩니다.
활동은 context ( Activity확장 이후 Context) 입니다.


212
getActivity ()는 각 조각의 onAttach 전에 호출되면 null을 반환 할 수 있습니다.
— arne.jans

4
나는 메모리 누수에이 구글 블로그를 읽고 ...되었다 android-developers.blogspot.com/2009/01/... . getActivity () 메소드를 사용하면 앱이 메모리 누수의 위험에 노출되지 않습니까? 블로그는 getApplicationContext ()가 Fragment 클래스가 아닌 Activity 클래스에서만 작동하므로 실제로는 불가능한 "컨텍스트 활동 대신 컨텍스트 애플리케이션을 사용해보십시오"라고 제안합니다.
— Simon

40
분리 된 조각의 문제에 대한 해결책 getActivity().getApplicationContext()은 조각이 생성 될 때 인스턴스 변수에 값을 저장 한 다음 조각 클래스 내부에서 원할 때마다 해당 컨텍스트를 사용하는 것입니다. 그 맥락은 단편 분리에서도 살아남을 것입니다.
— Piovezan

8
응용 프로그램 컨텍스트를 전달하는 대신 Application 클래스 내에 정적 컨텍스트를 만들고 onCreate ()를 초기화하십시오. MyApplication.sContext = getApplicationContext (); 분리에 대한 걱정없이 모든 활동 / 조각에서 액세스 할 수 있습니다.
— Eduko

3
@milaniez : getActivity항상 사용 가능합니다. 그것은의 getContextAPI (23)에 추가 된
— mhsmith

130

위의 답변으로 수행하기 위해 onAttach조각화 방법을 재정의 할 수 있습니다 .

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}

3
onAttach가 아직 호출되지 않은 경우 getActivity ()가 null을 반환하므로 이것을 권장합니다.
— arne.jans

9
그러나 onAttach ()가 호출되면 뷰가 없습니다. 따라서 뷰가있는 작업은 아직 수행 할 수 없습니다!
— Zordid

2
@iambox 대신에 DatabaseHelper필요 하다면 ? 예를 들어, ...FragmentActivityActivityAdapter
— Jago

4
활동에 대한 참조를 저장 한 경우onAttach(Activity activity)onDetach()
— vovahost

3
onAttach방법은 사용되지 않습니다Overrides deprecated method in 'android.support.v4.app.Fragment'
— 무하마드 Saqib을

24

항상 getActivity () 메소드를 사용 하여 첨부 된 활동의 컨텍스트를 가져 오십시오. 그러나 한 가지만 기억하십시오. 프래그먼트는 약간 불안정하고 getActivity일부 경우 널을 리턴하므로 컨텍스트를 가져 오기 전에 항상 iPart () 메소드를 확인하십시오 getActivity().


15
프래그먼트가 "약간 불안정"하다고 말하고 싶지는 않습니다. 프래그먼트가 액티비티에 속하지 않을 때 getActivity ()가 null을 반환하는 것은 매우 정상적인 것 같습니다. getActivity () "Fragment 클래스가 아닌) 앱을 불안정하게 만드는"null을 반환해서는 안됩니다 "라고 가정합니다.
— personne3000

3
@ personne3000 더 듣고 싶습니다. 조각이 활동에 속하지 않는 경우는 언제입니까? 언제 이런 일이 일어나고 왜? getActivity ()를 사용하기 위해 프래그먼트에서 iPart ()를 확인해야합니까? 경험상 규칙?
— Sotti

2
@Sotti이 특정 주제는 원래 질문과 약간 다르기 때문에 이에 대한 새로운 질문을 작성하거나 기존 질문을 찾으십시오. 일반적인 정보 는 developer.android.com/guide/components/fragments.html#Lifecycle 을 참조하십시오. 기본적으로 onAttach 전과 onDetach 후에는 활동이 없습니다. 그리고 onAttach와 onActivityCreated 사이에서 활동의 onCreate가 아직 호출되지 않았습니다. getActivity ()를 사용할 때 활동이 이미 작성되었는지 확인하고 활동이 파괴되거나 프래그먼트가 분리되면 어떻게 될지 생각하십시오.
— personne3000

22

내가 찾은 조각의 컨텍스트를 얻는 가장 쉽고 정확한 방법은 적어도 여기에서 메소드 ViewGroup를 호출 할 때 직접 가져 오는 것 onCreateView입니다 getActivity().

public class Animal extends Fragment { 
  Context thiscontext;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    thiscontext = container.getContext();

10
그것이 컨테이너의 맥락입니다. "이 맥락"이 아니라고 생각합니다.
— Fattie

2
@ AG1 왜 코드가 충돌했는지 설명해 주시겠습니까? 이것이 내가 가진 최고의 솔루션입니다
— Machado

3
실제로 dialogFragments에서 컨테이너 는 null 일 수 있습니다. 조심해!
— 루카스 테 스케

이 솔루션은 onCreateView가 아니라 onViewCreated에서 사용해야합니다.
— Andrea De Simone

13

이전에 내가 사용하고 onAttach (Activity activity)얻을 수 context있는Fragment

문제

이 onAttach (Activity activity)메소드는 API 레벨 23에서 더 이상 사용되지 않습니다.

해결책

지금 상황을 얻기 위해 Fragment우리가 사용할 수 있습니다onAttach (Context context)

onAttach (Context context)

  • 프래그먼트가 처음에 첨부 될 때 호출됩니다 context. onCreate(Bundle)이 후에 호출됩니다.

선적 서류 비치

/**
 * Called when a fragment is first attached to its context.
 * {@link #onCreate(Bundle)} will be called after this.
 */
@CallSuper
public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}

샘플 코드

public class FirstFragment extends Fragment {


    private Context mContext;
    public FirstFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rooView=inflater.inflate(R.layout.fragment_first, container, false);

        Toast.makeText(mContext, "THIS IS SAMPLE TOAST", Toast.LENGTH_SHORT).show();
        // Inflate the layout for this fragment
        return rooView;
    }

}

노트

우리는 또한 사용할 수 있습니다 getActivity()얻을 context에 Fragments 있지만 getActivity()반환 할 수 있습니다 null당신의이 경우 fragment현재 부모에 연결되어 있지 않습니다 activity,


11
@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    context=activity;
}

6

inflater재정의 할 때 매개 변수 에서 컨텍스트를 가져올 수도 있습니다 onCreateView.

public static class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        /* ... */
        Context context = inflater.getContext();
        /* ... */
    }
}

5

다른 대안은 다음과 같습니다.

다음을 사용하여 컨텍스트를 얻을 수 있습니다.

getActivity().getApplicationContext();

5

Fragment 내부의 컨텍스트를 얻는 것은 getActivity()다음을 사용하여 가능합니다 .

public Database()
{
    this.context = getActivity();
    DBHelper = new DatabaseHelper(this.context);
}
  • 을 사용 Activity하여 프래그먼트와 관련된 것을 얻으려면 getActivity()사용할 수 있지만 메모리 누수를 유발하지 않는 것이 좋습니다.

나는 더 나은 접근 방식 Activity이 onAttach()방법 에서 벗어나야한다고 생각합니다 .

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    context = activity;
}

어쨌든 해당 뷰가 활동의 일부가 아닌 한 조각에서 getActivity를 사용하여 뷰를 가져 와서는 안됩니다. 왜 조각으로 뷰를 팽창시키고 그로부터 아무것도 참조하지 않겠습니까?
— tyczj

이 답변은 다른 것에 관한 것입니다. 뷰를 검색하기 위해 어떤 뷰 계층을 말하는지 이야기하고 있습니다. Activity.findViewById이 액티비티의 등록 된 컨텐츠 뷰에서 뷰를 검색하는 편리한 방법 setContentView입니다. 올바른 예제에서 View.findViewById, not Activity.findViewById을 (를) 호출하고 올바른 루트보기 에서 메소드를 호출하고 있습니다. 완전히 다른 문제이며 분명히 해당 뷰를 보유하지 않는 뷰 계층에서 뷰를 찾을 수 없습니다.
— JHH

3

getContext() 코드의 모든 곳에서 getActivity ()로 대체하십시오.

오류가 해결되는지 확인하십시오. 대상과 minimun API 레벨 사이에있는 메소드를 사용하십시오. 그렇지 않으면이 오류가 발생합니다.


3

API 레벨 23부터 거기 getContext()당신이 사용할 수있는 이전 버전을 지원하려면하지만 getActivity().getApplicationContext()난 아직도의 지원 버전을 사용하는 것이 좋습니다 동안 Fragment인을 android.support.v4.app.Fragment.



2

지원 라이브러리의 조각 사용 -

android.support.v4.app.Fragment

그런 다음 무시

void onAttach (Context context) {
  this.context = context;
}

이런 식으로 컨텍스트가 항상 널이 아닌 값임을 확신 할 수 있습니다.


2

다른 옵션이 있습니다 :

  • minSDK <= 21 인 getActivity()경우이 값은이므로 사용할 수 있습니다 Context.
  • minSDK가> = 23이면을 사용할 수 있습니다 getContext().

이전 버전을 지원할 필요가 없으면로 이동하십시오 getContext().


2

Kotlin의 경우 context조각에 직접 사용할 수 있습니다 . 그러나 어떤 경우에는 다음과 같은 오류가 있습니다.

유형 불일치 : 유추 된 유형이 컨텍스트입니까? 그러나 상황은 예상되었다

이를 위해 당신은 이것을 할 수 있습니다

val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))

잘 작동하는 Kotlin 버전을 사용해 주셔서 감사하지만 Picasso.get ()에 대한 컨텍스트를 가져 오려고하지만 결코 작동하지 않습니다. 위의 샘플에서 컨텍스트를 얻기 위해 모든 것을 시도했습니다. 기껏해야이 메시지가 나옵니다-너무 많은 인수가 전달되었습니다 ... 도와주세요. val ctx = context? : Picasso.get (ctx) .load (selectedGallery.imageUrl) .placeholder (R.mipmap.ic_launcher) .into (galleryImage)
— Ade

@Ade 조각에서 "activity !!"를 사용해보십시오. 대신 "CTX"의 날이 도움 여부를 알려
— Kishan Solanki

@ 키샨 솔란 키 124. 빠른 답변 감사합니다. 나는 같은 결과로 당신의 제안을 시도했습니다-여전히 작동하지 않습니다. 정확한 오류 프롬프트는-공개 공개 재미 get ()에 대한 인수가 너무 많습니다 : Picasso !. 이 메시지는 아마도 다른 것이 오류라고 생각합니다. 다행스럽게도 상황을 파악하지 않고 피카소를 사용하여 작업을 진행할 수있는 방법을 찾았습니다. 다시 감사합니다.
— Ade


2

Kotlin에서 API 29 이상을 사용 하여해야했습니다.

activity?.applicationContext!!

예를 들면

ContextCompat.getColor(activity?.applicationContext!!, R.color.colorAccent),

문맥! = ApplicationContext
— Gabriele Mariotti

1

이상적으로는 전역을 사용할 필요가 없습니다. 조각에는 다른 알림이 있으며 그 중 하나는 onActivityCreated입니다. 프래그먼트의이 라이프 사이클 이벤트에서 활동 인스턴스를 확보 할 수 있습니다.

그런 다음 원하는대로 활동, 컨텍스트 또는 애플리케이션 컨텍스트를 얻기 위해 프래그먼트를 역 참조 할 수 있습니다.

this.getActivity()액티비티에 this.getContext()대한 핸들을 제공하고 컨텍스트에 this.getActivity().getApplicationContext()대한 핸들을 제공하여 애플리케이션 컨텍스트에 대한 핸들을 제공합니다. 응용 프로그램 컨텍스트를 db로 전달할 때 응용 프로그램 컨텍스트를 사용하는 것이 좋습니다.


1

간단한 방법은을 사용하는 것 getActivity()입니다. 그러나 getActivity()컨텍스트를 얻기 위해 메소드를 사용하는 데 대한 혼란은 널 포인터 예외 라고 생각합니다 .

이를 위해 먼저 isAdded()추가 여부를 결정 하는 방법을 확인한 다음를 사용하여 getActivity()Activity의 컨텍스트를 얻을 수 있습니다 .


1
Ankur Chaudhary의 답변 과 다른 점은 무엇입니까?
— Peter Mortensen

1

전화 getActivity()하거나

public void onAttach(Context context) {
    super.onAttach(context);
    this.activity = (CashActivity) context;
    this.money = this.activity.money;
}

1

getActivity () 메소드를 사용하여 컨텍스트를 가져 오거나 getContext () 메소드를 사용할 수 있습니다.

 View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
    Context c = root.getContext();

도움이 되길 바랍니다!


1
OP의 질문을 제공하는 다른 답변이 있으며 얼마 전에 게시되었습니다. 답변을 게시 할 때 : 좋은 답변을 작성하려면 어떻게합니까?를 참조하십시오. , 특히 오래된 질문에 답변 할 때 새로운 솔루션이나 실질적으로 더 나은 설명을 추가하십시오.
— help-info.de

0

getContext () 메소드는 프래그먼트 활동에서 클래스의 컨텍스트를 사용하는 데 도움이됩니다.


0

나는 당신이 사용할 수 있다고 생각

public static class MyFragment extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

      Context context = getActivity.getContext();

  }
}

0
public class MenuFragment extends Fragment implements View.OnClickListener {
    private Context mContext;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        FragmentMenuBinding binding=FragmentMenuBinding.inflate(inflater,container,false);
        View view=binding.getRoot();
        mContext=view.getContext();
        return view;
    }
}

0

또한 다음을 사용할 수 있습니다.

inflater.getContext();

그러나 나는 사용하는 것을 선호합니다

getActivity()

또는

getContext

0

getActivity 오류를 사용할 때 arrayAdapter IN 조각을 사용하기위한 컨텍스트가 필요 하지만 getContext로 바꾸면 나에게 효과적입니다.

listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1 ,listSensorType));

0

getActivity()또는 getContext조각으로 사용할 수 있습니다 .

선적 서류 비치

/**
 * Return the {@link FragmentActivity} this fragment is currently associated with.
 * May return {@code null} if the fragment is associated with a {@link Context}
 * instead.
 *
 * @see #requireActivity()
 */
@Nullable
final public FragmentActivity getActivity() {
    return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}

과

 /**
     * Return the {@link Context} this fragment is currently associated with.
     *
     * @see #requireContext()
     */
    @Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }

프로 팁

항상 확인 if(getActivity!=null)하기 때문에 이 널 (null) 일 수있다 단편 활동에 연결되지 않은 경우. 때로는 나머지 API에서 데이터를 가져 오는 것과 같이 조각에서 긴 작업을 수행하는 데 시간이 걸립니다. 사용자가 다른 조각으로 이동하는 경우 그러면 getActivity가 널이됩니다. 처리하지 않으면 NPE를 받게됩니다.


이것은 getActivity () 메소드의 문서이며, 이것이 널일 수 있음을 보여줍니다. 여기서 mHost는 FragmentHostCallback클래스의 인스턴스입니다 .
— Khemraj

0

당신은 조각

((Name_of_your_Activity) getActivity()).helper

활동에

DbHelper helper = new DbHelper(this);

0

kotlin 샘플의 내부 조각은 누군가를 도울 것입니다.

textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))

데이터 바인딩을 사용하는 경우

bindingView.textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))

다음 과 같이 onCreateView 에서 bindingView가 초기화됩니다.

private lateinit var bindingView: FragmentBookingHistoryDetailBinding

bindingView = DataBindingUtil.inflate(inflater, R.layout.your_layout_xml, container, false)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.