কোটলিন খণ্ডে ভিউ অ্যাক্সেস করার চেষ্টা করার সময় নলপয়েন্টারএক্সেপশন


239

কীভাবে কোটলিন অ্যান্ড্রয়েড এক্সটেনশনগুলি ব্যবহার করবেন Fragment? যদি আমি সেগুলি ভিতরে ব্যবহার করি তবে আমি onCreateView()এই NullPointerExceptionব্যতিক্রমটি পাই :

দ্বারা সৃষ্ট: java.lang. নালপয়েন্টার এক্সেপশন: একটি নাল বস্তুর রেফারেন্সে ভার্চুয়াল পদ্ধতি 'android.view.View android.view.View.findViewById (int)' ব্যবহারের চেষ্টা

খণ্ডের কোডটি এখানে:

package com.obaied.testrun.Fragment

import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*

public class CardSelectorFragment : Fragment() {
    val TAG = javaClass.canonicalName

    companion object {
        fun newInstance(): CardSelectorFragment {
            return CardSelectorFragment()
        }
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
        btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }

        return rootView
    }
}
`

4
আপনি যদি এটি ক্রেইটভিউতে করতে চান তবে বিটিএন_ কে রুটভিউতেও সম্পত্তি হবে। আপনি করতে পেরেছিলেনrootView.btn_K.setOnClickListener
মাকোটোসান

ধন্যবাদ @ মাকোটোসান আপনার উত্তর আমার পক্ষে কাজ করেছে।
মাহদী বাগজানি

অ্যান্ড্রয়েড স্টুডিওগুলি পরিস্কার, পুনর্নির্মাণ এবং পুনঃসূচনা আমার পক্ষে কাজ করেছে
ওটজিআই

@ ওটজিআই এই থ্রেডটি প্রথম প্রকাশিত হয়েছিল ২০১৫ সালে। প্রথম উত্তরে ২৫৯ টি ভোট রয়েছে এবং তা গৃহীত হয়েছিল। আমি আরও উত্তর যুক্ত করা প্রয়োজন বলে মনে করি না।
solidak

2
@ সলিডাক আমার সম্প্রতি এই সমস্যাটি হয়েছিল, সমস্ত উত্তর চেষ্টা করেছিলাম এবং এটি কার্যকর করে তোলে এমন একমাত্র জিনিসটি আমি এখন মন্তব্য করেছি। এই থ্রেডটিতে আমার একটি উত্তর ছিল, তবে এটি স্রেফ নিচে নামিয়েছে, তাই আমি এটিকে একটি মন্তব্যে পরিবর্তন করেছি। মনে হচ্ছে লোকেরা এখনও এই সমস্যাটি নিয়ে আছে এবং পরিষ্কার ও পুনরায় আরম্ভ করার জন্য কেউ উল্লেখ করেনি।
ওটিজিই

উত্তর:


442

কোটলিন সিন্থেটিক বৈশিষ্ট্যগুলি যাদু নয় এবং খুব সাধারণ উপায়ে কাজ করে। আপনি যখন অ্যাক্সেস করেন তখন btn_Kএটি কল করে getView().findViewById(R.id.btn_K)

সমস্যাটি হ'ল আপনি এটি খুব শীঘ্রই অ্যাক্সেস করছেন। getView()আয় nullমধ্যে onCreateViewonViewCreatedপদ্ধতিতে এটি করার চেষ্টা করুন :

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}

2
এটা কাজ করেছে!! ধন্যবাদ। ভবিষ্যতের রেফারেন্সের জন্য কেবল একটি দ্রুত মাথা উঁচু। আমার আর একটি ব্যতিক্রম ছিল, এবং আমি কিছুটা গভীর খনন করেছি এবং এটি দেখা গেছে যে নাল রেফারেন্স ব্যতিক্রমটি একটি অ্যাসিঙ্ক কলব্যাক থেকে ইউআই থ্রেডে আসছিল যেখানে এটি সিন্থেটিক সম্পত্তি অ্যাক্সেস করার চেষ্টা করবে, তবে এটি ইতিমধ্যে নাল ছিল। নিরাপদ কল অপারেটর (?।) বা অন্য কোনও নাল সুরক্ষা অপারেটর ব্যবহার নিশ্চিত করুন । এটি দেখতে শ্রেণীর রেফারেন্স রাখতে সহায়তা করবে এবং বাইরে সিন্থেটিক বৈশিষ্ট্যগুলির উপর নির্ভর করবে নাonViewCreated()
solidak

2
যদিও একটি প্রশ্ন - এটি ক্রিয়াকলাপ এবং খণ্ডনের জন্য আলাদা কোড তৈরি করে? আমরা যদি এমন কোনও কাঠামো ব্যবহার করি যা ধারণ করে না getView()বা এটি চালিত করতে না পারে তবে এর আশপাশে findViewById()কাজ করার কোনও উপায় আছে কি? উদাহরণস্বরূপ, এটি শিখান কোন ফাংশনটি আমার লেআউটটি ফিরিয়ে দেবে?
milosmns

7
আপনি rootView.btn_Kযদি এটি দেখতে ( যেমন কেবল টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো থেকে তৈরি করতে পারেন)
Adib Faramarzi

এটি কাজ করে! তবে এটি কোটলিন ডকুমেন্টেশন থেকে আরও আন্ডারলাইন করা উচিত। এই পোস্টের আগ পর্যন্ত আমি এই পদ্ধতিটি লক্ষ্য করিনি .. যাইহোক ধন্যবাদ!
sokarcreative

2
আমি এটি সর্বদা অনভিউক্রিয়েটেডে ব্যবহার করেছি তবে এখনও কিছু ডিভাইসে (ক্র্যাশলিটিক্সের কাছ থেকে আমি প্রতিবেদন পেয়েছি) এটি "অবশ্যই নাল হবে না" ব্যতিক্রম পেয়েছে। দর্শন আছে। আমি সঠিক লেআউটটি স্ফীত করি, এটি আমার ডিভাইসে কাজ করে। এলোমেলো ডিভাইসে কাজ না করা কেবল অদ্ভুত।
অ্যারি আগুং

9

আপনি এটিকে btn_Kখুব তাড়াতাড়ি কল করে যাচ্ছেন সেই সময় এটি শূন্য হয়ে যায় এবং আপনাকে নুল পয়েন্টার ব্যতিক্রম দিচ্ছে।

আপনি onActivityCreated()পদ্ধতিতে এই সিন্থেটিক প্লাগইন দ্বারা এই দর্শনগুলি ব্যবহার করতে পারেন যা onCreateView()ফ্রেগমেন্ট লাইফসাইকের ঠিক পরে বলা হয় ।

onActivityCreated()
{
        super.onActivityCreated(savedInstanceState)
        btn_K.setOnClickListener{}
}

আমি কেবল এটি উল্লেখ করতে চাই যে কিছু কারণে, এই উত্তরটি আমার পক্ষে কাজ করেছে যখন গ্রহণযোগ্য উত্তরটি দেয় নি। আমার মতামতগুলি শূন্য onViewCreatedতবে তারপরে সংজ্ঞায়িত onActivityCreated। কেন জানি না।
নাথানল

6

দ্বারা উত্পন্ন কৃত্রিম বৈশিষ্ট্য Kotlin অ্যান্ড্রয়েড এক্সটেনশানগুলি প্লাগইন একটি প্রয়োজন viewজন্য Fragment/Activityহাত আগে সেট হওয়ার।

আপনার ক্ষেত্রে, জন্য Fragment, আপনি ব্যবহার করতে হবে view.btn_KonViewCreated

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    super.onCreateView(inflater, container, savedInstanceState)
    val view = inflater.inflate(R.layout.fragment_card_selector, container, false)
    view.btn_K.setOnClickListener{} // access with `view`
    return view
}

বা আরও ভাল, আপনার কেবলমাত্র সিন্থেটিক বৈশিষ্ট্যে অ্যাক্সেস করা উচিত onViewCreated

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    super.onCreateView(inflater, container, savedInstanceState)
    return inflater.inflate(R.layout.fragment_card_selector, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    btn_K.setOnClickListener{} // access without `view`
}

অনুগ্রহ করে লক্ষ্য করুন যে savedInstanceStateপ্যারামিটারটি অপ্রয়োজনীয় হওয়া উচিত Bundle?এবং সিন্থেটিক বৈশিষ্ট্যগুলি আমদানি করাও চেক করা উচিত

একসাথে নির্দিষ্ট লেআউটের জন্য সমস্ত উইজেটের বৈশিষ্ট্য আমদানি করা সুবিধাজনক:

import kotlinx.android.synthetic.main.<layout>.*

সুতরাং যদি লেআউট ফাইলের নামটি কার্যকলাপ_main.xml হয় তবে আমরা আমদানি করব kotlinx.android.synthetic.main.activity_main.*.

আমরা যদি ভিউতে সিন্থেটিক বৈশিষ্ট্যগুলি কল করতে চাই তবে আমাদেরও আমদানি করা উচিত kotlinx.android.synthetic.main.activity_main.view.*.


3

আপনার একমাত্র কাজটি করা দরকার:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
    rootView.btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }

    return rootView
}

1
হ্যাঁ, শুধু ব্যবহার করুন val view = inflater.inflate() view.button.text = "caption"
কুলমাইন্ড

এটি সেরা উত্তর - নিশ্চিতভাবে নেটিস্ট সমাধান!
ক্যাশেমিউটের বাইরে 21

@ ক্যাচেমিও না এর বাইরে, কারণ এটি এখনও বয়লারপ্লেট কোড rootView.subView.doSomething। এটা তোলে থেকে শুরু ব্যবহারের মতামত ভালোonViewCreated
user924

3

সহকর্মী অবজেক্টটি সংজ্ঞায়িত করার দরকার নেই কেবল প্রতিটি আইডি কল করার মত একটি কল দিয়ে call

 lateinit var mView: View
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    mView=inflater.inflate(R.layout.product_list,container,false)

    mView.addProduct.setOnClickListener {

        val intent=Intent(activity,ProductAddActivity::class.java)
        startActivity(intent)
    }     return mView
}

1

খণ্ডগুলিতে দয়া করে ক্রিয়াকলাপিত তে আপনার কোডটি লিখুন: -

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        return inflater.inflate(R.layout.login_activity, container, false)

    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        callbackManager = CallbackManager.Factory.create()
        initialization()
        onClickLogin()
        onClickForgot()
        onClickSocailLogIn()

  }

1
কেন? কোথায় এই জ্ঞান আছে? onViewCreatedপরিবর্তে কেন ?
কুজডু

0

মন্তব্যে ওটজিইয়ের পরামর্শ অনুসরণ না করা পর্যন্ত আমার ক্ষেত্রে কিছুই কার্যকর হয়নি । পরিষ্কার, পুনর্নির্মাণ (পুনরায় আরম্ভের প্রয়োজন নেই), অ্যাপ্লিকেশনটি আবার চালনা করুন। আমার সাথেও যাওয়ার দরকার ছিল না onActivityCreatedএবং কেবল onCreateViewকৌশলটি করেছিল।

একসময় আমি ভুল লেআউটটি ছড়িয়ে দেওয়ার ত্রুটিও করেছি, সুতরাং প্রত্যাশিত নিয়ন্ত্রণগুলি স্পষ্টতই না পেয়ে।


আমি এটি onActivityCreatedখুব ঘটতে দেখেছি
জেমশিট ইস্কেন্দরভ

0

এটি এগ্রোর নেলিবাবার জবাবটিতে যুক্ত করা, হ্যাঁ আপনি যখনই রেফারেন্স ছাড়াই কোনও ভিউ কল করেন তখন কোটলিনেক্স একটি রুটভিউ সন্ধান করে এবং আপনি যে কোনও খণ্ডের মধ্যে রয়েছেন এবং খণ্ডের কোনও getView()পদ্ধতি নেই। সুতরাং এটি নিক্ষেপ করতে পারেNullPointerException

এ থেকে উত্তরণের জন্য দুটি উপায় রয়েছে,

  • হয় আপনি onViewCreated()উল্লিখিত হিসাবে ওভাররাইড
  • অথবা আপনি যদি অন্য কোনও শ্রেণিতে ভিউ বাঁধতে চান (বেনামে বলুন), আপনি কেবল এই জাতীয় এক্সটেনশন ফাংশন তৈরি করতে পারেন,

    fun View.bindViews(){...}

দ্বিতীয় দৃষ্টিভঙ্গি সহায়ক, যখন আপনার একাধিক আচরণের সাথে একক টুকরো থাকে।


-2
class CardSelectorFragment : Fragment() {


val TAG = javaClass.canonicalName

companion object {
    fun newInstance(): CardSelectorFragment {
        return CardSelectorFragment()
    }
}

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)

    rootView?.findViewById<TextView>(R.id.mTextView)?.setOnClickListener{
        Log.d(TAG, "onViewCreated(): hello world");
    }
    //btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
    return rootView
}

}

** এখানে আপনি btn_K.setOnClickListener ব্যবহার করার আগে ব্যবহার করছেন -আপনি জাভা / কোটলিন কোডে উপাদান ফর্ম এক্সএমএল সন্ধান করতে হবে তারপরে FindViewById ব্যবহার করে এবং তারপরে কেবলমাত্র আপনি সেই ভিউ বা উপাদানটির উপর অপারেশন করতে পারবেন।

-সেই কারণেই আপনি পেয়েছেন নাল পয়েন্টার কার্যকর করা

**

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.