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冲突解决办法
在 listview Android 1.6 中同时使用 onClickListener 和 onLongClickListener
Android:OnClickListener 在初始加载时无响应?
XML 中的 Android onClick 与 OnClickListener
尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”