第一次单击时Android设置按钮颜色,第二次单击时取消设置

时间:2014-09-15 15:52:55

标签: android button colors

我需要帮助。 我在这里搜索过,但我看到的答案对我不起作用,帖子很旧,功能大多已经弃用了。

我试图在单击时设置按钮的颜色以突出显示它们,并在第二次单击时取消设置颜色。这就像从多个按钮中做出选择一样,如果我再次点击一个选定的按钮,也许在改变我的选择之后,颜色应该恢复为默认值。所以我只剩下所选按钮突出显示。 这些按钮是使用gridview中的适配器生成的,onclicklistener适用于所有这些按钮。 我使用的代码如下所示:

public class ButtonAdapter extends BaseAdapter {  
         private Context context;            

         public View getView(int position, View convertView, ViewGroup parent) 

         {            
             final Button btn;  
          if (convertView == null) {    

           btn = new Button(context);  
           btn.setLayoutParams(new GridView.LayoutParams(40, 40));  
           btn.setPadding(2, 2, 2, 2);  
           }   
          else {  
           btn = (Button) convertView;  
          }  
          //exus

          btn.setText(Integer.toString(gridNumbers[position]));   

          btn.setTextColor(Color.BLACK);               
          btn.setId(position);
          btn.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //btn.setBackgroundColor(Color.GREEN);
                //Toast.makeText(getBaseContext(),  "Button clicked", Toast.LENGTH_LONG).show();

                if (v.getSolidColor()!=Color.GREEN)
                {
                    btn.setBackgroundColor(Color.GREEN);            

                }
                else
                {
                    btn.setBackgroundColor(Color.GRAY);
                }

            }
        });

          return btn;  
         }  
        }
}

我的XML:

<GridView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="8"
        android:columnWidth="20dp"          
        android:stretchMode="columnWidth"           
        android:gravity="center" />

4 个答案:

答案 0 :(得分:1)

您可以使用布尔属性列表而不是这样做。 在你的类中设置一个公共布尔列表(它应该是公共的,在任何函数之外,否则onclicklistener会有错误)

List<boolean> blist=new Arraylist<boolean>(Size);

//Size is maximum number of buttons

int index;

然后,无论何时创建新按钮,都要添加:

blist.add(index,false);
index++;

在onclicklistener中;从其位置找到按钮的索引,并将索引保​​存在名为pos。

的整数中
if(blist.get(pos)==false)
{
 //not clicked yet
 blist.remove(pos);
blist.add(pos,true);
//here write the code u need for this if
}
else
{
blist.remove(pos);
blist.add(pos,false);
//todo: ur code for else
}

答案 1 :(得分:0)

使用toggle button代替普通按钮。喜欢

<ToggleButton 
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/check"   //check.xml
        android:layout_margin="10dp"
        android:textOn=""
        android:textOff=""
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_centerVertical="true"/>

然后在drawable文件夹中创建一个xml文件check.xml,如

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/selected_image"
          android:state_checked="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/unselected_image"
        android:state_checked="false"/>

</selector>

refrence

答案 2 :(得分:0)

在GridView中重复使用的视图。因此,您应该为基本适配器中的按钮定义状态。

获取一个将保存所选索引的ArrayList,并在未选择网格时将其删除。

例如:

ArrayList<Integer> selectedItems;

在Construtor中

selectedItems = new ArrayList<Integer>();

在OnClickListener

public void onClick(View v) {
if (selectedItems.contains(new Integer(position))) {
     selectedItems.remove(new Integer(position));
     notifyDataSetChanged();    
} else {
    selectedItems.add(new Integer(position));
    notifyDataSetChanged();
}
}

在getView()中:

if (selectedItems.contains(new Integer(position))) {
         btn.setBackgroundColor(Color.GREEN);    
    } else {
        btn.setBackgroundColor(Color.GRAY); 
    }

答案 3 :(得分:0)

我试过这种方式,如果你想点击

,它对我有用
counter = 1;
        //By Default set color
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (counter == 1)
                {
                   // Default color
                    counter = 2;
                }
                else
                {
                    //your color
                    counter = 1;
                }
            }
        });