【问题标题】:how to intialize intent in fragment in Kotlin?如何在 Kotlin 的片段中初始化意图?
【发布时间】:2020-10-25 11:02:51
【问题描述】:

我得到一个空指针异常

Logcat:

2020-07-05 10:42:52.821 20008-20008/com.riddhi.nfine E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.riddhi.nfine, PID: 20008
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.riddhi.nfine/com.riddhi.nfine.Income.AddBankFragment}: kotlin.KotlinNullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: kotlin.KotlinNullPointerException
    at com.riddhi.nfine.Income.AddBankFragment.<init>(AddBankFragment.kt:195)
    at java.lang.Class.newInstance(Native Method)
    at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
    at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

此行专用val intent = activity!!.intent 我试图初始化意图,因为片段意图内部显示未解决的错误。 我尝试了各种解决方案,但都无法通过。

我的 Fragment 的全部代码:

@Suppress("DEPRECATION")

class AddBankFragment : Fragment() {

private lateinit var editBankName: EditText
private lateinit var editBankAc: EditText
private lateinit var editBankBalance: EditText
private lateinit var fabSave: FloatingActionButton
private lateinit var bankName: String
private lateinit var bankAc: String
private lateinit var bankBalance: String
private var getBankName:String = ""
private var getBankAc:String = ""
private var getBankBalance:String = ""


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        //columnCount = it.getInt
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_add_bank, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    editBankName = view!!.findViewById(R.id.enter_bank)
    editBankAc = view!!.findViewById(R.id.edit_bank_ac)
    editBankBalance = view!!.findViewById(R.id.edit_bank_balance)
    fabSave = view!!.findViewById(R.id.fab_save)
    checkIntentAndSetData()
    editTextListener()
    getCurrentDateAndTime()

    fabSave.setOnClickListener {

        if (!TextUtils.isEmpty(editBankName.text.toString()) && !TextUtils.isEmpty(
                editBankAc.text.toString()) && !TextUtils.isEmpty(
                editBankBalance.text.toString()
            )
        ) {
            !tilEnterBankName.isErrorEnabled
            !tilEnterBankAc.isErrorEnabled
            !tilEnterBankBalance.isErrorEnabled
            bankName = editBankName.text.toString()
            bankAc = editBankAc.text.toString()
            bankBalance = editBankBalance.text.toString()


            if(Companion.id ==0)
            {
                IncomeRepository.insertBankInDb(bankName, bankAc, bankBalance )
            }
            else{
                IncomeRepository.updateBankInDb(Companion.id,bankName, bankAc, bankBalance)

            }
            getActivity()?.finish()
        }
    }


}

private fun editTextListener() {
    editBankName.addTextChangedListener(textWatcher)
    editBankAc.addTextChangedListener(textWatcher)
    editBankBalance.addTextChangedListener(textWatcher)
}

var textWatcher = object : TextWatcher {
    override fun afterTextChanged(s: Editable?) {
        //Not required to check here
    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        //Not required to check here
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        validation()
    }
}


private fun validation() {
    if (TextUtils.isEmpty(editBankName.text.toString())) {
        tilEnterBankName.isErrorEnabled
        tilEnterBankName.error = getString(R.string.please_enter_bank)

    } else {
        !tilEnterBankName.isErrorEnabled
        tilEnterBankName.error = ""
    }
    if (TextUtils.isEmpty(editBankAc.text.toString())) {
        tilEnterBankAc.isErrorEnabled
        tilEnterBankAc.error = getString(R.string.please_enter_account_number)

    } else {
        !tilEnterBankAc.isErrorEnabled
        tilEnterBankAc.error = ""
    }

    if (TextUtils.isEmpty(editBankBalance.text.toString())) {
        tilEnterBankBalance.isErrorEnabled
        tilEnterBankBalance.error = getString(R.string.please_enter_account_balance)

    } else {
        !tilEnterBankBalance.isErrorEnabled
        tilEnterBankBalance.error = ""
    }
}

@SuppressLint("SimpleDateFormat")
private fun getCurrentDateAndTime(): String {
    var answer=""
    answer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val current = LocalDateTime.now()
        val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy. HH:mm:ss")
        current.format(formatter)
    } else {
        val date = Date()
        val formatter = SimpleDateFormat("MMM dd yyyy HH:mma")
        formatter.format(date)
    }
    return answer
}

private fun checkIntentAndSetData()
{
    if(!TextUtils.isEmpty(intent.getStringExtra("banksName"))) {
        getBankName = intent.getStringExtra("banksName")

    }
    if(!TextUtils.isEmpty(intent.getStringExtra("bankAc"))) {
        getBankAc = intent.getStringExtra("bankAc")
    }
    if(!TextUtils.isEmpty(intent.getStringExtra("bankBalance"))) {
        getBankBalance = intent.getStringExtra("bankBalance")
    }
    Companion.id = intent.getIntExtra("id",0)



    if(!TextUtils.isEmpty(getBankName)){
        editBankName.setText(getBankName)
        editBankAc.setText(getBankAc)
        editBankBalance.setText(getBankBalance)
    }

}

val intent = activity!!.intent!!

companion object {
    private var id: Int = 0
}

}

【问题讨论】:

    标签: android android-fragments kotlin nullpointerexception


    【解决方案1】:

    在附加片段之前,您不能调用getActivity(即val intent = activity!!.intent!! 中的activity) - 即在onAttach(Context)onCreate() 或之后的任何方法中。因此,您可以将您的意图设为 lateinit var 并在您的 onCreate() 方法中对其进行初始化:

    private lateinit var intent: Intent
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        intent = activity!!.intent!!
    }
    

    请注意,如果您使用 requireActivity() 而不是 activity!!,您会收到一条更具描述性的错误消息,该消息会告诉您它为空的确切原因(片段尚未附加)。

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多