【问题标题】:why onClickListener does not work in my fragment activity?为什么 onClickListener 在我的片段活动中不起作用?
【发布时间】:2021-06-23 07:26:08
【问题描述】:

我是编程新手,在我的 FragmentHome.kt 中添加 onClickListener 时遇到了困难

我将此代码添加到我现有的活动中:

val exc  = this.findViewById<Button>(R.id.execute)
    exc.setOnClickListener {
        Toast.makeText(this, "You clicked me.", Toast.LENGTH_SHORT).show()
    }

我尝试在空白活动上设置 onClicklistener 并且它有效,但是当我将它添加到现有活动时 片段活动它什么都不做(它应该显示带有一些文本的吐司) 我没有看到任何错误消息,所以我不知道问题出在哪里。

感谢您的回复。

enter code here
public class FragmentHome : Fragment() {


public class HomeFragmentElements : AppCompatActivity() {

    private lateinit var spinView: Spinner


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


        val exc  = this.findViewById<Button>(R.id.execute)
        exc.setOnClickListener {
            Toast.makeText(this, "You clicked me.", Toast.LENGTH_SHORT).show()
        }
        
        

        spinView = findViewById(R.id.spinner)
        spinView.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                TODO("Not yet implemented")
            }

            override fun onNothingSelected(parent: AdapterView<*>?) {
                TODO("Not yet implemented")
            }

        }


    }
}

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


    }


}
enter code here

【问题讨论】:

    标签: kotlin onclicklistener


    【解决方案1】:

    尝试将您的代码放入“onViewCreated”:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val exc  = this.findViewById<Button>(R.id.execute)
        exc.setOnClickListener {
            Toast.makeText(this, "You clicked me.", Toast.LENGTH_SHORT).show()
        }
    }
    

    onViewCreated 在“onCreateView”之后执行。视图绑定和初始化应该在 onViewCreated 中

    【讨论】:

      【解决方案2】:

      在您的 onCreateView 中更改以下内容

      override fun onCreateView(
                  inflater: LayoutInflater, container: ViewGroup?,
                  savedInstanceState: Bundle?
              ): View? {
                  // Inflate the layout for this fragment
                  val view: View = inflater.inflate(R.layout.fragment_home, container, false)
          collectId(view)
                  return view
          
          
              }
      
          fun collectId(view: view){
          val exc  = view.findViewById<Button>(R.id.execute)
                  exc.setOnClickListener {
                      Toast.makeText(this, "You clicked me.", Toast.LENGTH_SHORT).show()
                  }
          }
      

      你可以考虑用 viewBinding 代替 findViewById

      【讨论】:

        【解决方案3】:

        看起来您已经在 Fragment 类的定义中定义了一个 AppCompatActivity 子类,有点像这样:

        class MyFragment: Fragment {
        
            class MyActivity: AppCompatActivity() {
        
                //...
         
            }
        
        }
        

        以嵌套方式定义非inner 类的能力纯粹是一种代码组织工具。您的 Fragment 和 Activity 类之间绝对没有任何联系。上面的代码与你这样做没有什么不同,每个类都在一个完全不同的文件中:

        class MyFragment: Fragment {
        
        }
        
        class MyActivity: AppCompatActivity() {
        
        }
        

        将 Activity 视为 Fragment 的子级也是没有意义的。 Fragment 是 Activity 的一部分,所以反过来。

        除了对setContentView() 的调用之外,您在此Activity 的onCreate 中拥有的所有代码都应放在Fragment 的onViewCreated() 函数中,因为这就是您覆盖onCreateView() 所做的事情。并移除未使用的嵌套 Activity 类。

        此外,如果您只是扩展布局并返回它,则无需覆盖 onCreateView。您可以像这样将布局直接放在超级构造函数调用中:

        public class FragmentHome : Fragment(R.layout.fragment_home) {
        
            private lateinit var spinView: Spinner
        
            override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                super.onViewCreated(view, savedInstanceState)
        
                // your view setup code
        
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多