簡體   English   中英

未觸發 LinearLayout 中的 OnClickListener

[英]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 中將clickablefocusable設置為true OnClickListener被觸發,漣漪效果(我使用自定義背景可繪制)不起作用。 所以,我將clickablefocusable設置為真。 現在, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM