【问题标题】:ImageButton OnClickListener not workingImageButton OnClickListener 不起作用
【发布时间】:2017-06-17 18:16:24
【问题描述】:

所以我在片段中有以下 ImageButton:

<ImageButton
            android:id="@+id/moneyBtn"
            style="@android:style/Widget.Holo.Light.ImageButton"
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="40dp"
            android:scaleType="fitCenter"
            android:adjustViewBounds="true"
            android:src="@drawable/monkey"
            android:background="@null"/>

还有下面的fragmentActivity.kt

class Home : Fragment()  {

    override public fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view: View? = inflater.inflate(R.layout.fragment_home, container, false)
        val moneyButton: ImageButton = view?.findViewById(R.id.moneyBtn) as ImageButton


        val result = MyAppApplication()
        var money = result.money

        moneyButton.setOnClickListener(View.OnClickListener {
            Toast.makeText(activity, "TESTING BUTTON CLICK 1", Toast.LENGTH_SHORT).show()
        })


        return view
    }

我也尝试使用“普通”的 Kotline setOnClickListener

moneyButton.setOnClickListener {
            Toast.makeText(activity, "TESTING BUTTON CLICK 1", Toast.LENGTH_SHORT).show()
        }

应用程序崩溃和冻结,它只是不工作

我也尝试用 throw 替换 Toast,但这也不会被执行。 也许你能找到我的错误?

【问题讨论】:

  • 您介意发布打开片段的 Activity 类吗?
  • 我没有任何理由认为该方法在该 UI 的其他线程中运行,但我找不到任何理由。尝试使用 runOnUiThread 在 UI 线程中运行 Toast

标签: android kotlin imagebutton


【解决方案1】:

尝试在onActivityCreated 中初始化您的点击监听器。它在onCreateView 之后调用,所以它会确保view 被夸大了。

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

    val moneyButton: ImageButton = activity.findViewById(R.id.moneyBtn) as ImageButton
    moneyButton.setOnClickListener {
        Toast.makeText(activity, "TESTING BUTTON CLICK 1", Toast.LENGTH_SHORT).show()
    }
}

【讨论】:

  • 它在一个片段中:/
  • @Foose 可以通过在您的Fragment 中调用activity.findViewById(resId) 来获取视图元素。
【解决方案2】:

遇到了同样的问题,可以用下面的代码来解决:

在你的Fragment:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View? {

            val rootView = inflater.inflate(R.layout.fragment_home, container, false)
            val imgViewButton = rootView.findViewById<ImageButton>(R.id.moneyBtn) // Use the current view

            imgViewButton?.setOnClickListener() {

            Toast.makeText(activity, "Clicked!", Toast.LENGTH_SHORT).show()

        }


        return rootView
  }

原因是 View 我们没有以正确的方式得到它。但是,使用这些代码,它会设置当前的View,然后返回完美运行的视图。

【讨论】:

    【解决方案3】:

    奇怪,我刚刚在我的平台上尝试了你的代码 sn-ps,并且 Toast 弹出就好了...尝试将 Toast 的第一个 arg 更改为 view.context ,它看起来像这样:

    Toast.makeText(view.context, "TESTING BUTTON CLICK 1", Toast.LENGTH_SHORT).show()
    

    如果有影响,请告诉我。

    【讨论】:

      【解决方案4】:

      首先,你知道这段代码被执行了吗?那监听器设置好了吗?也许尝试使用 Log 类(在 Kotlin 中应该与在 Java 中相同)。
      另外,

      val result = MyAppApplication()
      var money = result.money
      

      在我看来很可疑。您是否正在尝试创建新的应用程序实例?

      【讨论】:

      • 是的,其他一切工作正常,日志确认:/ 我正在使用 Application Inst 存储“全局”变量,这也工作正常。删除此代码不会改变任何内容
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      相关资源
      最近更新 更多