एक अंश में संदर्भ का उपयोग करना


664

मैं एक टुकड़े में संदर्भ कैसे प्राप्त कर सकता हूं?

मैं अपने डेटाबेस जिसका निर्माता संदर्भ में लेता उपयोग करने की आवश्यकता है, लेकिन getApplicationContext()और FragmentClass.thisतो मैं क्या कर सकते हैं काम नहीं करते?

डेटाबेस कंस्ट्रक्टर

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

जवाबों:


1313

आप उपयोग कर सकते हैं getActivity(), जो ए से जुड़ी गतिविधि लौटाता है fragment
गतिविधि एक context (जब से Activityफैली हुई है Context) है


212
getActivity () संबंधित खंड के onAachach से पहले कहा जाता है, तो अशक्त लौट सकते हैं।
arne.jans

4
मैं इस Google ब्लॉग को मेमोरी लीक ... android-developers.blogspot.com/2009/01/… पर पढ़ रहा था । अगर मैं getActivity () विधि का उपयोग करता हूं, तो क्या ऐप में मेमोरी लीक होने का खतरा नहीं होगा? ब्लॉग बताता है कि "एक संदर्भ-गतिविधि के बजाय संदर्भ-अनुप्रयोग का उपयोग करने का प्रयास करें" जो वास्तव में संभव नहीं है क्योंकि getApplicationContext () केवल गतिविधि वर्ग के लिए काम करता है न कि फ्रैगमेंट वर्ग के लिए।
शमौन

40
अलग किए गए अंशों की समस्या का एक समाधान है कि getActivity().getApplicationContext()जब खंड बनाया जाए तो एक उदाहरण चर के मूल्य को संग्रहित करें और फिर उस संदर्भ का उपयोग करें जब भी आप टुकड़े वर्ग के अंदर चाहते हैं। वह संदर्भ टुकड़े टुकड़ी से बच जाएगा।
पियोवेज़न

8
एप्लिकेशन संदर्भ के आसपास से गुजरने के बजाय, अपने एप्लिकेशन वर्ग के अंदर एक स्थिर संदर्भ बनाएं और इसे प्रारंभ करें (): MyApplication.sContext = getApplicationContext (); फिर आप इसे टुकड़ी की चिंता किए बिना किसी भी गतिविधि / टुकड़े से एक्सेस कर सकते हैं।
एडुको

3
@milaniez: getActivityहमेशा उपलब्ध रहा है। यह getContextएपीआई 23 में जोड़ा गया था।
मुहम्मद

130

उपरोक्त उत्तर के रूप में करने के लिए, आप onAttachटुकड़े करने की विधि को ओवरराइड कर सकते हैं :

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

3
मैं इसकी अनुशंसा करूंगा, क्योंकि यदि onAttach को अभी तक नहीं बुलाया गया है, तो getActivity () वापस आती है।
arne.jans

9
लेकिन, ध्यान रखें, जब onAachach () कहा जाता है, तो कोई विचार नहीं हैं। तो आप अभी तक विचारों के साथ कुछ नहीं कर सकते!
जोर्डिड

2
@iambox अगर DatabaseHelperएक के FragmentActivityबजाय की जरूरत है Activity? उदाहरण के लिए, एक Adapter...
जागो

4
यदि आप अपनी गतिविधि का एक संदर्भ संग्रहीत करते हैं, onAttach(Activity activity)तो आपको इसे जारी करना चाहिएonDetach()
vovahost

3
onAttachविधि, पदावनत किया गया हैOverrides deprecated method in 'android.support.v4.app.Fragment'
मुहम्मद साकिब

24

अपनी संलग्न गतिविधि का संदर्भ प्राप्त करने के लिए हमेशा getActivity () विधि का उपयोग करें , लेकिन हमेशा एक बात याद रखें: टुकड़े थोड़े अस्थिर होते हैं और getActivityकुछ समय में वापस लौट आते हैं, इसलिए इसके लिए, संदर्भ द्वारा प्राप्त करने से पहले हमेशा सुगंधित () पद्धति की जांच करें getActivity()


15
मैं यह नहीं कहूंगा कि टुकड़े "थोड़ा अस्थिर" हैं, यह getActivity () के लिए काफी सामान्य प्रतीत होता है जब टुकड़ा एक गतिविधि से संबंधित नहीं होता है। यह माना जाता है कि getActivity () "शून्य नहीं लौटना चाहिए" (जो कि गलत है) जो आपके ऐप (और फ्रैगमेंट क्लास नहीं) को अस्थिर कर देगा।
personne3000

3
@ personne3000 मैं और अधिक सुनना चाहूंगा। जब एक गतिविधि से संबंधित एक टुकड़ा नहीं है? यह कब और क्यों हो रहा है? GetActivity () का उपयोग करने के लिए क्या हमें जांच की जानी चाहिए? अंगूठे का कोई नियम?
सोटी

