点击监听器问题

On click Listener issue

我正在 Android Studio 中开发 Android 应用程序,我创建了带有卡片视图的网格布局。如下图所示:

当用户单击网格中的 BMI 元素时,我能够使 onClick 侦听器打开我的 BMIActivity。

这是我的 MainActivity.java 代码:

    package com.example.metapall;

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

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    GridLayout mainGrid;


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

        mainGrid = (GridLayout)findViewById(R.id.mainGrid);
        setSingleEvent(mainGrid);
    }

    private void setSingleEvent(GridLayout mainGrid) {
        for(int i=0;i<mainGrid.getChildCount();i++)
        {
            CardView cardView = (CardView)mainGrid.getChildAt(i);
            final int finalI = i;
            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    openBMIActivity();
                }
            });
        }
    }

    private void openBMIActivity() {
        Intent intent = new Intent(this, BMIActivity.class);
        startActivity(intent);
    }
}

这是我的 xml mainActivity 代码:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/bg"
    android:weightSum="10"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_weight="2"
        android:layout_width="match_parent"
        android:layout_height="0dp">

        <TextView
            android:id="@+id/TextGird"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="METAPAL"
            android:textColor="@android:color/white"
            android:layout_centerInParent="true"
            android:textSize="34sp" />

    </RelativeLayout>

    <GridLayout
        android:id="@+id/mainGrid"
        android:columnCount="2"
        android:rowCount="3"
        android:alignmentMode="alignMargins"
        android:columnOrderPreserved="false"
        android:layout_weight="8"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:padding="14dp"
        >
        <!-- Row 1 -->
        <!-- Column 1 -->

        <androidx.cardview.widget.CardView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp"
            android:foreground="?android:attr/selectableItemBackground"
            android:clickable="true"

            >

            <LinearLayout
                android:layout_gravity="center_horizontal|center_vertical"
                android:layout_margin="16dp"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:src="@drawable/group"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="BMI"
                    android:textAlignment="center"
                    android:textColor="@android:color/black"
                    android:textSize="18dp"
                    android:textStyle="bold" />
            </LinearLayout>


        </androidx.cardview.widget.CardView>

        <!-- Column 2 -->
        <androidx.cardview.widget.CardView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp"
            android:foreground="?android:attr/selectableItemBackground"
            android:clickable="true"
            >

            <LinearLayout
                android:layout_gravity="center_horizontal|center_vertical"
                android:layout_margin="16dp"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:src="@drawable/notes"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:textSize="18dp"
                    android:textColor="@android:color/black"
                    android:textAlignment="center"
                    android:text="CHO" />
            </LinearLayout>


        </androidx.cardview.widget.CardView>

        <!-- Row 2 -->
        <!-- Column 1 -->

        <androidx.cardview.widget.CardView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp"
            android:foreground="?android:attr/selectableItemBackground"
            android:clickable="true"
            >

            <LinearLayout
                android:layout_gravity="center_horizontal|center_vertical"
                android:layout_margin="16dp"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:src="@drawable/piggy"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:textSize="18dp"
                    android:textColor="@android:color/black"
                    android:textAlignment="center"
                    android:text="H20" />
            </LinearLayout>


        </androidx.cardview.widget.CardView>

        <!-- Column 2 -->
        <androidx.cardview.widget.CardView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp"
            android:foreground="?android:attr/selectableItemBackground"
            android:clickable="true"
            >

            <LinearLayout
                android:layout_gravity="center_horizontal|center_vertical"
                android:layout_margin="16dp"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:src="@drawable/shopping"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:textSize="18dp"
                    android:textColor="@android:color/black"
                    android:textAlignment="center"
                    android:text="Protein" />
            </LinearLayout>


        </androidx.cardview.widget.CardView>

        <!-- Row 3 -->
        <!-- Column 1 -->

        <androidx.cardview.widget.CardView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp"
            android:foreground="?android:attr/selectableItemBackground"
            android:clickable="true"
            >

            <LinearLayout
                android:layout_gravity="center_horizontal|center_vertical"
                android:layout_margin="16dp"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:src="@drawable/calendar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:textSize="18dp"
                    android:textColor="@android:color/black"
                    android:textAlignment="center"
                    android:text="Calendar" />
            </LinearLayout>


        </androidx.cardview.widget.CardView>

        <!-- Column 2 -->
        <androidx.cardview.widget.CardView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp"
            android:foreground="?android:attr/selectableItemBackground"
            android:clickable="true"
            >

            <LinearLayout
                android:layout_gravity="center_horizontal|center_vertical"
                android:layout_margin="16dp"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:src="@drawable/settings"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:textSize="18dp"
                    android:textColor="@android:color/black"
                    android:textAlignment="center"
                    android:text="Settings" />
            </LinearLayout>


        </androidx.cardview.widget.CardView>

    </GridLayout>


</LinearLayout>

我想知道如何在单击 CHOActivity 或 H2OActivity 时打开它们。现在,无论我单击哪个按钮,它都会始终打开 BMIActivity,据我所知,这是我指定的方式。 但是,如何指定在单击不同按钮时打开正确的 activity 呢? 我试图使用变量 i 但我不确定如何将它与元素绑定然后在 onclick 中调用它。 有什么建议吗?

您可以通过 xml android:tag="h20" 或通过 java 代码 view.setTag( "h20") 在迭代视图时(如果它是动态添加的)。像 openActivity(View view) 这样的视图为所有参数调用相同的点击函数。在那个基于标签的开关里面,比如

switch(view.getTag){
case "H20:
   doA()
   break;
case "SOMETHING":
   doB()
   break;
}

由于您在布局文件中手动添加了视图, 您应该将 id 分配给您的单元格 (CardViews) 并直接在它们上单击侦听器。

<androidx.cardview.widget.CardView
    android:id="@+id/cvBMI"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_rowWeight="1"
    android:layout_columnWeight="1"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginBottom="16dp"
    app:cardCornerRadius="8dp"
    app:cardElevation="8dp"
    android:foreground="?android:attr/selectableItemBackground"
    android:clickable="true">

.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    GridLayout mainGrid;


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

        mainGrid = (GridLayout) findViewById(R.id.mainGrid);

        findViewById(R.id.cvBMI).setOnClickListener(this);
        findViewById(R.id.cvCHO).setOnClickListener(this);
        findViewById(R.id.cvH20).setOnClickListener(this);
        findViewById(R.id.cvProtein).setOnClickListener(this);
        findViewById(R.id.cvCalendar).setOnClickListener(this);
        findViewById(R.id.cvSettings).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.cvBMI:
                openBMIActivity();
                break;
            case R.id.cvCHO:
                openCHOActivity();
                break;
            case R.id.cvH20:
                openH2OActivity();
                break;
            case R.id.cvProtein:
                openProteinActivity();
                break;
            case R.id.cvCalendar:
                openCalendarActivity();
                break;
            case R.id.cvSettings:
                openSettingsActivity();
                break;
        }
    }
}