Android:用@drawable/image的不同扩展名问题

本文探讨了在Android开发中引用图片资源的方式,特别是针对不同扩展名的图片文件如何被正确加载而不发生混淆的情况,并通过实测验证了加载优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用@drawable/image的时候,仅仅使用的是image的名字,而没有包括扩展名,如果使用2张不同扩展名的image,会怎么样?
或者在Android引用图片的格式有限制?

在群里问了,结果被凶了。。为什么不自己测试?
不过还是得到了网友的指导
“没有限制,优先png”
经过自己测试之后,得到的结果如下图
这里写图片描述
eclipse就会报错。不会在引用的时候出现混乱。。

package com.liruijie.dufucaotang; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.liruijie.dufucaotang.adapter.NewsAdapter; import com.liruijie.dufucaotang.model.News; import com.liruijie.dufucaotang.utils.NewsApiUtils; import java.util.List; public class OverviewLatestNewsActivity extends AppCompatActivity { private RecyclerView newsRecyclerView; private NewsAdapter newsAdapter; private ProgressBar progressBar; private static final String TAG = "LatestNewsActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_overview_latest_news); // 设置标题 if (getSupportActionBar() != null) { getSupportActionBar().setTitle("最新动态"); } // 初始化视图 initViews(); // 加载新闻数据 loadNewsData(); } /** * 初始化视图组件 */ private void initViews() { newsRecyclerView = findViewById(R.id.news_recycler_view); progressBar = findViewById(R.id.progress_bar); // 设置RecyclerView newsRecyclerView.setLayoutManager(new LinearLayoutManager(this)); newsAdapter = new NewsAdapter(this, null); newsRecyclerView.setAdapter(newsAdapter); } /** * 加载新闻数据 */ private void loadNewsData() { // 显示加载进度条 progressBar.setVisibility(View.VISIBLE); // 使用新闻API工具类获取数据 NewsApiUtils.getInstance().getNewsList(new NewsApiUtils.NewsCallback() { @Override public void onSuccess(List<News> newsList) { // 在主线程更新UI runOnUiThread(() -> { progressBar.setVisibility(View.GONE); if (newsList != null && !newsList.isEmpty()) { // 显示新闻列表 newsAdapter.setNewsList(newsList); } else { // 无新闻数据提示 Toast.makeText(OverviewLatestNewsActivity.this, "暂无最新动态", Toast.LENGTH_SHORT).show(); } }); } @Override public void onError(String error) { // 在主线程处理错误 runOnUiThread(() -> { progressBar.setVisibility(View.GONE); Log.e(TAG, "加载新闻失败: " + error); Toast.makeText(OverviewLatestNewsActivity.this, "加载新闻失败: " + error, Toast.LENGTH_SHORT).show(); }); } }); } /** * 销毁时的资源释放 */ @Override protected void onDestroy() { super.onDestroy(); // 可以在此处添加资源释放逻辑 } }<?xml version="1.0" encoding="utf-8"?> <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/title_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="最新动态" android:textSize="24sp" android:textStyle="bold" android:layout_marginBottom="16dp"/> <TextView android:id="@+id/intro_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="这里展示杜甫草堂的最新活动、展览和重要事件,欢迎关注我们的文化活动。" android:textSize="16sp" android:lineSpacingMultiplier="1.2" android:layout_marginBottom="24dp"/> <!-- 加载进度条 --> <ProgressBar android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> <!-- 空数据提示 --> <TextView android:id="@+id/empty_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="暂无新闻数据" android:textSize="18sp" android:textColor="#888888" android:gravity="center" android:padding="24dp" android:visibility="gone"/> <!-- 新闻列表 - 使用RecyclerView实现动态加载 --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/news_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </LinearLayout> </androidx.core.widget.NestedScrollView>package com.liruijie.dufucaotang; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> { private Context mContext; private List<Integer> mImageList; public ImageAdapter(Context context, List<Integer> imageList) { mContext = context; mImageList = imageList; } @NonNull @Override public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_image, parent, false); return new ImageViewHolder(view); } @Override public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) { int imageResId = mImageList.get(position % mImageList.size()); holder.imageView.setImageResource(imageResId); } @Override public int getItemCount() { return Integer.MAX_VALUE; // 实现无限循环 } public static class ImageViewHolder extends RecyclerView.ViewHolder { ImageView imageView; public ImageViewHolder(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.imageView); } } }package com.liruijie.dufucaotang.utils; import android.util.Log; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.liruijie.dufucaotang.model.News; import java.io.IOException; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * 新闻请求专用工具类 */ public class NewsApiUtils { private static final String TAG = "NewsApiUtils"; private static final String BASE_URL = "http://10.0.2.2:8080/api/"; // 单例模式 private static NewsApiUtils instance; private final OkHttpClient client; private final Gson gson; private NewsApiUtils() { // 配置OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .writeTimeout(15, TimeUnit.SECONDS) .build(); // 初始化Gson gson = new Gson(); } // 获取单例实例 public static NewsApiUtils getInstance() { if (instance == null) { synchronized (NewsApiUtils.class) { if (instance == null) { instance = new NewsApiUtils(); } } } return instance; } /** * 获取新闻列表 * @param callback 回调接口 */ public void getNewsList(final NewsCallback callback) { String url = BASE_URL + "news"; Request request = new Request.Builder() .url(url) .get() .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "获取新闻失败: " + e.getMessage()); if (callback != null) { callback.onError("网络错误: " + e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { try { if (response.isSuccessful() && response.body() != null) { String json = response.body().string(); // 解析JSON数据 TypeToken<List<News>> typeToken = new TypeToken<List<News>>() {}; List<News> newsList = gson.fromJson(json, typeToken.getType()); if (callback != null) { callback.onSuccess(newsList); } } else { if (callback != null) { callback.onError("请求失败: " + response.code()); } } } catch (Exception e) { Log.e(TAG, "解析新闻数据失败: " + e.getMessage()); if (callback != null) { callback.onError("解析数据失败: " + e.getMessage()); } } finally { response.close(); } } }); } /** * 根据ID获取单条新闻 * @param newsId 新闻ID * @param callback 回调接口 */ public void getNewsById(int newsId, final NewsItemCallback callback) { String url = BASE_URL + "news/" + newsId; Request request = new Request.Builder() .url(url) .get() .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "获取单条新闻失败: " + e.getMessage()); if (callback != null) { callback.onError("网络错误: " + e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { try { if (response.isSuccessful() && response.body() != null) { String json = response.body().string(); // 解析JSON数据 News news = gson.fromJson(json, News.class); if (callback != null) { callback.onSuccess(news); } } else { if (callback != null) { callback.onError("请求失败: " + response.code()); } } } catch (Exception e) { Log.e(TAG, "解析单条新闻数据失败: " + e.getMessage()); if (callback != null) { callback.onError("解析数据失败: " + e.getMessage()); } } finally { response.close(); } } }); } // 新闻列表回调接口 public interface NewsCallback { void onSuccess(List<News> newsList); void onError(String error); } // 单条新闻回调接口 public interface NewsItemCallback { void onSuccess(News news); void onError(String error); } }package com.liruijie.dufucaotang.adapter; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.liruijie.dufucaotang.R; import com.liruijie.dufucaotang.model.News; import java.util.List; public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> { private Context context; private List<News> newsList; private OnItemClickListener listener; public NewsAdapter(Context context, List<News> newsList) { this.context = context; this.newsList = newsList; } public void setNewsList(List<News> newsList) { this.newsList = newsList; notifyDataSetChanged(); } public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } @NonNull @Override public NewsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_news, parent, false); return new NewsViewHolder(view); } @Override public void onBindViewHolder(@NonNull NewsViewHolder holder, int position) { News news = newsList.get(position); // 绑定文本数据 holder.titleTextView.setText(news.getTitle()); holder.dateTextView.setText(news.getFormattedDate()); holder.contentTextView.setText(news.getContent()); // 加载本地图片 loadLocalImage(news.getImagePath(), holder.imageView); // 设置点击事件 holder.itemView.setOnClickListener(v -> { if (listener != null) { listener.onItemClick(news); } }); } @Override public int getItemCount() { return newsList != null ? newsList.size() : 0; } /** * 从本地资源加载图片 */ private void loadLocalImage(String imageName, ImageView imageView) { if (imageName == null || imageName.isEmpty()) { imageView.setImageResource(R.drawable.ic_error); Log.w("NewsAdapter", "图片名称为空"); return; } Log.d("NewsAdapter", "尝试加载图片: " + imageName); Log.d("NewsAdapter", "应用包名: " + context.getPackageName()); int resId = context.getResources().getIdentifier( imageName, "drawable", context.getPackageName() ); if (resId != 0) { imageView.setImageResource(resId); Log.d("NewsAdapter", "图片加载成功,资源ID: " + resId); } else { imageView.setImageResource(R.drawable.ic_error); Log.e("NewsAdapter", "资源未找到! 请检查: " + "1. 图片文件是否在res/drawable目录下 " + "2. 文件名是否为" + imageName + ".* " + "3. 文件名是否只包含小写字母、数字和下划线"); } } static class NewsViewHolder extends RecyclerView.ViewHolder { TextView titleTextView; TextView dateTextView; TextView contentTextView; ImageView imageView; public NewsViewHolder(@NonNull View itemView) { super(itemView); titleTextView = itemView.findViewById(R.id.news_title); dateTextView = itemView.findViewById(R.id.news_date); contentTextView = itemView.findViewById(R.id.news_content); imageView = itemView.findViewById(R.id.news_image); } } public interface OnItemClickListener { void onItemClick(News news); } }mysql数据库保存的图片名字为calligraphy_exhibition,app还是查不出来,数据库已经成功连接
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值