2
@ सोती मैं आपको इसके लिए एक नया प्रश्न बनाने के लिए प्रोत्साहित करता हूं (या किसी मौजूदा को खोजता हूं), क्योंकि यह विशिष्ट विषय मूल प्रश्न से थोड़ा अलग है। आप सामान्य जानकारी के लिए developer.android.com/guide/compenders/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
यह कंटेनर का संदर्भ है, मुझे लगता है ... "यह संदर्भ" नहीं।
फेटी

2
@ AG1 क्या आप बता सकते हैं कि इसने आपके कोड को क्रेश क्यों किया? यह अब तक का सबसे अच्छा समाधान है
मचाडो

3
वास्तव में डॉयलॉगफ्रंट पर कंटेनर शून्य हो सकता है। सावधान रहें!
लुकास टेस्के

इस समाधान का उपयोग onViewCreated में किया जाना चाहिए, onCreateView पर नहीं।
एंड्रिया डी सिमोन

13

इससे पहले मैं उपयोग कर रहा हूँ onAttach (Activity activity)प्राप्त करने के लिए contextमेंFragment

मुसीबत

onAttach (Activity activity)विधि एपीआई स्तर 23 में पदावनत किया गया था।

समाधान

अब Fragmentहम संदर्भ प्राप्त कर सकते हैंonAttach (Context context)

