Проверь правильно кода , этот код используется для отображения текущей погоды с openweather , но при запуске фрагмента появляется ошибка : У меня выходит ошибка , где я ошибся : package com.example.myapp_2;

import com.google.gson.annotations.SerializedName;

import java.util.List;

public class ForecastResponse {
@SerializedName(“list”)
private List<WeatherForecast> weatherForecastList;

public List<WeatherForecast> getWeatherForecastList() {
return weatherForecastList;
}
}

package com.example.myapp_2;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
private static Retrofit retrofit;
private static final String BASE_URL =“https://api.openweathermap.org/data/2.5/”;

public static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new retrofit2.Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}

package com.example.myapp_2;

import com.google.gson.annotations.SerializedName;

public class Temperature {
@SerializedName(“temp”)
private float temperatureValue;

public float getTemperatureValue() {
return temperatureValue;
}
}
package com.example.myapp_2;

import com.google.gson.annotations.SerializedName;

public class WeatherForecast {
@SerializedName(“dt_txt”)
private String date;

@SerializedName(“main”)
private Temperature temperature;

public String getDate() {
return date;
}

public Temperature getTemperature() {
return temperature;
}
}

package com.example.myapp_2;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class WeatherFragment extends Fragment {
private TextView temperatureTv;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_weather, container, false);

temperatureTv = view.findViewById(R.id.temperature_tv);

WeatherService weatherService = RetrofitClient.getRetrofitInstance().create(WeatherService.class);
Call<WeatherResponse> call = weatherService.getCurrentWeather(“Moscow”, “f612b4254c6b2c263b9eae0a5d8d0043”);
call.enqueue(new Callback<WeatherResponse>() {
@Override
public void onResponse(Call<WeatherResponse> call, Response<WeatherResponse> response) {
WeatherResponse weatherResponse = response.body();
Temperature temperature = weatherResponse.getTemperature();

// отобразить температуру в TextView
temperatureTv.setText(temperature.getTemperatureValue() + " ℃");
}

@Override
public void onFailure(Call<WeatherResponse> call, Throwable t) {
t.printStackTrace();
}
});

return view;
}
}package com.example.myapp_2;

import com.google.gson.annotations.SerializedName;

public class WeatherResponse {
@SerializedName(“name”)
private String cityName;

@SerializedName(“main”)
private Temperature temperature;

public String getCityName() {
return cityName;
}

public Temperature getTemperature() {
return temperature;
}
}


package com.example.myapp_2;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface WeatherService {
@GET(“weather”)
Call<WeatherResponse> getCurrentWeather(
@Query(“q”) String cityName,
@Query(“appid”) String apiKey
);

@POST(“forecast”)
Call<ForecastResponse> getWeatherForecast(
@Query(“q”) String cityName,
@Query(“appid”) String apiKey
);
}
weatherBtn = v.findViewById(R.id.weather_btn);

weatherBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// запустить WeatherFragment
FragmentTransaction transaction = getParentFragmentManager().beginTransaction();
transaction.replace(R.id.nav_container, new WeatherFragment());
transaction.addToBackStack(null);
transaction.commit();
}
});
Ошибка не указана в коде, но возможно она связана с использованием некорректных кавычек при указании строковых констант. Возможно, следует заменить кавычки “ ” на обычные " ". Также возможна ошибка возникшая при отсутствии разрешения на использование интернета в приложении.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp_2, PID: 2803
java.lang.NullPointerException: Attempt to invoke virtual method ‘com.example.myapp_2.Temperature com.example.myapp_2.WeatherResponse.getTemperature()’ on a null object reference
at com.example.myapp_2.WeatherFragment1.onResponse(WeatherFragment.java:30)
at retrofit2.DefaultCallAdapterFactoryExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Ошибка возникает на строке 30 в методе onResponse класса WeatherFragment. Возможно, ответ от сервера не содержит данных, а также возможно неверно переданы параметры запроса. Следует проверить правильность URL-адреса и параметров запроса в интерфейсе WeatherService, а также реализацию метода getCurrentWeather в классе WeatherFragment. Также убедитесь в наличии правильного разрешения INTERNET в манифесте приложения.
Испольуй это и исправь код : мой ключ : f612b4254c6b2c263b9eae0a5d8d0043 , API call

