I understand that this error has been addressed severally and I’ve checked most of them like Android: android.content.res.Resources$NotFoundException: String resource ID #0x5, android.content.res.Resources$NotFoundException: String resource ID to see if I could find a solution to my problem but I couldn’t and most of them are hard to understand. I can’t tell if my code is an int/string so I don’t know exactly what to correct, so I need help.
I got this error at runtime:
android.content.res.Resources$NotFoundException: String resource ID #0x601ee924 at android.content.res.Resources.getText(Resources.java:348) at android.widget.TextView.setText(TextView.java:5848) at com.tex.lightweatherforecast.Activity.HomeActivity$1.onResponse(HomeActivity.java:66) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89) at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$3wC8FyV4pyjrzrYL5U0mlYiviZw.run(Unknown Source:6) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6819) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912)
My codes:
HomeActivity.java
public class HomeActivity extends AppCompatActivity { public static String BaseUrl = "https://api.openweathermap.org"; public static String AppId = ""; public static String lat = "9.0574"; public static String lon = "7.4898"; // User Timezone name, current time TextView time_zone, time_field; ConstraintLayout constraintLayout; public static int count=0; int[] drawable =new int[]{R.drawable.dubai,R.drawable.central_bank_of_nigeria,R.drawable.eiffel_tower,R.drawable.hong_kong,R.drawable.statue_of_liberty}; Timer _t; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); time_zone = findViewById(R.id.textView4); time_field = findViewById(R.id.textView9); BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView); NavController navController = Navigation.findNavController(this, R.id.fragment); NavigationUI.setupWithNavController(bottomNavigationView, navController); Retrofit retrofit = new Retrofit.Builder().baseUrl(BaseUrl).addConverterFactory(GsonConverterFactory.create()).build(); WeatherService service = retrofit.create(WeatherService.class); Call<WeatherResponse> call = service.getCurrentWeatherData(lat, lon, AppId); call.enqueue(new Callback<WeatherResponse>() { @Override public void onResponse(@NonNull Call<WeatherResponse> call, @NonNull Response<WeatherResponse> response) { if (response.code() == 200) { WeatherResponse weatherResponse = response.body(); assert weatherResponse != null; assert response.body() != null; time_zone.setText(response.body().getTimezone()); time_field.setText(response.body().getCurrent().getDt()); constraintLayout = findViewById(R.id.layout); constraintLayout.setBackgroundResource(R.drawable.dubai); _t = new Timer(); _t.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // run on ui thread runOnUiThread(() -> { if (count < drawable.length) { constraintLayout.setBackgroundResource(drawable[count]); count = (count + 1) % drawable.length; } }); } }, 5000, 5000); } } @Override public void onFailure(@NotNull Call<WeatherResponse> call, @NotNull Throwable t) { } }); } }
FirstFragment.java
public class FirstFragment extends Fragment { public static String BaseUrl = "https://api.openweathermap.org"; public static String AppId = ""; public static String lat = "9.0574"; public static String lon = "7.4898"; // User Timezone name, current time, current temperature, current condition, sunrise, sunset, temperature, pressure, humidity, wind_speed, visibility, UV Index TextView current_temp, current_output, rise_time, set_time, temp_out, Press_out, Humid_out, Ws_out, Visi_out, UV_out; // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public FirstFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment SecondFragment. */ // TODO: Rename and change types and number of parameters public static FirstFragment newInstance(String param1, String param2) { FirstFragment fragment = new FirstFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View rootView = inflater.inflate(R.layout.fragment_first, container, false); current_temp = rootView.findViewById(R.id.textView10); current_output = rootView.findViewById(R.id.textView11); rise_time = rootView.findViewById(R.id.textView25); set_time = rootView.findViewById(R.id.textView26); temp_out = rootView.findViewById(R.id.textView28); Press_out = rootView.findViewById(R.id.textView29); Humid_out = rootView.findViewById(R.id.textView30); Ws_out = rootView.findViewById(R.id.textView33); Visi_out = rootView.findViewById(R.id.textView34); UV_out = rootView.findViewById(R.id.textView35); Retrofit retrofit = new Retrofit.Builder().baseUrl(BaseUrl).addConverterFactory(GsonConverterFactory.create()).build(); WeatherService service = retrofit.create(WeatherService.class); Call<WeatherResponse> call = service.getCurrentWeatherData(lat, lon, AppId); call.enqueue(new Callback<WeatherResponse>() { @Override public void onResponse(@NonNull Call<WeatherResponse> call, @NonNull Response<WeatherResponse> response) { if (response.code() == 200) { WeatherResponse weatherResponse = response.body(); assert weatherResponse != null; assert response.body() != null; current_temp.setText(getString(R.string.blank, response.body().getCurrent().getTemp() + " ℃")); current_output.setText(response.body().getCurrent().getWeather().get(0).getDescription()); rise_time.setText(getString(R.string.blank, response.body().getCurrent().getSunrise() + " AM")); set_time.setText(getString(R.string.blank, response.body().getCurrent().getSunset() + " PM")); temp_out.setText(getString(R.string.blank, response.body().getCurrent().getTemp() + " ℃")); Press_out.setText(getString(R.string.blank, response.body().getCurrent().getPressure() + " hpa")); Humid_out.setText(getString(R.string.blank, response.body().getCurrent().getHumidity() + " %")); Ws_out.setText(getString(R.string.blank, response.body().getCurrent().getWindSpeed() + " Km/h")); Visi_out.setText(getString(R.string.blank, response.body().getCurrent().getVisibility() + " m")); } } @Override public void onFailure(@NonNull Call<WeatherResponse> call, @NonNull Throwable t) { t.printStackTrace(); } }); return rootView; } }
In my String.xml:
<string name="blank">%s ℃</string>
Advertisement
Answer
android.content.res.Resources$NotFoundException: String resource ID #0x601ee924 at android.content.res.Resources.getText(Resources.java:348) at android.widget.TextView.setText(TextView.java:5848) at com.tex.lightweatherforecast.Activity.HomeActivity$1.onResponse(HomeActivity.java:66)
As shown above, the exception is raised in HomeActivity
in onResponse()
method line (66) where you try to set a text into a TextView
.
So, In HomeActivity
you’ve:
time_field.setText(response.body().getCurrent().getDt());
And as per documentation, .getDt()
returns an integer, so you can’t set it directly to TextView
unless you convert it to a String.
To solve this, replace that line of code with one of:
// 1st time_field.setText(String.valueOf(response.body().getCurrent().getDt())); // 2nd time_field.setText("" + response.body().getCurrent().getDt());