背景资料:
我需要创建一个 SOS 游戏。我决定使用 SOSButton 的 7x7 网格(扩展 AppCompatButton 的按钮)实现网格视图。
问题:
setOnClickListener()
在我的SOSButton
班级内打电话后,我希望看到onClickListener
某种类型的按钮附加到我的按钮上,但是没有。
运行应用程序时,它没有问题,并且显示完美。单击网格中的任何按钮时,不会触发任何侦听器。
单击网格外的任何其他按钮时,它会按预期触发。
注意:我通过在 setOnClickListener() 行之后设置断点来看到这一点,并查看 SOSButton 对象“mListeners = null”
注 2:我试图删除所有不必要的东西并使用一个简单的Button
对象,onClickListener()
如下所示,但无济于事:
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "click occured from main avtivity delcaration", Toast.LENGTH_SHORT).show();
Button b = (Button) view;
String s = b.getText().toString();
switch (s){
case "S" : {
b.setText("O");
break;
}
case "O" : {
b.setText("");
break;
}
case "" : {
b.setText("S");
break;
}
}
}
});
list.add(button);
我试过了:
SOSButton
与onClickListener
中集Button
的构造SOSButton
与onClickListener
中集Button
的构造和GridView.setOnItemClickListener
SOSButton
只有 GridView.setOnItemClickListener
Button
与onClickListener
中集Button
的构造Button
与onClickListener
中集Button
的构造和GridView.setOnItemClickListener
Button
只有 GridView.setOnItemClickListener
以上都没有触发任何侦听器。触发的唯一侦听器是那些不在 gridview 中的按钮。
更多信息:
求救按钮.java
package wrap302.nmu.task1_sos;
import android.content.Context;
import android.support.v7.widget.AppCompatButton;
import android.view.View;
public class SOSButton extends AppCompatButton {
private SO_Select so_select;
public SOSButton(Context context) {
super(context);
so_select = SO_Select.None;
OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View view) {
switch (so_select) {
case None: {
so_select = SO_Select.S;
break;
}
case S: {
so_select = SO_Select.O;
break;
}
case O: {
so_select = SO_Select.None;
break;
}
}
SOSButton.this.update();
}
};
setOnClickListener(onClickListener);
update();
}
private void update(){
setText(so_select.toString());
}
@Override
public String toString() {
return "SOSButton{" +
"so_select=" + so_select.toString() +
'}';
}
}
SO_Select 枚举:
package wrap302.nmu.task1_sos;
public enum SO_Select {
None(""),
S("S"),
O("O");
private String state;
SO_Select(String state) {
this.state = state;
}
@Override
public String toString() {
return state;
}
}
SOSButtonMatch 接口:
package wrap302.nmu.task1_sos;
import android.widget.Button;
interface SOSButtonMatch {
/**
* Interface to check 3 buttons' text and return true if text follows a sequence specified
*
* @param b1 Start button
* @param b2 Middle button
* @param b3 End button
* @return Boolean
*/
boolean check(Button b1, Button b2, Button b3);
}
用于电网的 SOS_Adapter:
package wrap302.nmu.task1_sos;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import java.util.List;
public class SOS_Adapter<T> extends ArrayAdapter<T>{
private int resourceId;
private Context mContext;
private List<T> items;
public SOS_Adapter(Context context, int resource, List<T> objects) {
super(context, resource, objects);
this.mContext = context;
this.items = objects;
this.resourceId = resource;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(resourceId, viewGroup, false);
v.setTag(getItem(i));
Button b = v.findViewById(R.id.sosButton);
b.setText(((SOSButton)getItem(i)).getText());
return b; //runs twice
}
}
主要活动代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initGui();
}
/**
* Initialize gui objects
*/
private void initGui() {
btnDone = (Button) findViewById(R.id.btnDone);
btnExit = (Button) findViewById(R.id.btnExit);
btnReset = (Button) findViewById(R.id.btnReset);
grid = (GridView) findViewById(R.id.grid);
lblGridPosOpen = (TextView) findViewById(R.id.lblGridPosOpen);
lblP1_Score = (TextView) findViewById(R.id.lblP1_Score);
lblP2_Score = (TextView) findViewById(R.id.lblP2_Score);
lblPTurn = (TextView) findViewById(R.id.lblPTurn);
createAdapter();
grid.setAdapter(sos_adapter);
OnItemClickListener clickListener = new OnItemClickListener() { //runs twice
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_SHORT).show();
/*SO_Select so_select = SO_Select.None;
switch (so_select) {
case None: {
so_select = SO_Select.S;
break;
}
case S: {
so_select = SO_Select.O;
break;
}
case O: {
so_select = SO_Select.None;
break;
}
}
Object itemAtPosition = adapterView.getItemAtPosition(i);
SOSButton b = ((SOSButton) itemAtPosition);
b.setText(so_select.toString());*/
}
};
// grid.setOnItemClickListener(clickListener);
Toast.makeText(this, "displaying", Toast.LENGTH_SHORT).show();
}
private void createAdapter() {
List<SOSButton> sosButtons = generateButtons(GRID_SIZE);
sos_adapter = new SOS_Adapter(this, R.layout.sosbutton,sosButtons);
}
private List<SOSButton> generateButtons(int grid_size) {
List<SOSButton> l = new ArrayList<>();
for (int i = 0; i < grid_size; i++) {
SOSButton sosButton = new SOSButton(this);
sosButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "click occured from main avtivity delcaration", Toast.LENGTH_SHORT).show();
}
});
l.add(sosButton);
}
return l;
}
好吧,我在谷歌搜索后找到了解决方案。
让按钮在适配器中响应单击事件并不像向按钮本身添加侦听器那么简单。
在 SOS_Adapter 中,getView()
是添加监听器的地方。
这只需添加:
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button b = (Button) view;
String s = b.getText().toString();
switch (s){
case "S" : {
b.setText("O");
break;
}
case "O" : {
b.setText("");
break;
}
case "" : {
b.setText("S");
break;
}
}
}
});
就在 return
然后一个人会收到一个来之不易的回应。
有人可以解释为什么这需要以一种绕过灌木丛的方式完成吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句