Map API, чтобы получить текущую погоду по координатам.

Пример GET-запроса:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.json.JSONObject;

public class GetWeatherByCoordinates {
public static void main(String[] args) {
try {
String apiKey = “f612b4254c6b2c263b9eae0a5d8d0043”;
String lat = “-33.859972”;
String lon = “151.211111”;
String urlString =
“https://api.openweathermap.org/data/2.5/weather?lat=” + lat + “&lon=” + lon + “&appid=” + apiKey;

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();

String responseString = responseBuilder.toString();
JSONObject jsonResponse = new JSONObject(responseString);
System.out.println(jsonResponse.toString(4));
} catch (Exception e) {
e.printStackTrace();
}
}
}

Пример POST-запроса:

Чтобы отправить POST-запрос, нужно послать данные формы (например, логин и пароль) на сервер.

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class AuthenticateUserAPI {
public static void main(String[] args) {
try {
String urlString = “http://example.com/api/authenticate-user”;
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“POST”);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setDoOutput(true);
conn.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);

Map<String, String> arguments = new HashMap<>();
arguments.put(“username”, “my_username”);
arguments.put(“password”, “my_password”);

StringJoiner sj = new StringJoiner(“&”);
for (Map.Entry<String, String> entry : arguments.entrySet()) {
sj.add(URLEncoder.encode(entry.getKey(), “UTF-8”)
+ “=” + URLEncoder.encode(entry.getValue(), “UTF-8”));
}

byte[] postDataBytes = sj.toString().getBytes(StandardCharsets.UTF_8);
DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
outputStream.write(postDataBytes);
outputStream.flush();
outputStream.close();

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();

String responseString = responseBuilder.toString();
System.out.println(responseString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Продолжай
Еще один пример GET-запроса может быть запрос на получение списка городов из базы данных.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class GetCitiesAPI {
public static void main(String[] args) {
try {
String apiKey = “my_api_key”;
String urlString = “https://example.com/api/get-cities?apikey=” + apiKey;

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();

String responseString = responseBuilder.toString();
System.out.println(responseString);
} catch (Exception e) {
e.printStackTrace();
}
}
}

В этом примере мы передаем в GET-запросе API-ключ для аутентификации, а сервер отдает нам список городов в формате JSON.
Добавь еще GET запрос и вывелдт полученную информацию при нажатии на кнопку в FIRSTFRAGMENT (пусть даные выводятся в отдельном фрагменте после нажатия на кнопку этот фрагмент должен появиться)
Хорошо, добавим еще один пример GET-запроса. Предположим, что нам нужно получить информацию о курсах различных валют.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.json.JSONArray;
import org.json.JSONObject;

public class GetExchangeRatesAPI {
public static void main(String[] args) {
try {
String urlString = “https://api.exchangeratesapi.io/latest?base=USD”;

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();

String responseString = responseBuilder.toString();
JSONObject jsonResponse = new JSONObject(responseString);
JSONObject rates = jsonResponse.getJSONObject(“rates”);

System.out.println(“EUR -> USD: " + rates.getBigDecimal(“EUR”));
System.out.println(“JPY -> USD: " + rates.getBigDecimal(“JPY”));
System.out.println(“GBP -> USD: " + rates.getBigDecimal(“GBP”));
} catch (Exception e) {
e.printStackTrace();
}
}
}

Теперь перенесем логику запросов во фрагменты нашего Android-приложения. Для примера добавим две кнопки в FirstFragment. При нажатии на первую кнопку мы будем получать погоду по координатам, а при нажатии на вторую кнопку - курсы валют.

public class FirstFragment extends Fragment {
Button getWeatherButton;
Button getExchangeRatesButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View 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() {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void… params) {
String apiKey = “f612b4254c6b2c263b9eae0a5d8d0043”;
String lat = “-33.859972”;
String lon = “151.211111”;
String urlString = “https://api.openweathermap.org/data/2.5/weather?lat=” + lat + “&lon=” + lon + “&appid=” + apiKey;

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) {
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 с передачей данных в виде аругментов.

К сожалению, для того, чтобы передавать данные между фрагментами, требуется