GVKun编程网logo

在Kotlin中实现(/ inherit /〜extend)批注

10

本文的目的是介绍在Kotlin中实现的详细情况,特别关注/inherit/〜extend批注的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解在Kotlin中实现的机会

本文的目的是介绍在Kotlin中实现的详细情况,特别关注/ inherit /〜extend批注的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解在Kotlin中实现的机会,同时也不会遗漏关于Android Kotlin recyclerview with EditText、Android Kotlin RXKotlin Room - 错误 Kotlin.unit、android – FragmentManager在Kotlin中抛出IllegalArgumentException、android – Kotlin inheritnce – 没有为参数上下文传递值的知识。

本文目录一览:

在Kotlin中实现(/ inherit /〜extend)批注

在Kotlin中实现(/ inherit /〜extend)批注

在Java中,我可以“实现”注释。

示例Java注释:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface JavaClassAnno {  String[] value();}

示例Java“实现”:

class MyAnnotationLiteral                   extends AnnotationLiteral<JavaClassAnno>                   implements JavaClassAnno { // <--- works in Java  private String value;  public MyAnnotationLiteral(String value) {    this.value = value;  }  @Override  public String[] value() {    return new String[] { value };  }}

尝试将其移植到Kotlin无效,因为它说注释是最终的,因此不能被继承,即以下内容将不起作用:

class MyAnnotationLiteral(private val internalValue: String)                  : AnnotationLiteral<JavaClassAnno>(),                    JavaClassAnno { // <--- doesn''t work in Kotlin (annotation can not be inherited)  override fun value(): Array<String> {    return arrayOf(internalValue)  }}

您如何以Kotlin方式“实现/扩展”注释?找不到Kotlin在Java方面有所不同的任何原因。欢迎提供任何有关如何解决该问题的提示,也欢迎任何告诉您原因的信息。

以下问题包含此星座的用例:动态激发CDI事件,其成员带有qualifier。基本上,您需要类似这样的内容来缩小应基于其成员触发的限定符。

请注意,这也将适用于Kotlin批注,并且似乎Kotlin批注似乎无法打开,因此也无法实现/扩展。

到目前为止,我发现的是@Inherited一个问题:

  • https://discuss.kotlinlang.org/t/inherited-annotations-and-other-reflections-enchancements/6209
  • https://youtrack.jetbrains.com/issue/KT-22265

但是我没有找到为什么注释不能像Java中那样实现/继承的任何原因。

我现在也在这里问了这个问题:https : //discuss.kotlinlang.org/t/implement-
inherit-extend-annotation-in-
kotlin/8916

更新:最后,我发现了有关此设计决策的内容,即下一个问题(在我为此打开自己的问题时):注释继承。禁止或正确实施。似乎该决定是“禁止”该决定的,即使没有(可见的)评论,讨论或该决定的其他来源。

添加了以下问题:https :
//youtrack.jetbrains.com/issue/KT-25947

答案1

小编典典

从Kotlin
1.3开始,不支持这种情况。要创建注释的自定义实例,现在必须使用Java。做出此设计决定的原因之一是,制作注释接口过于特定于JVM,并且无法很好地映射到其他平台。

Android Kotlin recyclerview with EditText

Android Kotlin recyclerview with EditText

如何解决Android Kotlin recyclerview with EditText?

我有一个 recyclerview,其中每个视图都包含一个 TextView 和一个 EditText。我被卡住的部分是当我开始在任何行的 EditText 框中键入时,它会自动更新列表下方的另一行。我知道这是由于 recyclerview 的整个回收方面而发生的,并且相同的视图被重新用于更下方的行。我只是不知道如何正确实现这一点。

解决方法

class TodoAdapter(private val tasks : List<TodoItem>) : RecyclerView.Adapter<TodoAdapter.ViewHolder>() {

    inner class ViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
        var editText = view.findViewById<EditText>(R.id.edit_text)


        init {
            editText.addTextChangedListener(object : TextWatcher{
                override fun afterTextChanged(s: Editable?) {
                    tasks[adapterPosition].task = s.toString()
                }

                override fun beforeTextChanged(s: CharSequence?,start: Int,count: Int,after: Int) {

                }

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

                }

            })
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.todo_item,parent,false)
        return ViewHolder(view)
    }

    override fun getItemCount() = tasks.size

    override fun onBindViewHolder(holder: ViewHolder,position: Int) {

        val item = tasks[position]
        holder.editText.setText(item.task)
    }
}

class TodoItem(var task: String = "")

 editText.addTextChangedListener(object TextWatcher() {
    
       override fun afterTextChanged(s : Editable) {
          item.textFieldValue = s.toString()
       }
  });

将 textChangeListener 放在 init 块中,这应该可以工作

,

@MuhammadAhmed

数据类

from P4 import P4

class LLL:
    p4 = P4()
    p4.host = "192.168.1.22:1666"
    p4.user = "asdsds"
    p4.client = "asddsdd"
    p4.password = "asdsddsd"
    p4.connect()
    p4.run_login()

适配器

class todolist(var hours: String,var task: String)

Android Kotlin RXKotlin Room - 错误 Kotlin.unit

Android Kotlin RXKotlin Room - 错误 Kotlin.unit

如何解决Android Kotlin RXKotlin Room - 错误 Kotlin.unit?

我想通过循环数组向房间数据库做一个简单的插入数据。 我使用 RXKotlin 来迭代数组 我有一个这样的数组:

