एक दृश्य से होस्टिंग गतिविधि कैसे प्राप्त करें?


186

मेरे पास Activity3 EditTexts और एक कस्टम दृश्य है जो EditTexts में जानकारी जोड़ने के लिए एक विशेष कीबोर्ड का काम करता है ।

वर्तमान में मैं Activityदृश्य में गुजर रहा हूं ताकि मैं वर्तमान में केंद्रित संपादित पाठ प्राप्त कर सकूं और कस्टम कीबोर्ड से सामग्री को अपडेट कर सकूं।

क्या मूल गतिविधि को संदर्भित करने और वर्तमान EditTextमें दृश्य में गतिविधि को पारित किए बिना ध्यान केंद्रित करने का एक तरीका है ?


7
सही उत्तर गोमिनो द्वारा है।
दुनजोद

जवाबों:


302

मैंने आधिकारिक सपोर्ट लाइब्रेरी में MediaRouter से सिर्फ उस सोर्स कोड को खींचा और अब तक यह ठीक काम करता है:

private Activity getActivity() {
    Context context = getContext();
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) {
            return (Activity)context;
        }
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null;
}

13
जबकि? जबकि क्यों?
जैकब एरिकसन

9
यह सभी आधार प्रसंगों को गढ़ने का एक तरीका है, जब तक कि गतिविधि नहीं मिलती है, या रूट संदर्भ मिलने पर लूप से बाहर निकलें। क्योंकि रूट संदर्भ में एक अशक्त बेसोनटेक्स्ट होगा, जिससे लूप समाप्त हो जाएगा।
गोमिनो

1
बहुत अच्छा ! मैंने getActivity () के साथ (गतिविधि) getContext ()) को प्रतिस्थापित किया और यह ठीक काम करता है .... धन्यवाद
क्रिश्चियन

जैसा कि बताया गया है, getContext () हमेशा एक गतिविधि ऑब्जेक्ट का प्रतिनिधित्व नहीं कर सकता है यदि आपका दृश्य किसी गतिविधि संदर्भ से नहीं बुलाया गया है। उदाहरण के लिए, यह कस्टम दृश्यों के लिए काम नहीं करता है।
ताहि

@AbhinavSaxena क्या आप हमें एक उदाहरण दे सकते हैं जहां यह कोड विफल हो जाएगा? भले ही यह विधि खुद ही शून्य हो जाए लेकिन इसे कभी भी वहाँ नहीं जाना चाहिए।
टियागो

168

निम्नलिखित तरीके आपकी मदद कर सकते हैं

  1. Activity host = (Activity) view.getContext(); तथा
  2. view.isFocused()

34
बस यह मत भूलो कि getContext()हमेशा एक गतिविधि ऑब्जेक्ट वापस नहीं किया जा सकता है यदि आपका दृश्य गतिविधि के संदर्भ से नहीं कहा जाता है। इसे आगे की योजना बनाना और एक उचित वापसी प्रदान करना सुनिश्चित करें।
Dzhuneyt

1
@WordPressDeveloper - एक गतिविधि के बिना एक दृश्य कैसे बनाया जा सकता है? आपका मतलब दूरस्थ दृश्य है? क्या किसी गतिविधि के बाहर देखे जाने वाले अन्य मामले हैं?
एलिकएल्ज़िन-किलाका

1
@kilaka विजेट्स, फ्रैगमेंट्स, रिमोट व्यूज़, लेआउटइन्फ़्लैटर्स वे सभी मामले हैं जहाँ आप एक ऐसा दृश्य बना सकते हैं जो किसी एक्टिविटी से जुड़ा न हो।
डिझुंइट

4
@WordPressDeveloper - जब आप किसी खंड में एक दृश्य बनाते हैं, तो यह संदर्भ अभी भी गतिविधि है। टुकड़े केवल गतिविधियों में ही निवास कर सकते हैं।
एलिकएल्ज़िन-किलाका

24
यह बनाने के लिए एक बहुत ही खतरनाक कास्ट है। एक अच्छा मौका है (यदि आप appcompat उपयोग कर रहे हैं) इस संदर्भ आप मिल गया है लपेटा जाता है, एक तरह कुछ कास्टिंग नहीं है ContextThemeWrapperकरने के लिए Activityएक फेंक देते हैं ClassCastException। आपको आधार संदर्भ (जो एक गतिविधि होनी चाहिए) को खोलना चाहिए, जो अपने आप में खतरनाक है क्योंकि इसमें देशी और v7 संस्करण है ContextThemeWrapper
एलेक्स

