@Override
protected void onPostExecute(String result) {
if (result != null) {
WeatherDataFragment fragment = new WeatherDataFragment();
Bundle bundle = new Bundle();
bundle.putString(“weatherData”, result);
fragment.setArguments(bundle);
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment).addToBackStack(null).commit();
} else {
Toast.makeText(getContext(), “Failed to retrieve weather data”, Toast.LENGTH_SHORT).show();
}
}
}.execute();
}

public void getExchangeRatesData() {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void… params) {
String urlString = “https://api.exchangeratesapi.io/latest?base=USD”;

try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.connect();

InputStreamReader inStream = new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8);
BufferedReader bufReader = new BufferedReader(inStream);
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = bufReader.readLine()) != null) {
responseBuilder.append(line).append(”\n");
}
bufReader.close();
conn.disconnect();

return responseBuilder.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

@Override
protected void onPostExecute(String result) {
if (result != null) {
ExchangeRatesDataFragment fragment = new ExchangeRatesDataFragment();
Bundle bundle = new Bundle();
bundle.putString(“exchangeRatesData”, result);
fragment.setArguments(bundle);
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment).addToBackStack(null).commit();
} else {
Toast.makeText(getContext(), “Failed to retrieve exchange rates data”, Toast.LENGTH_SHORT).show();
}
}
}.execute();
}
}

В методах getWeatherData() и getExchangeRatesData() мы выполняем запросы в фоновом потоке, чтобы не блокировать главный пользовательский интерфейс. Затем, в методе onPostExecute(), создаем соответствующий фрагмент и передаем ему полученные данные в виде аргументов.

public class WeatherDataFragment extends Fragment {
TextView weatherDataTextView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_weather_data, container, false);
weatherDataTextView = rootView.findViewById(R.id.weather_data_text_view);
Bundle bundle = getArguments();
String weatherData = bundle.getString(“weatherData”);
if (weatherData != null) {
JSONObject jsonResponse = new JSONObject(weatherData);
String cityName = jsonResponse.getString(“name”);
double temperature = jsonResponse.getJSONObject(“main”).getDouble(“temp”);
int humidity = jsonResponse.getJSONObject(“main”).getInt(“humidity”);
String weatherDescription = jsonResponse.getJSONArray(“weather”).getJSONObject(0).getString(“description”);
String outputString = "City: " + cityName + “\n”
+ "Temperature: " + temperature + “K\n”
+ "Humidity: " + humidity + “%\n”
+ "Weather Description: " + weatherDescription;
weatherDataTextView.setText(outputString);
}
return rootView;
}
}

public class ExchangeRatesDataFragment extends Fragment {
TextView exchangeRatesDataTextView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_exchange_rates_data, container, false);
exchangeRatesDataTextView = rootView.findViewById(R.id.exchange_rates_data_text_view);
Bundle bundle = getArguments();
String exchangeRatesData = bundle.getString(“exchangeRatesData”);
if (exchangeRatesData != null) {
JSONObject jsonResponse = new JSONObject(exchangeRatesData);
JSONObject rates = jsonResponse.getJSONObject(“rates”);
BigDecimal eurToUsd = rates.getBigDecimal(“EUR”);
BigDecimal jpyToUsd = rates.getBigDecimal(“JPY”);
BigDecimal gbpToUsd = rates.getBigDecimal(“GBP”);
String outputString = "EUR -> USD: " + eurToUsd + “\n”
+ "JPY -> USD: " + jpyToUsd + “\n”
+ "GBP -> USD: " + gbpToUsd;
exchangeRatesDataTextView.setText(outputString);
}
return rootView;
}
}

В соответствующих Fragment-ах мы разбираем полученные данные и выводим их в TextView. При нажатии на кнопки нашего FirstFragment данные о погоде или курсах валют будут отображаться в отдельном фрагменте.
Cannot resolve symbol ‘rootView’,Cannot resolve symbol ‘get_weather_button’,Cannot resolve symbol ‘getExchangeRatesButton’,Cannot resolve symbol ‘get_exchange_rates_button’
Извините, в моем предыдущем ответе я не учел ваш файл макета фрагмента.