onAttach (Context context)

  • कहा जाता है जब एक टुकड़ा पहली बार इसके साथ जुड़ा हुआ है contextonCreate(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,



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(), आप इसका उपयोग कर सकते हैं लेकिन यह अनुशंसित नहीं है कि यह मेमोरी लीक का कारण होगा।

मुझे लगता है कि एक बेहतर aproach विधि Activityसे प्राप्त करना चाहिए onAttach():

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

जब तक वह दृश्य किसी भी तरह की गतिविधि का हिस्सा न हो, आपको एक दृश्य प्राप्त करने के लिए getActivity का उपयोग करना चाहिए। क्यों आप एक टुकड़े में एक दृश्य फुलाएंगे तो उससे कुछ भी संदर्भित नहीं होगा?
tyczj

यह उत्तर कुछ अलग है, आप इस बारे में बात कर रहे हैं कि किस दृश्य में खोज करने के लिए hiearchy Activity.findViewByIdदेखें। उस गतिविधि के पंजीकृत सामग्री दृश्य (सेट के माध्यम से setContentView) में एक दृश्य की खोज करने के लिए बस एक सुविधा विधि है । अपने सही उदाहरण में, आप कॉल कर रहे हैं View.findViewById, नहीं Activity.findViewById, और आप सही रूट दृश्य पर विधि लागू कर रहे हैं । पूरी तरह से अलग समस्या है, और जाहिर है आप एक दृश्य में अपने दृश्य को खोजने में सक्षम नहीं होंगे, जो उस दृश्य को धारण नहीं करता है।
JHH

3

getContext() एपीआई 23 में आया। इसे कोड में हर जगह getActivity () से बदलें।

देखें कि क्या यह त्रुटि ठीक करता है। उन तरीकों का उपयोग करने का प्रयास करें जो लक्ष्य और न्यूनतम एपीआई स्तर के बीच में हैं, अन्यथा यह त्रुटि आ जाएगी।


3

एपीआई स्तर 23 के बाद से किया गया है getContext(), लेकिन आप पुराने संस्करणों का उपयोग कर सकते का समर्थन करना चाहते हैं getActivity().getApplicationContext(), जबकि मैं अभी भी समर्थन संस्करण का उपयोग करने की अनुशंसा Fragmentहै जो android.support.v4.app.Fragment


2

getActivity() प्रसंग का एक बच्चा है ताकि आप के लिए काम करना चाहिए


2

समर्थन लाइब्रेरी से अंशों का उपयोग करें -

android.support.v4.app.Fragment

और फिर ओवरराइड किया

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

इस तरह आप यह सुनिश्चित कर सकते हैं कि संदर्भ हमेशा एक अशक्त मान होगा।


2

आपके पास अलग-अलग विकल्प हैं:

  • यदि आपका minSDK <= 21 है, तो आप उपयोग कर सकते हैं getActivity(), क्योंकि यह एक है Context
  • यदि आपका minSDK> = 23 है, तो आप उपयोग कर सकते हैं getContext()

यदि आपको पुराने संस्करणों का समर्थन करने की आवश्यकता नहीं है, तो साथ जाएं getContext()


2

कोटलिन के लिए आप contextसीधे टुकड़ों में उपयोग कर सकते हैं । लेकिन कुछ कैसड में आपको एक एरर मिलेगा

प्रकार बेमेल: अनुमानित प्रकार प्रसंग है? लेकिन प्रसंग अपेक्षित था

उसके लिए आप यह कर सकते हैं

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

एक कोटलिन संस्करण का लाभ उठाने के लिए धन्यवाद, जो ठीक काम करता है, हालांकि मैं पिकासोगेट () के लिए प्रसंग प्राप्त करने की कोशिश कर रहा हूं, इसके साथ और यह कभी काम नहीं करता है, मैंने संदर्भ प्राप्त करने के लिए उपरोक्त सभी नमूनों से भी कोशिश की है। सबसे अच्छा मुझे यह संदेश मिलता है-बहुत सारे तर्क दिए गए ... कृपया मदद करें। ? वैल ctx = संदर्भ: वापसी Picasso.get (ctx) .load (selectedGallery.imageUrl) .placeholder (R.mipmap.ic_launcher) .into (Galleryimage)
Ade

@ अपने टुकड़े में, "गतिविधि" का उपयोग करने का प्रयास करें !! "ctx" के बजाय और मुझे बताएं कि यह मदद करता है या नहीं
किशन सोलंकी

@ किशनसोलंकी १२४ त्वरित प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मैंने आपके सुझाव की कोशिश की, उसी परिणाम के साथ - अभी भी काम नहीं कर रहा है। सटीक त्रुटि संकेत है - सार्वजनिक खुले मज़े के लिए बहुत सारे तर्क मिलते हैं (): पिकासो! यह संदेश मुझे लगता है, शायद कुछ और त्रुटि है ?. ख़ुशी की बात है कि बिना संदर्भ लिए पिकासो का उपयोग करके अपने काम के साथ आगे बढ़ने का एक रास्ता मिल गया। एक बार फिर धन्यवाद।
Ade

2

में kotlin बस का उपयोग activityकरने के बजायgetActivity()



1

आदर्श रूप से, आपको ग्लोबल्स का उपयोग करने की आवश्यकता नहीं होनी चाहिए। टुकड़े की अलग-अलग अधिसूचनाएँ हैं, उनमें से एक onActivityCreated है। खंड के इस जीवनचक्र में आप गतिविधि का उदाहरण प्राप्त कर सकते हैं।

तब: आप अपनी इच्छानुसार गतिविधि, संदर्भ या एप्लिकेशनकंटेक्ट प्राप्त करने के लिए टुकड़े को हटा सकते हैं:

this.getActivity()आप गतिविधि this.getContext()को संभाल this.getActivity().getApplicationContext()देंगे आप संदर्भ को संभाल देंगे आप आवेदन संदर्भ को संभाल देंगे। जब आप इसे db पर पास करते हैं तो आपको अधिमानतः अनुप्रयोग संदर्भ का उपयोग करना चाहिए।


1

उपयोग करने का सरल तरीका है getActivity()। लेकिन मुझे लगता है कि getActivity()यहां संदर्भ प्राप्त करने के लिए विधि का उपयोग करने का प्रमुख भ्रम एक शून्य सूचक अपवाद है।

इसके लिए, पहले उस isAdded()विधि से जांच करें जो यह निर्धारित करेगी कि यह जोड़ा गया है या नहीं, और फिर हम getActivity()गतिविधि का संदर्भ प्राप्त करने के लिए उपयोग कर सकते हैं ।



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
अन्य उत्तर हैं जो ओपी के प्रश्न प्रदान करते हैं, और वे कुछ समय पहले पोस्ट किए गए थे। उत्तर पोस्ट करते समय देखें: मैं एक अच्छा उत्तर कैसे लिखूं? , कृपया सुनिश्चित करें कि आप या तो एक नया समाधान जोड़ते हैं, या काफी बेहतर स्पष्टीकरण, विशेष रूप से पुराने प्रश्नों का उत्तर देते समय।
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 त्रुटि का उपयोग कर रहा था, लेकिन जब मैं इसे getContext से बदल देता हूं तो यह मेरे लिए काम करता है

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

0

आप उपयोग कर सकते हैं getActivity()या getContextFragment में कर सकते हैं ।

प्रलेखन

/**
 * 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)क्योंकि यह शून्य हो सकता है जब टुकड़ा गतिविधि से जुड़ा नहीं होता है। कभी-कभी टुकड़ों में लंबे समय तक ऑपरेशन करना (जैसे बाकी एपीआई से डेटा प्राप्त करना) कुछ समय लगता है। और यदि उपयोगकर्ता किसी अन्य टुकड़े पर नेविगेट करता है। तब getActivity शून्य हो जाएगी। और आपको एनपीई मिलेगा अगर आपने इसे नहीं संभाला।


यह getActivity () विधि का एक दस्तावेज है, बस यह दिखाने के लिए कि ये अशक्त हो सकते हैं। यहाँ mHost FragmentHostCallbackवर्ग का उदाहरण है ।
खेमराज

0

आप टुकड़े पर

((Name_of_your_Activity) getActivity()).helper

गतिविधि पर

DbHelper helper = new DbHelper(this);

0

कोटलिन के नमूने के अंदर के टुकड़े से किसी को मदद मिलेगी

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

यदि आप डेटाबाइंडिंग का उपयोग करते हैं;

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

कहाँ bindingView में आरंभ नहीं हो जाता onCreateView इस तरह

private lateinit var bindingView: FragmentBookingHistoryDetailBinding

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.