https://api.openweathermap.org/data/3.0/onecall?lat={lat}&lon={lon}&exclude={part}&appid={API key}
Замените текущий базовый URL установленный в RetrofitClient на новый базовый URL (https://api.openweathermap.org/data/3.0/) и создайте новый интерфейс WeatherOneCallService.

Здесь пример кода в WeatherOneCallService:

public interface WeatherOneCallService {

@GET(“onecall”)
Call<WeatherResponse> getCurrentWeather(
@Query(“lat”) double lat,
@Query(“lon”) double lon,
@Query(“exclude”) String exclude,
@Query(“appid”) String apiKey
);
}

Теперь можно использовать этот интерфейс внутри метода onCreateView в WeatherFragment.

WeatherOneCallService weatherService = RetrofitClient.getRetrofitInstance()
.create(WeatherOneCallService.class);

Call<WeatherResponse> call = weatherService.getCurrentWeather(55.7522200, 37.6155600, “hourly,minutely”, “f612b4254c6b2c263b9eae0a5d8d0043”);

call.enqueue(new Callback<WeatherResponse>() {
@Override
public void onResponse(Call<WeatherResponse> call, Response<WeatherResponse> response) {
if (response.code() == 200) {
WeatherResponse weatherResponse = response.body();
List<Hourly> hourlyList = weatherResponse.getHourly();

//Отобразить данные в TextView
StringBuffer buffer = new StringBuffer();
for (Hourly hourly : hourlyList) {
buffer.append(hourly.getDt()).append(“: “).append(hourly.getTemp()).append(”\n”);
}
temperatureTv.setText(buffer.toString());
}
}

@Override
public void onFailure(Call<WeatherResponse> call, Throwable t) {
t.printStackTrace();
}
});

Это примерный код, возможно понадобится провести дополнительные настройки в зависимости от используемых моделей данных. Следует заменить API-ключ на свой собственный.
Что ты изменил? и будет ли теперь данные отображать там где нужно и активируется ли код при вызове этого фрагмента?
Я изменил базовый URL установленный в RetrofitClient. Также я создал новый интерфейс WeatherOneCallService для работы с API OpenWeatherMap. Внутри метода onCreateView в WeatherFragment я использовал новый интерфейс WeatherOneCallService для получения данных о погоде.

В моем примере я использую широту и долготу как параметры запроса, поэтому в вашем коде вы должны заменить эти значения на те, которые вам нужны для вашего приложения.

Также я изменил код в onResponse, чтобы он проверял код ответа сервера. Если код ответа будет равен 200, то данные будут отображены в TextView.

Чтобы активировать код при вызове этого фрагмента, вы должны отобразить этот фрагмент на экране. Для этого вы должны использовать фрагмент-менеджер. Код, который вы предоставили ранее, сможет активировать этот фрагмент, если вы укажете правильный идентификатор контейнера для фрагментов.
Cannot resolve symbol ‘Hourly’
Класс Hourly вероятно описывает данные, получаемые в ответе от сервера OpenWeatherMap. Вы должны создать класс Hourly самостоятельно.

Зависимости для работы с библиотекой Retrofit уже добавлены, поэтому код для этого класса должен содержать только поля с соответствующими аннотациями.

Пример кода для класса Hourly:

import com.google.gson.annotations.SerializedName;

public class Hourly {

@SerializedName(“dt”)
private long dt;

@SerializedName(“temp”)
private double temp; // температура в градусах Цельсия
// также вы можете добавить другие поля для описания данных, получаемых от сервера

public long getDt() {
return dt;
}

public double getTemp() {
return temp;
}

// также вы можете добавить сеттеры для установки значений полям
}

Чтобы избежать ошибок, убедитесь, что вы импортировали правильный пакет для этого класса в вашем коде.
Cannot resolve method ‘getHourly’ in ‘WeatherResponse’
Метод getHourly() возможно не найден, потому что вы не определили этот метод в классе WeatherResponse.

Для решения этой проблемы вам нужно добавить соответствующее поле с аннотацией @SerializedName и метод getHourly() для доступа к этому полю.

Например:

import com.google.gson.annotations.SerializedName;
import java.util.List;

public class WeatherResponse {

// другие поля класса

@SerializedName(“hourly”)
private List<Hourly> hourlyList;

public List<Hourly> getHourly() {
return hourlyList;
}

// также вы можете добавить сеттеры для установки значений полям
}

Эти изменения позволят вам получить доступ к прогнозу погоды на определенный промежуток времени, например, каждый час в течение 48 часов (если вы не исключили прогноз почасовой погоды в URL запроса).

Обратите внимание, что изменения были сделаны в классе WeatherResponse, а не в классе, который представлен вами ранее, и возможно, потребуется еще некоторое количество изменений в вашем коде.
Данные не появились : W/example.myapp_: Accessing hidden method Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (greylist,core-platform-api, reflection, allowed)
W/example.myapp_: Accessing hidden method Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V (greylist,core-platform-api, reflection, allowed)
W/example.myapp_: Accessing hidden method Ldalvik/system/CloseGuard;->warnIfOpen()V (greylist,core-platform-api, reflection, allowed)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (greylist-max-q,core-platform-api, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setUseSessionTickets(Z)V (greylist-max-q,core-platform-api, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/AbstractConscryptSocket;->setUseSessionTickets(Z)V (greylist-max-q, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (greylist-max-q,core-platform-api, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHostname(Ljava/lang/String;)V (greylist-max-q,core-platform-api, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/AbstractConscryptSocket;->setHostname(Ljava/lang/String;)V (greylist-max-q, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V (greylist-max-q,core-platform-api, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([B)V (greylist-max-q, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B (greylist-max-q,core-platform-api, reflection, denied)
W/example.myapp_: Accessing hidden method Lcom/android/org/conscrypt/AbstractConscryptSocket;->getAlpnSelectedProtocol()[B (greylist-max-q, reflection, denied)
Ошибки, которые вы указали, являются предупреждениями, которые обычно не влияют на работу приложения. Эти предупреждения связаны с использованием скрытых методов в некоторых библиотеках.

Ошибки в общем не имеют никакого отношения к отображению данных в вашем приложении. В то же время, если вы хотите избавиться от перечисленных ошибок, вам следует быть внимательнее при выборе библиотек и методов, используемых в вашем приложении, а также убедиться, что используемые вами библиотеки корректно поддерживаются на вашей платформе и в версии Android, которую вы используете.
Сделай так чтобы данные о погоде отображались в weather_fragmetn , в тамошнем TextView
Для отображения данных в TextView вам нужно сначала найти соответствующий виджет по идентификатору в методе onCreateView() в классе WeatherFragment.

Вы можете найти виджет текстового поля с помощью метода view.findViewById(), передав идентификатор текстового поля в качестве параметра.

Пример кода для нахождения текстового поля в методе onCreateView():

public class WeatherFragment extends Fragment {

private TextView temperatureTv;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// наполнение макета фрагмента
View view = inflater.inflate(R.layout.fragment_weather, container, false);

// нахождение текстового поля по идентификатору
temperatureTv = view.findViewById(R.id.temperature_tv);

// получение погодных данных и отображение их в textView

return view;
}
}

Затем, когда вы получите данные погоды в методе onResponse() внутри класса WeatherFragment, вы можете вызвать метод setText() на экземпляре TextView, чтобы установить текст, отображаемый в TextView.

Пример кода для установки текста в TextView в методе onResponse():

@Override
public void onResponse(Call<WeatherResponse> call, Response<WeatherResponse> response) {
if (response.code() == 200) {
WeatherResponse weatherResponse = response.body();
List<Hourly> hourlyList = weatherResponse.getHourly();

// преобразование данных в строку и установка текста в TextView
StringBuilder builder = new StringBuilder();
for (Hourly hourly : hourly