Android onClickListener无法在复合视图中使用

时间:2016-04-11 13:54:23

标签: android android-layout onclicklistener android-imagebutton

我有一个带有以下xml和代码的复合视图。

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageButton
        android:id="@+id/attachment"
        android:background="@drawable/ic_attach"
        android:layout_width="48dp"
        android:layout_height="48dp"/>

    <EditText
        android:id="@+id/message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:maxLines="3"
        android:layout_weight="0.8"
        android:hint="@string/chatBoxHint"
        android:inputType="textMultiLine|textCapSentences"
        android:paddingLeft="8dp"/>

    <ImageButton
        android:id="@+id/send"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="12dp"
        android:src="@drawable/ic_send"/>

</merge>

代码:

public class TextUserInputView extends LinearLayout implements View.OnClickListener{
    private EditText mMessage;

    public TextUserInputView(Context context){
        super(context);
        inflateView(context);
    }

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

    public TextUserInputView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        inflateView(context);
    }

    private void inflateView(Context context){
        // set default attribute values
        setOrientation(LinearLayout.HORIZONTAL);
        setGravity(Gravity.CENTER_VERTICAL);
        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        int padding = (int) context.getResources().getDimension(R.dimen.padding_default);
        setPadding(padding, padding, padding, padding);
        setLayoutParams(params);
        // inflate layout.
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.user_input_text, this);
        addListeners();
    }

    private void addListeners(){
        mMessage = (EditText) findViewById(R.id.message);
        final ImageButton attachment = (ImageButton) findViewById(R.id.attachment);
        final ImageButton send = (ImageButton) findViewById(R.id.send);
        mMessage.addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {

            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (TextUtils.isEmpty(s))
                {
                    send.setEnabled(false);
                } else
                {
                    send.setEnabled(true);
                }
            }
        });

        attachment.setOnClickListener(this);
        attachment.setVisibility(View.GONE);
        send.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        if (v.getId() == R.id.send)
        {
            Toast.makeText(getContext(), "Text", Toast.LENGTH_SHORT).show();
        } else if (v.getId() == R.id.attachment)
        {

        }
    }
}

视图正从xml膨胀为一个Activity。

永远不会调用发送按钮上的on click侦听器。 任何人都可以找出原因吗?也许代码只需要一些新鲜的眼睛。

1 个答案:

答案 0 :(得分:0)

我知道您刚刚找到了解决方案,而这个问题有点老了,但我想写这个答案以使其更简洁: 如果您从最后一个嵌套视图(即ImageView)中删除了这两个attrs:(android:clickable =“ true”,android:focusable =“ true”), 它会工作。 通过使ImageView可点击和可聚焦,它可以拦截事件,并且不会让父项单击:/ 而已。 并感谢您阅读