【问题标题】:On click Listener issue单击侦听器问题
【发布时间】:2019-09-06 01:43:54
【问题描述】:

我正在 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);
    }
}

这是我的 mainActivity xml 代码:

    <?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,我理解这是我指定的方式。 但是,当单击不同的按钮时,如何指定打开正确的活动? 我试图使用变量 i 但我不确定如何将它与元素绑定,然后在 onclick 中调用它。 有什么建议吗?

【问题讨论】:

  • 显示activity_main的XML
  • PPartisan - 嗨,我也刚刚添加了 XML 代码。感谢您对此进行调查。
  • 您可以像 android:tag="H20" 为每个 CardView 添加标签属性,在 onClick 中您可以检索该标签属性并检查 view.getTag() ...您可以找到多个示例一样。
  • 或者只是在 xml 中设置 CardView 的“id”属性(你没有这样做)并使用 getId() 并与 R.id.xxx 进行比较。

标签: java android android-gridview


【解决方案1】:

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

<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;
        }
    }
}

【讨论】:

  • Harsh Jatinder 谢谢你的建议。我能够实现这一点。
【解决方案2】:

您可以做的是通过 xml android:tag="h20" 或通过 java 代码 view.setTag("h20") 为每张卡片添加标签,同时迭代视图(如果它是动态添加的)。为所有的争论调用相同的点击函数作为视图,如 openActivity(View view)。并在基于标签的开关内部

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2021-11-27
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多