fun defaultDataCategory() : ArrayList<CategoryModel>{
        var cat: CategoryModel
        var catArrayList: ArrayList<CategoryModel> = ArrayList(0)
        val date: Int = Calendar.DATE
        val formatedDate = SimpleDateFormat("yyyy-MM-dd").format(Date())
        val formatedTime = SimpleDateFormat("HH:mm").format(Date())
        val DateTime = "$formatedDate  $formatedTime"

        catArrayList.add(
            CategoryModel(
                1,"Personal",true,"Red",Converter.toDate(Calendar.getInstance().timeInMillis),"system","system"
            )
        )

        catArrayList.add(
            CategoryModel(
                2,"Work","Blue","system"
            )
        )

        catArrayList.add(
            CategoryModel(
                3,"Home","Purple","system"
            )
        )

        catArrayList.add(
            CategoryModel(
                4,"Learn","Yellow","system"
            )
        )
       return catArrayList
    }

我像这样用 RXKotlin 循环了一个数组

var catArrayList: ArrayList<CategoryModel> = DefaultData.defaultDataCategory()

        catArrayList.toObservable()
            .subscribeBy(  // named arguments for lambda Subscribers
                onNext = { homeviewmodel.insertCategory(it) },onError = { Log.e("error insert=",it.printstacktrace().toString()) },onComplete = { Log.e("complete insert=","complete insert") }
            )

我得到了一个错误“kotlin.unit”。

Error RXKotlin

如何使用 RXKotlin 迭代数组并插入房间数据库?

解决方法

试试

Observable.fromIterable(catArrayList).subscribeBy {...}

android – FragmentManager在Kotlin中抛出IllegalArgumentException

android – FragmentManager在Kotlin中抛出IllegalArgumentException

我的片段中有以下方法

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

    val fm = childFragmentManager
    var prefsFragment: PrefsFragment? = fm.findFragmentByTag(tableName) as PrefsFragment?
    if (prefsFragment == null) {
        prefsFragment = PrefsFragment()
        val ft = fm.beginTransaction()
        ft.add(R.id.parameters_fragment_container,prefsFragment,tableName)
        ft.commit()
        fm.executePendingTransactions()
    }
}

我不得不说这是Java-> Kotlin自动翻译器对我以前的Java代码所做的事情(除了我在标签上找到PrefsFragment的行末尾的?),所以它可能不完全是犹太教.我正在学习Kotlin.

现在,当我调用executePendingTransactions()时,我的应用程序崩溃抛出java.lang.IllegalArgumentException,并显示错误消息“参数指定为非null为null:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数savedInstanceState”.现在,是的,savedInstanceState实际上是null,但它与显然抛出异常的调用有什么关系呢?我确保没有其他值/变量为空,所以我相信错误信息……但为什么呢?

编辑这是堆栈跟踪,以及让我做恶梦的源代码

https://gist.github.com/Morpheu5/8ec7e2064f53679405769b43c64f2cb7

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: net.morpheu5.bleedingscorecalculator,PID: 2685
                  java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,parameter savedInstanceState
                      at net.morpheu5.bleedingscorecalculator.CalculatorScreen$PrefsFragment.onCreatePreferences(CalculatorScreen.kt:0)
                      at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:223)
                      at android.support.v4.app.Fragment.performCreate(Fragment.java:2075)
                      at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1060)
                      at android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:838)
                      at android.support.v4.app.BackStackRecord.calculateFragments(BackStackRecord.java:861)
                      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:719)
                      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
                      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:594)
                      at net.morpheu5.bleedingscorecalculator.CalculatorScreen.onActivityCreated(CalculatorScreen.kt:34)
                      at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2096)
                      at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1138)
                      at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1295)
                      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                      at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643)
                      at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                      at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
                      at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                      at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:703)
                      at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                      at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1367)
                      at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:768)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
                      at android.view.View.measure(View.java:19857)
                      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
E/AndroidRuntime:     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:686)
                      at android.view.Choreographer.doFrame(Choreographer.java:621)
                      at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:860)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

解决方法

该异常实际上并非来自该代码.它来自您的CalculatorScreen.PrefsFragment.onCreatePreferences()方法.如果你看那里,看起来像 –

覆盖fun onCreatePreferences(savedInstanceState:Bundle,rootKey:String)

并且它应该是以下允许savedInstanceState为null –

覆盖fun onCreatePreferences(savedInstanceState:Bundle?,rootKey:String)

android – Kotlin inheritnce – 没有为参数上下文传递值

android – Kotlin inheritnce – 没有为参数上下文传递值

我正在尝试使用kotlin为 android构建一个AccountAuthenticator类.但是在尝试实现AbstractAccountAuthenticator类时,我在编译时遇到以下异常:

没有为参数上下文传递值

我不完全确定它意味着什么,也找不到任何解决方法.

这是相关代码:

import android.accounts.AbstractAccountAuthenticator
import android.accounts.Account
import android.accounts.AccountAuthenticatorResponse
import android.os.Bundle

class AccountAuthenticator: AbstractAccountAuthenticator() {}

有谁知道这意味着什么,为什么,以及如何解决它?

解决方法

AbstractAccountAuthenticator的 constructor采用Context上下文参数.因此,您必须以某种方式将Context传递给它,例如,您的AccountAuthenticator也可能具有Context参数:

class AccountAuthenticator(context: Context): AbstractAccountAuthenticator(context) {}

我们今天的关于在Kotlin中实现/ inherit /〜extend批注的分享就到这里,谢谢您的阅读,如果想了解更多关于Android Kotlin recyclerview with EditText、Android Kotlin RXKotlin Room - 错误 Kotlin.unit、android – FragmentManager在Kotlin中抛出IllegalArgumentException、android – Kotlin inheritnce – 没有为参数上下文传递值的相关信息,可以在本站进行搜索。

本文标签: