Android onClickListener 在复合视图中不起作用

Posted

技术标签:

【中文标题】Android onClickListener 在复合视图中不起作用【英文标题】:Android onClickListener not working in compound view 【发布时间】:2016-08-01 17:42:56 【问题描述】:

我有一个包含以下 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_
        android:layout_/>

    <EditText
        android:id="@+id/message"
        android:layout_
        android:layout_
        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_
        android:layout_
        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。

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

【问题讨论】:

显示所有相关的 XML。您正在为具有合并标记的自定义视图共享布局,并且您甚至没有在 java 文件中扩展该布局。 谢谢@Jabbar_Jigariyo。我正确地膨胀了视图。我发现了错误。问题微不足道。这是由于另一个透明视图隐藏了这个视图。 【参考方案1】:

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

【讨论】:

以上是关于Android onClickListener 在复合视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

Android onClickListener实现最佳实践

在 listview Android 1.6 中同时使用 onClickListener 和 onLongClickListener

Android:OnClickListener 在初始加载时无响应?

XML 中的 Android onClick 与 OnClickListener

尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”