在android(Kotlin)中点击时如何参考按钮视图



所以这就是我所指的按钮:

<Button
android:id="@+id/btnBR"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:backgroundTint="#e6ebf2"
android:onClick="setLetter"
app:layout_constraintBottom_toBottomOf="@+id/btnBM"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btnBM"
app:layout_constraintTop_toBottomOf="@+id/btnMR" />

在我的MainActivity文件中,我试图创建一个函数,该函数将更改单击它的按钮的文本。我有9个不同的按钮(试图制作井字游戏(,所有按钮都需要相同的功能。

package brianmason.example.tictactoe
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import brianmason.example.tictactoe.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
fun setLetter(view: View){
//Trying to do the equivalent of this.setText("X") however this seems to be referring to the MainActivity and not the view. view.setText("X") also does not work.
}
}

使用setText函数时,我可以做些什么来引用正在单击的按钮?

声明一个变量private var player1Turn = true,我们将使用该变量来检查轮到谁,并相应地标记"X〃;以及";O〃;在按钮上

在每个按钮上设置onClickListner,如下所示

binding.button1.setOnClickListner{
if(button1.text != "") return@setOnClickListener
else if(player1Turn) {
button1.text = "X"
player1Turn = !player1turn
}
else {
button1.text = "O"
player1Turn = !player1turn
}
}

注意:我使用";X〃;对于播放器1;O〃;适用于玩家2。
请告诉我它是否有效。

您可以做的是将view强制转换为Button,然后设置文本。像这样:

fun setLetter(view: View){
(view as Button).text = "X"
}

或者,这就是你可以做的。在你的xml布局中,将所有按钮中的onClick属性更改为以下内容,并添加一个数据标签:

<data>
<variable name="mainViewModel"
type="com.example.yourappname.MainViewModel"/> <!-- The path to your ViewModel class> 
</data>
<!-- The parameter of handleClick function takes a value to identify each button. Makes sure it is unique for each button -->
<Button
...
<!--The 1 donates the unique parameter to identify the button -->
android:onClick='@{() -> mainViewModel.handleClick("1")}'/>
<Button
...
android:onClick='@{() -> mainViewModel.handleClick("2")}'/>

然后创建一个ViewModel来处理点击:

class MainViewModel: ViewModel() {
//private data so that we can only modify it inside this class 
private val _buttonText = MutableLiveData<String>()
//exposable data so that we can observe its changes later
val buttonText = _buttonText as LiveData<String>

/**
*This is the function that will handle the clicks from the layout
**/
fun handleClick(string: String) {
when (string) {
// the value for buttonText can be anything here
"1" -> _buttonText.value = "Button One clicked"  //Can be "X"
"2" -> _buttonText.value = "Button Two clicked"   //Can be "O"
"3" -> _buttonText.value = "Button Three clicked"  //etc
"4" -> _buttonText.value = "Button Four clicked"
...
...
}
}
}

现在,在MainActivity中的onCreate方法中,添加以下

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding =  DataBindingUtil.setContentView<ActivityMainBinding>(this@MainActivity, R.layout.activity_main)
//Get the ViewModel
val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.mainViewModel = mainViewModel    //Bind the ViewModel
binding.lifecycleOwner = viewLifecycleOwner //Set the lifecycleOwner

//Observe the change made to the buttonText in the ViewModel and display its value as a Toast
mainViewModel.buttonText.observe(viewLifecycleOwner, {
Toast.makeText(this@MainActivity, it, Toast.LENGTH_SHORT).show()
//You can also modify the button text here
})

}
}

最新更新