9

मुझे कोटलिन में लिखा यह समाधान पसंद है

tailrec fun Context?.activity(): Activity? = when (this) {
    is Activity -> this
    else -> (this as? ContextWrapper)?.baseContext?.activity()
}

Viewकक्षा में उपयोग

context.activity()

विघटित कोड:

public static final Activity activity(Context context) {
    while (!(context instanceof Activity)) {
        if (!(context instanceof ContextWrapper)) {
            context = null;
        }
        ContextWrapper contextWrapper = (ContextWrapper) context;
        if (contextWrapper == null) {
            return null;
        }
        context = contextWrapper.getBaseContext();
        if (context == null) {
            return null;
        }
    }
    return (Activity) context;
}

धन्यवाद, वास्तव में kotlin पर इस अच्छी स्कैन गतिविधि के लिए इसकी सराहना करते हैं
mochadwi

8

मैंने गोमिनो का जवाब लिया और इसे पूरी तरह से myUtils.java में फिट करने के लिए संशोधित किया ताकि मैं इसे जहां और जब भी जरूरत हो उपयोग कर सकूं। आशा है कि किसी को यह उपयोगी लगता है :)

abstract class myUtils {
    public static Activity getActivity(View view) {
        Context context = view.getContext();
        while (context instanceof ContextWrapper) {
            if (context instanceof Activity) {
                return (Activity)context;
            }
            context = ((ContextWrapper)context).getBaseContext();
        }
        return null;
    }
}

यह प्रभावी उत्तर नहीं है, क्योंकि इस फ़ंक्शन से लौटने के रूप में अशक्त होने की संभावना है। मेरा जवाब सार्वभौमिक रूप से लागू है, हालांकि कुछ कड़ी मेहनत और समझ के माध्यम से: stackoverflow.com/a/51077569/787399
अभिनव सक्सेना

-1

एंड्रॉइड 7+ में दृश्य के पास अब संलग्न गतिविधि तक पहुंच नहीं है, इसलिए view.getContext()अब किसी गतिविधि में नहीं डाला जा सकता है।

इसके बजाय, नीचे दिया गया कोड एंड्रॉइड 7+ और 6 में काम करता है:

private static Activity getActivity(final View view) {
    return (Activity) view.findViewById(android.R.id.content).getContext();
}

6
"एंड्रॉइड 7+ में दृश्य के पास अब संलग्न गतिविधि तक पहुंच नहीं है, इसलिए view.getContext () को किसी गतिविधि में नहीं डाला जा सकता है" कोई संदर्भ?
सिंपल फेलो

@SimpleFellow जैसा कि अन्य टिप्पणियों में बताया गया है, getContextशायद ContextThemeWrapperइसलिए वापस लौटेगा कि दृश्य में अब गतिविधि तक सीधी पहुंच नहीं है। इसके बजाय, आपको पैरेंट संदर्भों के माध्यम से पुन: खोज करना होगा जब तक कि आपको पैरेंट एक्टिविटी न मिल जाए या इस उत्तर में मेरे द्वारा दी गई विधि का उपयोग न करें।
सेबास एलजी

-1

माता-पिता की गतिविधि को पुनः प्राप्त करने के लिए देखें के लिए कोटलिन एक्सटेंशन संपत्ति:

val View.activity: Activity?
get() {
    var ctx = context
    while (true) {
        if (!ContextWrapper::class.java.isInstance(ctx)) {
            return null
        }
        if (Activity::class.java.isInstance(ctx)) {
            return ctx as Activity
        }
        ctx = (ctx as ContextWrapper).baseContext
    }
}

आप दो की जगह सकता है ifके साथ whenऔर isInstance()साथ !is ContextWrapperयाis Activity
डेविड मिगुएल

@Gomino के अनुसार रूट संदर्भ में एक अशक्त आधार होगा। इसलिए आपका कार्यान्वयन इस मामले में क्लासकैस्ट अपवाद को फेंक सकता है
डेविड मिगुएल

यह पुराना समाधान है। @Vlad द्वारा समाधान का उपयोग करने के लिए बेहतर है
Fedir Tsapana

-1

@ ऑवरराइड सार्वजनिक बूलियन चाहिए ()); view.getContext () startActivity (आशय)। सच लौटना; } ... ...}


1
नमस्ते, और ढेर अतिप्रवाह में आपका स्वागत है। कृपया अपने उत्तर को केवल कोड नमूने से अधिक समझाएं; उदाहरण के लिए अन्य उत्तरों को देखें।
इटाराम मुश्किन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.