在android中添加自定义视图阵列并设置onClickListener互斥

时间:2017-02-02 22:04:41

标签: android arrays view onclicklistener

我正在使用数组添加自定义视图。数组元素通过膨胀布局并将这些元素添加到ViewGroup来初始化,如图所示。 当我设置onClickListener以使点击的视图背景为强调色时它会发生,但为了使其互相排斥,以便一旦点击一个视图,其他视图' s背景应该变得透明,因为它们最初我使用了以下代码但是当我点击View时,我的应用程序停止响应。如果我的方法不正确请建议我获得所需结果的正确方法。

这应该发生:

enter image description here

这不应该发生:

enter image description here

if(noOfChild>1) {
        for (j = 0; j < noOfChild; j++) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
            childButton[j] = (inflater.inflate(R.layout.child_selection_button, null));
            childButton[j].setId(j);
            children.addView(childButton[j], new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f));
            childButton[j].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    v.setBackgroundColor(ContextCompat.getColor(MainScreen.this, R.color.dimAccent));
                    //   for (int k =0;k<noOfChild;k++){
                    //       while(k!=v.getId()){
                    //           childButton[k].setBackgroundColor(ContextCompat.getColor(MainScreen.this, R.color.transparent));
                    //       }
                    //   }
                }
            });
        }
    }

1 个答案:

答案 0 :(得分:1)

您可以保留一个显示最后一个选定项目位置的局部变量。然后在你的onClick()方法中切换位置和backgroundColor:

private View lastSelected;

//... rest of code ...

//Inside for loop
public void onClick(View v){
      if (lastSelected == null){
           lastSelected = v;
           selectItem(lastSelected);
      }
      else
      {
      deselectItem(lastSelected);
      lastSelected = v;
      selectItem(lastSelected);
      }
}

private void selectItem(View v){
     v.setBackgroundColor(ContextCompat.getColor(MainScreen.this,R.color.dimAcent));
}

private void deselectItem(View v){
      v.setBackgroundColor(ContextCompat.getColor(MainScreen.this, R.color.transparent));
}