【问题标题】:Difference between protected and without受保护与无保护的区别
【发布时间】:2017-06-18 16:41:20
【问题描述】:

大家好,我在 Kotlin for Android 中有这段代码,但我不知道为什么它不起作用。这是我的代码:

package com.test.tictac

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    protected fun buClick(view: View) {
        val buSelected = view as Button
        var cellID = 0
        when(buSelected.id) {
            R.id.bu1->cellID = 1
            R.id.bu2->cellID = 2
            R.id.bu3->cellID = 3
            R.id.bu4->cellID = 4
            R.id.bu5->cellID = 5
            R.id.bu6->cellID = 6
            R.id.bu7->cellID = 7
            R.id.bu8->cellID = 8
            R.id.bu9->cellID = 9
        }

        Toast.makeText(this,"ID:"+ cellID, Toast.LENGTH_LONG).show()
    }
}

我尝试了很多东西,据我说,当我删除 buClick 函数的保护时,它可以工作,但是有没有办法使 protected 可以工作?非常感谢!

PS:这是xml:

<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="center"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.tictac.MainActivity">

    <TableRow
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/bu1"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />

        <Button
            android:id="@+id/bu2"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />

        <Button
            android:id="@+id/bu3"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />
    </TableRow>

    <TableRow
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/bu4"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />

        <Button
            android:id="@+id/bu5"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />

        <Button
            android:id="@+id/bu6"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />
    </TableRow>

    <TableRow
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/bu7"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />

        <Button
            android:id="@+id/bu8"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />

        <Button
            android:id="@+id/bu9"
            android:layout_width="40pt"
            android:layout_height="40pt"
            android:layout_marginRight="3pt"
            android:onClick="buClick" />
    </TableRow>
</TableLayout>

【问题讨论】:

  • protected 修饰符意味着该方法将对此类及其子类可见。你的 MainActivity 类是 final 的(因为 Kotlin 中的类默认是 final 的),所以它没有任何子类,在这里使用 protected 没有任何意义(即使它有效)。

标签: android android-layout android-studio kotlin


【解决方案1】:

android:onClick 将方法名作为值。

此名称必须对应于只采用一个 View 类型参数的公共方法。

在方法中添加protected 会降低框架所需的public 的可见性。

【讨论】:

    【解决方案2】:

    它与访问修饰符有关。受保护的方法只能被子类(扩展该方法所在的类的类)或同一包中的其他类看到。正如@tynn 已经提到的, android:onClick 要求调用的方法是公共的,否则它将无法使用它。 我建议您详细了解访问修饰符以及何时使用它们。

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 2016-03-08
      • 1970-01-01
      • 2017-12-19
      • 2014-04-26
      • 2020-03-31
      • 1970-01-01
      • 2010-10-27
      • 2012-10-13
      相关资源
      最近更新 更多