কোনও ভিউ থেকে হোস্টিং ক্রিয়াকলাপ কীভাবে পাবেন?


186

আমার কাছে একটি Activity3 EditTextটি এবং একটি কাস্টম ভিউ রয়েছে যা এসগুলিতে তথ্য যুক্ত করতে একটি বিশেষায়িত কীবোর্ডকে কাজ করে EditText

বর্তমানে আমি Activityদৃশ্যের মধ্যে দিয়ে যাচ্ছি যাতে আমি বর্তমানে দৃষ্টি নিবদ্ধ করা সম্পাদনা পাঠ্যটি পেতে এবং কাস্টম কীবোর্ড থেকে সামগ্রীগুলি আপডেট করতে পারি।

পিতামাতার ক্রিয়াকলাপটি উল্লেখ করার এবং EditTextক্রিয়াকলাপটিকে দৃষ্টিতে না ফেলেই বর্তমানে মনোনিবেশ করার কোনও উপায় আছে কি ?


7
সঠিক উত্তরটি গমনো দ্বারা।
djodod

উত্তর:


302

আমি সরকারী সমর্থন লাইব্রেরিতে মিডিয়ারউটার থেকে কেবলমাত্র সেই উত্স কোডটি টানলাম এবং এখনও পর্যন্ত এটি দুর্দান্ত কাজ করে:

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 ()) প্রতিস্থাপন করেছি এবং এটি ভাল কাজ করে .... ধন্যবাদ
খ্রিস্টান

যেমন বলা হয়েছে, গেটকন্টেক্সট () সর্বদা কোনও ক্রিয়াকলাপের বিষয়টিকে উপস্থাপন করতে পারে না যদি আপনার দৃষ্টিভঙ্গি কোনও কার্যকলাপ প্রসঙ্গে না ডাকা হয়। যেমন এটি কাস্টম দর্শনগুলির জন্য কাজ করে না।
তোহিদ

@ অভিনবসাক্সেনা আপনি কি আমাদের একটি উদাহরণ দিতে পারেন যেখানে এই কোডটি ব্যর্থ হবে? যদিও পদ্ধতিটি নিজেই নালায় ফিরে আসে তা কখনই সেখানে পাওয়া উচিত নয়।
টিয়াগো

168

নিম্নলিখিত পদ্ধতিগুলি আপনাকে সাহায্য করতে পারে

  1. Activity host = (Activity) view.getContext(); এবং
  2. view.isFocused()

34
কেবল এটি ভুলে যাবেন না যে getContext()যদি আপনার দৃষ্টিভঙ্গি কোনও কার্যকলাপ প্রসঙ্গে না ডাকা হয় তবে সর্বদা কোনও ক্রিয়াকলাপের জিনিসটি ফিরিয়ে দিতে পারে না। এটি আগে পরিকল্পনা এবং একটি উপযুক্ত ফলব্যাক প্রদান নিশ্চিত করুন।
ডিজনেয়েট

1
@ ওয়ার্ডপ্রেস ডেফলার - কোনও ক্রিয়াকলাপ ছাড়া কীভাবে একটি দৃশ্য তৈরি করা যায়? আপনি দূরবর্তী ভিউ মানে? কোনও ক্রিয়াকলাপের বাইরে তৈরি হওয়া এমন দর্শনগুলির কি অন্যান্য ঘটনা আছে?
অ্যালিকেলজিন-কিলাকা

1
@ কিলাকা উইজেটস, টুকরোগুলি, রিমোটভিউস, লেআউটআইনফ্লেটারগুলি এমন সব ক্ষেত্রেই যেখানে আপনি এমন কোনও দৃশ্য তৈরি করতে পারেন যা কোনও কার্যকলাপের সাথে আবদ্ধ নয়।
ডিজনেয়েট

4
@ ওয়ার্ডপ্রেস ডেফলার - আপনি যখন কোনও খণ্ডে একটি দৃশ্য তৈরি করেন, তখনও এর প্রসঙ্গটি ক্রিয়াকলাপ। খণ্ডগুলি কেবল ক্রিয়াকলাপগুলিতেই থাকতে পারে।
অ্যালিকেলজিন-কিলাকা

24
এটি তৈরির জন্য বেশ বিপজ্জনক castালাই। একটি ভাল সুযোগ (যদি আপনি appcompat ব্যবহার করছেন) যে প্রসঙ্গ আপনি পেয়েছেন আবৃত, একটি ভালো কিছু ভোটদান নেই ContextThemeWrapperকরার Activityএকটি নিক্ষেপ করা হবে ClassCastException। বেস প্রসঙ্গটি (যা কোনও ক্রিয়াকলাপ হওয়া উচিত) আন-মোড়ানোর জন্য আপনার একটি উপায় দরকার, যা নিজেই বিপজ্জনক কারণ এর নেটিভ এবং ভি 7 সংস্করণ রয়েছে 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;
}

ধন্যবাদ, কোটলিনে এই দুর্দান্ত স্ক্যান ক্রিয়াকলাপের জন্য সত্যই এটির প্রশংসা করুন
মোচাদ্বী

8

আমি নেন Gomino এর উত্তর এবং এটি পরিবর্তিত 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

অ্যান্ড্রয়েড +++ এ ভিউটি এখন আর বন্ধ থাকা ক্রিয়াকলাপে অ্যাক্সেস পায় না, সুতরাং view.getContext()আর কোনও ক্রিয়াকলাপে কাস্ট করা যাবে না।

পরিবর্তে, নীচের কোডটি অ্যান্ড্রয়েড 7+ এবং 6 এ কাজ করে:

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

6
"অ্যান্ড্রয়েড +++ এ ভিউটি এখন আর বন্ধ করার ক্রিয়াকলাপে অ্যাক্সেস পায় না, সুতরাং দেখুন.getContext () কোনও ক্রিয়াকলাপে কাস্ট করা যায় না" কোনও রেফারেন্স?
সহজ ফেলো

অন্যান্য মন্তব্যগুলিতে উল্লিখিত @ সিম্পলফেলি 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
ডেভিড মিগুয়েল

@ গমিনো অনুসারে মূল প্রসঙ্গে একটি নাল বেসকন্টেক্সট থাকবে। সুতরাং আপনার বাস্তবায়ন এই ক্ষেত্রে একটি ক্লাসকাস্ট ধারণাটি ছুঁড়ে ফেলতে পারে
ডেভিড মিগুয়েল

এটি পুরানো সমাধান। @ ভ্লাদ দ্বারা সমাধানটি ব্যবহার করা আরও ভাল
ফেদির সোপানা

-1

@ ওভাররাইড পাবলিক বুলিয়ান উচিত ওভাররাইডউর্ললয়েডিং (ওয়েবউইউ ভিউ, ওয়েব রিসোর্স রিকুয়েস্ট অনুরোধ) {যদি (অনুরোধ.getUrl ()। GetHost () শুরু হয় উইথ ("pay.google.com")) {উদ্দীপনা উদ্দেশ্য = নতুন উদ্দেশ্য (উদ্দেশ্য)। ()); view.getContext () startActivity (অভিপ্রায়)। সত্য প্রত্যাবর্তন; } ... ...


1
হাই, এবং স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। আপনার উত্তরটি কেবল কোড নমুনার চেয়ে বেশি ব্যাখ্যা করুন; উদাহরণস্বরূপ অন্যান্য উত্তরগুলি দেখুন।
ইতমার মুশকিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.