Вывод таких ошибок, как “Cannot resolve symbol ‘rootView’”, “Cannot resolve symbol ‘get_weather_button’”, “Cannot resolve symbol ‘getExchangeRatesButton’”, “Cannot resolve symbol ‘get_exchange_rates_button’”, обычно означает, что соответствующие переменные или представления не были объявлены в классе фрагмента.

Вам нужно объявить переменные View внутри метода onCreateView() и назначить им соответствующие элементы из макета фрагмента. Ниже приведен пример, как это можно сделать, исходя из того, что в макете фрагмента есть две кнопки с идентификаторами get_weather_button и get_exchange_rates_button.

public class FirstFragment extends Fragment {
private View rootView;
private Button getWeatherButton;
private Button getExchangeRatesButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_first, container, false);
getWeatherButton = rootView.findViewById(R.id.get_weather_button);
getExchangeRatesButton = rootView.findViewById(R.id.get_exchange_rates_button);

getWeatherButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getWeatherData();
}
});

getExchangeRatesButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getExchangeRatesData();
}
});

return rootView;
}

public void getWeatherData() {
// код запроса погоды
}

public void getExchangeRatesData() {
// код запроса курсов валют
}
}

Пожалуйста, убедитесь, что полные идентификаторы кнопок (R.id.get_weather_button и R.id.get_exchange_rates_button) соответствуют их именам в xml-макете.
Добавь необходимый xmlCannot resolve symbol ‘fragment_weather_data’,Cannot resolve symbol ‘weather_data_text_view’ + сделай так чтобы данные по гогоде выводились при клике в другом фрагменте , укажи что необходимо исправить и добавить
Хорошо, вот пример XML-макета fragment_weather_data.xml, содержащего TextView для отображения данных о погоде:

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>

<TextView
android:id=“@+id/weather_data_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:padding=“16dp” />

</LinearLayout>

Вам нужно создать новый фрагмент, например WeatherDataFragment, и добавить в него TextView с идентификатором weather_data_text_view. Затем, в методе getWeatherData() FirstFragment, вместо отображения данных в том же фрагменте, создайте новый экземпляр WeatherDataFragment с передачей данных в виде аругментов.

К сожалению, для того, чтобы передавать данные между фрагментами, требуется
небольшая переделка кода. Во-первых, в WeatherDataFragment нужно переопределить метод onCreate(), чтобы можно было получить аргументы, переданные из FirstFragment:

public class WeatherDataFragment extends Fragment {
TextView weatherDataTextView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
String weatherData = bundle.getString(“weatherData”);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_weather_data, container, false);
weatherDataTextView = rootView.findViewById(R.id.weather_data_text_view);
if (weatherData != null) {
JSONObject jsonResponse = new JSONObject(weatherData);
String cityName = jsonResponse.getString(“name”);
double temperature = jsonResponse.getJSONObject(“main”).getDouble(“temp”);
int humidity = jsonResponse.getJSONObject(“main”).getInt(“humidity”);
String weatherDescription = jsonResponse.getJSONArray(“weather”).getJSONObject(0).getString(“description”);
String outputString = "City: " + cityName + “\n”
+ "Temperature: " + temperature + “K\n”
+ "Humidity: " + humidity + “%\n”
+ "Weather Description: " + weatherDescription;
weatherDataTextView.setText(outputString);
}
return rootView;
}
}

Затем, в методе getWeatherData() FirstFragment, создадим экземпляр WeatherDataFragment, передадим ему данные в виде аргументов и заменим текущий фрагмент на новый:

public void getWeatherData() {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void… params) {
String apiKey = “f612b4254c6b2c263b9eae0a5d8d0043”;
String lat = “-33.859972”;
String lon = “151.211111”