单击行布局切换复选框

时间:2014-11-15 16:35:27

标签: android checkbox focus

我有一个自定义的LinearLayout视图,其中只包含TextView和CheckBox。当选择布局的任何部分时,我似乎无法切换复选框。我一直在搜索,我看到的大部分内容都是将CheckBox上的可聚焦属性设置为false,这已经完成了。

我有一个类似的组件,有两个文本视图,而onClick可以工作。

布局:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="beforeDescendants"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/probe_item_label"
        style="@style/Probe.Item.Text.Label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:layout_marginBottom="3dp"
        android:layout_weight="0" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <CheckBox
        android:id="@+id/probe_item_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_weight="0"
        android:focusable="false"
        android:focusableInTouchMode="false" />

</LinearLayout>

类别:

public class ProbeItemCheckBox extends LinearLayout
{
   LinearLayout mLayout = null;
   TextView mLabelTextView = null;
   CheckBox mCheckbox = null;

   Context mContext = null;

   public ProbeItemCheckBox(Context context)
   {
      super(context);
   }
   public ProbeItemCheckBox(Context context, AttributeSet attrs)
   {
      super(context, attrs);

      mContext = context;

      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProbeText);

      final String labelText = a.getString(R.styleable.ProbeText_labelText);

      String service = Context.LAYOUT_INFLATER_SERVICE;
      LayoutInflater li = (LayoutInflater) getContext().getSystemService(service);

      mLayout = (LinearLayout) li.inflate(R.layout.probe_item_checkbox, this, true);

    //  layout.setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);

      mLabelTextView = (TextView)mLayout.findViewById(R.id.probe_item_label);
      mCheckbox = (CheckBox)mLayout.findViewById(R.id.probe_item_checkbox);

      mCheckbox.setFocusable(false);
      mCheckbox.setFocusableInTouchMode(false);

      mLabelTextView.setText(labelText);
      mLabelTextView.setClickable(false);

      mCheckbox.setClickable(false);
      mLayout.setClickable(true);

      mLayout.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View v)
         {
            mCheckbox.toggle();   

         }

      });
      a.recycle();
   }
...
}

您可以提供任何帮助。

2 个答案:

答案 0 :(得分:0)

可能会将新的OnClickListener()更改为setOnClickListener中的新View.OnClickListener()。

参考:how to set onClick method with linearLayout?

答案 1 :(得分:0)

我得到了它的工作。我必须通过ID在xml文件中找到顶级LinearLayout,并在该对象上设置onClickListener。

在布局文件中添加了ID:

LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/probe_item_checkbox_item_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/btn_settings"
    android:descendantFocusability="beforeDescendants"
    android:orientation="horizontal"
    style="@style/Probe.Item.Layout" >

然后在java文件中按ID查找:

  mLayout = (LinearLayout) li.inflate(R.layout.probe_item_checkbox, this, true);

  mLayout2 = (LinearLayout) findViewById(R.id.probe_item_checkbox_item_layout);

在mLayout2

上设置点击监听器