Android中如何基于if-else逻辑实现ImageView显示对应星座图片
星座查询APP图片显示问题解决
我是Android编程纯新手,仅学习了一周课程,目前在做一个星座查询APP:用户点击日历上的出生日期,APP会显示对应的星座名称(这部分的if-else分支逻辑已正常运行),但我想添加同步显示对应星座图片的功能,现在遇到两个问题:
- XML中添加的ImageView在APP刚启动时就默认显示图片,即使Java代码中未配置相关逻辑;
- 希望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)图片,需要根据计算出的星座名称动态加载对应图片:
- 准备图片资源:确保
drawable文件夹中的图片文件名和星座名称全小写一致,比如Capricorn对应capricorn.png,Aquarius对应aquarius.png,避免拼写错误。 - 修改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
相关产品推荐
相关产品推荐

