Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为android中不在recyclerview中的单个cardview元素添加onClick事件?_Java_Android_Xml - Fatal编程技术网

Java 如何为android中不在recyclerview中的单个cardview元素添加onClick事件?

Java 如何为android中不在recyclerview中的单个cardview元素添加onClick事件?,java,android,xml,Java,Android,Xml,我正在使用一个包含cardview列表的应用程序,我希望每个cardview在点击时打开特定的活动。我没有使用任何recyclerviews或适配器,我只是创建了多个cardview xml文件,并将它们包含在coordinatorlayout和CollasingToolbarLayout中的主xml中。我曾尝试为单个CardView创建onClick事件,但应用程序不断崩溃。 以下是我的main.xml代码: <android.support.design.widget.AppBarLa

我正在使用一个包含cardview列表的应用程序,我希望每个cardview在点击时打开特定的活动。我没有使用任何recyclerviews或适配器,我只是创建了多个cardview xml文件,并将它们包含在coordinatorlayout和CollasingToolbarLayout中的主xml中。我曾尝试为单个CardView创建onClick事件,但应用程序不断崩溃。 以下是我的main.xml代码:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="true"
            android:background="@drawable/pic3"
            android:id="@+id/profile_id"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin" />

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingTop="10dp">

        <include layout="@layout/card_layout1" />

        <include layout="@layout/card_layout6"/>
        <include layout="@layout/card_layout4"/>
        <include layout="@layout/card_layout5"/>

    </LinearLayout>


</android.support.v4.widget.NestedScrollView>

}


如何在不使用recyclerview和适配器的情况下为每个CardView实现onClick事件?

这是一种糟糕的做法。但您可以将标记设置为所有卡片视图,在代码中找到它们并设置click listener:

在main.xml中

...

<LinearLayout
    android:id="@+id/cardsContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingTop="10dp">

    <include layout="@layout/card_layout1" />

    <include layout="@layout/card_layout6"/>
    <include layout="@layout/card_layout4"/>
    <include layout="@layout/card_layout5"/>
</LinearLayout>
...
。。。
...
所有卡片布局必须有标签:

<android.support.v7.widget.CardView
      android:tag="clickableCard"
      ...>

      ...

</android.support.v7.widget.CardView>

private ArrayList getViewsByTag(视图组根,字符串标记){
ArrayList视图=新建ArrayList();
final int childCount=root.getChildCount();
for(int i=0;i
}

在onCreate方法末尾的MainActivity.java中,您需要:

ArrayList<View> clickableViews = getViewsByTag(findViewById(R.id.cardsContainer), "clickableCard");
    for (int i = 0; i < clickableViews.size(); i++) {
        final Integer viewIndex = i;
        View cardView = clickableViews.get(i);
        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (viewIndex == 0) {
                    // do work with first card
                }
                else if (viewIndex == 1) {
                    // do work with second card
                }
                ...
            }
        });
    }
ArrayList clickableViews=getViewsByTag(findViewById(R.id.cardsContainer),“clickableCard”);
对于(int i=0;i
谢谢!工作起来很有魅力!事实上,我必须在最后期限前完成,学习recyclerview占用了我太多的时间,所以我决定采用老式的方式。无论如何,非常感谢你!谢谢)请给我的答案打分,这是我关于stackoverflow的第一个答案:)
<android.support.v7.widget.CardView
      android:tag="clickableCard"
      ...>

      ...

</android.support.v7.widget.CardView>
private ArrayList<View> getViewsByTag(ViewGroup root, String tag){
ArrayList<View> views = new ArrayList<View>();
final int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
    final View child = root.getChildAt(i);
    if (child instanceof ViewGroup) {
        views.addAll(getViewsByTag((ViewGroup) child, tag));
    }

    final Object tagObj = child.getTag();
    if (tagObj != null && tagObj.equals(tag)) {
        views.add(child);
    }

}
return views;
ArrayList<View> clickableViews = getViewsByTag(findViewById(R.id.cardsContainer), "clickableCard");
    for (int i = 0; i < clickableViews.size(); i++) {
        final Integer viewIndex = i;
        View cardView = clickableViews.get(i);
        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (viewIndex == 0) {
                    // do work with first card
                }
                else if (viewIndex == 1) {
                    // do work with second card
                }
                ...
            }
        });
    }