You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何基于if-else逻辑实现ImageView显示对应星座图片

星座查询APP图片显示问题解决

我是Android编程纯新手,仅学习了一周课程,目前在做一个星座查询APP:用户点击日历上的出生日期,APP会显示对应的星座名称(这部分的if-else分支逻辑已正常运行),但我想添加同步显示对应星座图片的功能,现在遇到两个问题:

  1. XML中添加的ImageView在APP刚启动时就默认显示图片,即使Java代码中未配置相关逻辑;
  2. 希望APP启动时ImageView为空,用户点击日历日期后,仅显示对应星座的图片及名称(遵循已有的if-else判断逻辑)。

我的代码

Java代码

package com.example.zodiac;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.CalendarView;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView maintitle;
    TextView subtitle;
    CalendarView calendar;
    TextView zodiactext;
    ImageView image;

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

        maintitle = findViewById(R.id.mainTitle);
        subtitle = findViewById(R.id.subTitle);
        calendar = findViewById(R.id.calendar);
        zodiactext = findViewById(R.id.zodiacText);
        image = findViewById(R.id.image);


        calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int dayOfMonth) {

                int imageResource = getResources().getIdentifier("@drawable/aquaris", null, getPackageName());
                Drawable res = getResources().getDrawable(imageResource);
                image.setImageDrawable(res);

                String zodiacSign="";
                if(month==0){
                    if (dayOfMonth<20){
                        zodiacSign="Capricorn";
                    }else {
                        zodiacSign="Aquarius";
                    }
                }else if(month==1){
                    if (dayOfMonth<19){
                        zodiacSign="Aquarius";
                    }else {
                        zodiacSign="Pisces";
                    }
                }else if(month==2){
                    if (dayOfMonth<21){
                        zodiacSign="Pisces";
                    }else {
                        zodiacSign="Aries";
                    }
                }else if(month==3){
                    if (dayOfMonth<20){
                        zodiacSign="Aries";
                    }else {
                        zodiacSign="Taurus";
                    }
                }else if(month==4){
                    if (dayOfMonth<21){
                        zodiacSign="Taurus";
                    }else {
                        zodiacSign="Gemini";
                    }
                }else if(month==5){
                    if (dayOfMonth<22){
                        zodiacSign="Gemini";
                    }else {
                        zodiacSign="Cancer";
                    }
                }else if(month==6){
                    if (dayOfMonth<23){
                        zodiacSign="Cancer";
                    }else {
                        zodiacSign="Leo";
                    }
                }else if(month==7){
                    if (dayOfMonth<23){
                        zodiacSign="Leo";
                    }else {
                        zodiacSign="Virgo";
                    }
                }else if(month==8){
                    if (dayOfMonth<23){
                        zodiacSign="Virgo";
                    }else {
                        zodiacSign="Libra";
                    }
                }else if(month==9){
                    if (dayOfMonth<24){
                        zodiacSign="Libra";
                    }else {
                        zodiacSign="Scorpio";
                    }
                }else if(month==10){
                    if (dayOfMonth<23){
                        zodiacSign="Scorpio";
                    }else {
                        zodiacSign="Sagittarius";
                    }
                }else if(month==11){
                    if (dayOfMonth<22){
                        zodiacSign="Sagittarius";
                    }else {
                        zodiacSign="Capricorn";
                    }
                }
                zodiactext.setText(zodiacSign);

            }
        });
    }
}

XML布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="@drawable/space"
    tools:context=".MainActivity"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="286dp">

    <CalendarView
        android:id="@+id/calendar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="28dp"
        android:layout_marginTop="148dp"
        android:background="@color/design_default_color_background"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/mainTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="41dp"
        android:text="Zodiac Finder"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/subTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="41dp"
        android:layout_marginBottom="40dp"
        android:text="Pick your date and month to find your Zodiac Symbol"
        app:layout_constraintBottom_toTopOf="@+id/calendar"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/zodiacText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:text="Your Zodiac symbol is - "
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/calendar" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="148dp"
        android:layout_height="127dp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.963"
        android:src="@drawable/scorpio"
        tools:srcCompat="@drawable/scorpio" />

</androidx.constraintlayout.widget.ConstraintLayout>

解决方案

解决问题1:启动时ImageView默认显示图片

你的XML中给ImageView设置了android:src="@drawable/scorpio",这个属性会让ImageView在APP启动时就加载并显示这张图片,哪怕配置了android:visibility="gone"也可能出现冲突显示。

修改XML中的ImageView,删除android:src="@drawable/scorpio"这一行,保留android:visibility="gone",这样启动时ImageView是隐藏状态,不会显示任何图片。

解决问题2:选日期后同步显示对应星座图片

你当前代码中固定加载了拼写错误的aquaris(应为aquarius)图片,需要根据计算出的星座名称动态加载对应图片:

  1. 准备图片资源:确保drawable文件夹中的图片文件名和星座名称全小写一致,比如Capricorn对应capricorn.png,Aquarius对应aquarius.png,避免拼写错误。
  2. 修改Java代码:
    • 先在文件顶部导入View类:import android.view.View;
    • 在onSelectedDayChange方法中,删除原来固定加载图片的代码,把图片加载逻辑移到星座名称计算完成之后:
@Override
public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int dayOfMonth) {

    String zodiacSign="";
    // 保留你原来的if-else逻辑,计算出对应的zodiacSign
    if(month==0){
        if (dayOfMonth<20){
            zodiacSign="Capricorn";
        }else {
            zodiacSign="Aquarius";
        }
    }else if(month==1){
        if (dayOfMonth<19){
            zodiacSign="Aquarius";
        }else {
            zodiacSign="Pisces";
        }
    }
    // ... 保留其他月份的判断逻辑 ...

    // 以下是新增/修改的图片显示逻辑
    // 显示ImageView
    image.setVisibility(View.VISIBLE);
    // 将星座名称转为小写,匹配drawable中的文件名
    String imageFileName = zodiacSign.toLowerCase();
    // 获取对应的图片资源ID
    int imageResId = getResources().getIdentifier(imageFileName, "drawable", getPackageName());
    if (imageResId != 0) {
        // 资源存在时设置图片
        image.setImageResource(imageResId);
    } else {
        // 资源不存在时隐藏ImageView(可选)
        image.setVisibility(View.GONE);
    }

    zodiactext.setText(zodiacSign);
}

这样修改后,APP启动时ImageView是隐藏的,用户选择日期后,会根据计算出的星座名称加载对应图片并显示,同时更新星座名称文本。


内容的提问来源于stack exchange,提问作者Martin Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:36:28