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


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()얻을 contextFragments 있지만 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()사용할 수 있지만 메모리 누수를 유발하지 않는 것이 좋습니다.

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

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