onClick 用于自定义 CardView 上的按钮

onClick for buttons on custom CardView

我有一个自定义 CardView,其中包含一个按钮、一个单选按钮和一些文本。我将其中几张卡片放在 GridLayout 中。我的目标是每个按钮都会播放分配给它的不同声音。有没有办法创建一个 onClick 方法,它会根据单击哪个按钮改变播放的声音?或者我必须为每个按钮分配一个新的 onClick 吗?

这是我的 activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <com.google.android.gms.ads.AdView
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            android:id="@+id/adView"
            android:layout_width="409dp"
            android:layout_height="94dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            ads:adSize="BANNER"
            ads:adUnitId="ca-app-pub-3940256099942544/6300978111"/>

        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <androidx.appcompat.widget.Toolbar
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/black"
                app:layout_scrollFlags="scroll|enterAlways"
                app:subtitle="Board1"
                app:subtitleTextColor="@color/white"
                app:title="SoundBoard"
                app:titleTextColor="@color/white" />

            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#838080"
                app:tabIndicatorAnimationMode="linear"
                app:tabIndicatorColor="@color/black"
                app:tabIndicatorGravity="bottom"
                app:tabMode="scrollable"
                app:tabSelectedTextColor="@color/black"
                app:tabTextColor="#000000">


                <com.google.android.material.tabs.TabItem
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/Tab1" />
            </com.google.android.material.tabs.TabLayout>

        </com.google.android.material.appbar.AppBarLayout>

        <GridLayout
            android:layout_width="409dp"
            android:layout_height="531dp"
            android:layout_marginBottom="11dp"
            android:numColumns="2"
            android:scrollbars="vertical"
            android:useDefaultMargins="true"
            app:layout_constraintBottom_toTopOf="@+id/adView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/appbar"
            app:layout_constraintVertical_bias="0.0">

            <include
                android:id="@+id/playButton1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_gravity="center_horizontal"
                android:layout_row="0"
                android:layout_column="0"
                layout="@layout/custom_card" />
            <include
                android:id="@+id/playButton2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_gravity="center_horizontal"
                android:layout_row="0"
                android:layout_column="1"
                layout="@layout/custom_card" />

            <include
                android:id="@+id/playButton3"
                layout="@layout/custom_card"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_gravity="center_horizontal"
                android:layout_row="0"
                android:layout_column="2" />

            <include
                android:id="@+id/playButton4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_gravity="center_horizontal"
                android:layout_column="0"
                android:layout_row="1"
                layout="@layout/custom_card" />

            <include
                android:id="@+id/playButton5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_gravity="center_horizontal"
                android:layout_column="1"
                android:layout_row="1"
                layout="@layout/custom_card" />

            <include
                android:id="@+id/playButton6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_gravity="center_horizontal"
                android:layout_column="2"
                android:layout_row="1"
                layout="@layout/custom_card" />
        </GridLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

这是我的custom_card.xml

    <?xml version="1.0" encoding="utf-8"?>
<!--XML implementation of Card Layout
    Keep the width of card layout to match parent-->
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="135dp"
    android:layout_height="100dp"
    android:id="@+id/customCardView"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    app:cardCornerRadius="5dp"
    app:cardElevation="5dp">

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

        <Button
            android:id="@+id/playButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@color/black"
            android:contentDescription="@string/image"
            android:text="@string/play"
            android:onClick="playSound"/>

        <RadioButton
            android:id="@+id/loopSelect"
            android:layout_width="92dp"
            android:layout_height="26dp"
            android:layout_gravity="center"
            android:text="@string/Loop"
            android:textAlignment="center" />

        <TextView
            android:id="@+id/cardText"
            android:layout_width="86dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/example"
            android:textAlignment="center" />

    </LinearLayout>

</androidx.cardview.widget.CardView>

这是我的 MainActivity.java

package com.saskpolytech.cst.soundboard;

import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;


public class MainActivity extends AppCompatActivity {

    private AdView mAdView;
    MediaPlayer ice;

    Button playTest;




    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });

        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);


    }


    public void playSound(View view) {

    }

}

对于当前的实现,您需要为网格布局中的每个包含按钮实现 onClick

尝试使用网格布局管理器实现 recycler view,并处理它们的位置。使用它们的位置(将它们与您需要播放的声音名称一起存储在列表或哈希图中),然后 onItemClick 检查 id 并使用界面播放按钮所需的声音。

其他实施可能包括使用 custom_card.xml 创建自定义视图 class,并在视图中创建您自己的函数 class 以处理每个按钮 ID 和歌曲 ID。