[英]OnClickListener in LinearLayout not triggered
我有一個名為CalenderItem
的 CustomWidget。 它有兩個TextView
和一個OnClickListener
。
這是 xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background_calender_item"
android:clickable="true"
android:focusable="true">
<TextView
android:id="@+id/text_view_calender_item_date"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text_view_calender_item_routine"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
這是 Java 代碼:
public class CalenderItem extends LinearLayout {
public CalenderItem(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater l = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
l.inflate(R.layout.calender_item, this, true);
setLayoutParams(new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, 1)); //TableRow, because I use it as a child inside a TableRow.
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null) {
listener.itemClicked(day, month, year);
}
}
});
}
public interface IItemClicked {
void itemClicked(int day, int month, int year);
}
private IItemClicked listener = null;
public void setOnItemClickedListener(IItemClicked listener) {
this.listener = listener;
}
}
起初,我沒有在 xml 中將clickable
和focusable
設置為true
。 OnClickListener
被觸發,漣漪效果(我使用自定義背景可繪制)不起作用。 所以,我將clickable
和focusable
設置為真。 現在, OnClickListener 不再起作用了。 我已經嘗試設置android:duplicateParentState="true"
並且我也嘗試在每個孩子中將clickable
設置為 false ,但它也不起作用。 我還嘗試在 Java 代碼中設置OnTouchListener
而不是OnClickListener
,這導致漣漪效應不起作用。
編輯編輯了完整的 class 代碼
編輯 2在@Md 的回答之后。 Asaduzzaman,我得到了以下 Logcat:
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] JNI ERROR (app bug): local reference table overflow (max=512)
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] local reference table dump:
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] Last 10 entries (of 512):
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 511: 0x131ddc00 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 510: 0x131dd800 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 509: 0x131dd400 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 508: 0x131d4c00 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 507: 0x131d4800 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 506: 0x131d4400 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 505: 0x131d4000 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 504: 0x131d3c00 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 503: 0x131d3800 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 502: 0x131d3400 com.workoutlog.workoutlog.views.CalenderItem
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] Summary:
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 1 of com.workoutlog.workoutlog.views.Calender
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 504 of com.workoutlog.workoutlog.views.CalenderItem (504 unique instances)
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 2 of java.lang.Class (2 unique instances)
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 4 of java.lang.String (4 unique instances)
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138] 1 of java.lang.String[] (4 elements)
2019-10-17 10:44:08.444 510-510/com.workoutlog.workoutlog A/art: art/runtime/indirect_reference_table.cc:138]
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] Runtime aborting...
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] Aborting thread:
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] "main" prio=5 tid=1 Runnable
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] | group="" sCount=0 dsCount=0 obj=0x77c16c50 self=0x78f10a1a00
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] | sysTid=510 nice=0 cgrp=default sched=1073741825/1 handle=0x78f51f0a98
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] | state=R schedstat=( 1101401050 13378120 491 ) utm=97 stm=13 core=7 HZ=100
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] | stack=0x7ff30b0000-0x7ff30b2000 stackSize=8MB
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] | held mutexes= "abort lock" "mutator lock"(shared held)
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.RenderNode.create(RenderNode.java:161)
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.View.<init>(View.java:4023)
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.View.<init>(View.java:4137)
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.ViewGroup.<init>(ViewGroup.java:578)
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.widget.LinearLayout.<init>(LinearLayout.java:214)
2019-10-17 10:44:09.726 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.widget.LinearLayout.<init>(LinearLayout.java:210)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at com.workoutlog.workoutlog.views.CalenderItem.<init>(CalenderItem.java:52)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at com.workoutlog.workoutlog.views.CalenderItem.<init>(CalenderItem.java:48)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at java.lang.reflect.Constructor.newInstance0!(Native method)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.createView(LayoutInflater.java:656)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:798)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] - locked <0x0675666f> (a java.lang.Object[])
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at com.workoutlog.workoutlog.views.CalenderItem.<init>(CalenderItem.java:66)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at com.workoutlog.workoutlog.views.CalenderItem.<init>(CalenderItem.java:48)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at java.lang.reflect.Constructor.newInstance0!(Native method)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.createView(LayoutInflater.java:656)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:798)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] - locked <0x0675666f> (a java.lang.Object[])
2019-10-17 10:44:09.727 510-510/com.workoutlog.workoutlog A/art: art/runtime/runtime.cc:408] at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
這會持續一段時間。 我只實施了一次CalenderItem
。 我將它作為孩子添加到 TableRow 中。
這不是實現自定義視圖 class 的正確方法。 在您實施CalenderItem class 時,您實際上是在創建一個不需要的額外 LinearLayout。
首先,在values/attr.xml
中為您的 CalendarItem 定義自定義屬性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CalenderItem">
<attr name="calenderItemDate" format="string" />
<attr name="calenderItemRoutine" format="string" />
</declare-styleable>
</resources>
然后,實現擴展 LinearLayout 的CalenderItem class。
public class CalenderItem extends LinearLayout {
private String dateLabel = "";
private String routineLabel = "";
private TextView dateTextView;
private TextView routineTextView;
private IItemClicked listener = null;
public CalenderItem(Context context) {
this(context, null);
}
public CalenderItem(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CalenderItem(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.CalenderItem, 0, 0);
try {
// get the text and colors specified using the names in attrs.xml
dateLabel = a.getString(R.styleable.CalenderItem_calenderItemDate);
routineLabel = a.getString(R.styleable.CalenderItem_calenderItemRoutine);
} finally {
a.recycle();
}
LayoutInflater.from(context).inflate(R.layout.calender_item, this);
dateTextView = this.findViewById(R.id.text_view_calender_item_date);
dateTextView.setText(dateLabel);
routineTextView = this.findViewById(R.id.text_view_calender_item_routine);
routineTextView.setText(routineLabel);
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null)
listener.itemClicked(0, 0, 0);
}
});
}
public interface IItemClicked {
void itemClicked(int day, int month, int year);
}
public void setOnItemClickedListener(IItemClicked listener) {
this.listener = listener;
}
}
然后,在您的 XML 布局中引用它,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<com.package.name.CalenderItem xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
app:calenderItemDate="2019-10-18"
app:calenderItemRoutine="Hello"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.package.name.CalenderItem>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.