2017-07-29 57 views
0

背景信息:按钮在GridView控件不响应onClickListener

我需要创建一个SOS游戏。我决定使用7x7的SOSButtons网格(按钮扩展AppCompatButton)实现网格视图。


问题:

SOSButton类中调用setOnClickListener()后,我希望看到某种附加到我的按钮的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); 

我尝试:

  • SOSButtononClickListenerButton构造
  • SOSButtononClickListenerButton构造和GridView.setOnItemClickListener
  • SOSButton只有GridView.setOnItemClickListener
  • ButtononClickListenerButton构造
  • ButtononClickListener集我ñButton构造和GridView.setOnItemClickListener
  • Button只有GridView.setOnItemClickListener

无上述发射任何监听器。唯一的侦听器是非GridView中的按钮。


更多信息:

SOSButton。的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 
    } 
} 

MainActivity代码:

@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; 

} 

回答

0

好吧,我发现了solution之后多了一些谷歌搜索。

在适配器中获取按钮以响应点击事件并不像向侦听器本身添加侦听器那么简单。

在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

权然后一个临危一个触摸的辛苦赚来的响应。

有人能解释为什么这需要在殴打的方式?

+0

对不起,我无法解释为什么需要这样做。很高兴你能解决你的问题。你能接受这个答案,所以很明显这个问题已被回答? – Gary99