Pro météo app ب أندرويد الجزء الثاني


فهاد الجزء الثاني والأخير من Pro météo app ب أندرويد غادي نشوفو كيفاش يمكن للمستخدم يدخل مدن أخرى ويسترجع حالة الطقس فيهم منبعد ماشوفنا كيفاش نعرضو الحالة ديال الموقع لي هو فيه فغادي نزيدو الملفات لي غادي يمكنونا باش نزيدو هاد les options كاملين.

نظرة سريعة بالفيديو

1- الملف change_city.xml

فغادي نرجع للمجلد java فيه غادي تزيد activity جديدة سميها ChangeCityActivity وسمي ل xml file change_city منبعد سير للمجلد res/layout فيه غادي تلقى الملف لي زدنا لي هو change_city فيه الكود لي فيه textview وedittext كتمكن المستخدم باش يدخل المدينة لي بغى وimagebutton لي كتمكنو باش يرجع للصفحة الرئيسية الكود ديال الملف هو :

                                <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:background="@drawable/change_city_background"
    android:layout_height="match_parent">
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/backBtn"
        android:src="@drawable/left"
        android:background="@null"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:hint="Entrer une ville"
        android:background="@color/white"
        android:textSize="30sp"
        android:inputType="textAutoCorrect"
        android:id="@+id/cityEdit"
        android:textColor="@color/black"
        android:imeOptions="actionGo"
        android:gravity="center_vertical|center_horizontal"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Changer la ville"
        android:textColor="@color/white"
        android:textSize="50sp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/getWeatherTV"
        android:layout_below="@+id/backBtn"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>
                            

2- الملف ChangeCityActivity.java

المجلد java كاين الملف ChangeCityActivity.java هنا كنسترجع imagebutton ول edittext بل id ديالهم من بعد ملي كيكليكي المستخدم على ل imagebutton كنسد هاد ل activity الشي لي كيمكن باش نرجع للصفحة الرئيسية منبعد كنسترجع القيمة لي دخل المستخدم فالحقل وكنرسلها لل MainActivity بإستخدام ل intent لي يلا رجعنا لل MainActivity غادي نلقاوها فل fonction onResume فكنسترجع المدينة وكنعطيها لل fonction getNewCityWeather لي كترسلها لل fonction sendData لي كتمكنا من استرجاع حالة الطقس ديال هاد المدينة الكود ديال الملف هو :

                                package com.example.belasri.proclimaapp;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import org.json.JSONObject;

import cz.msebera.android.httpclient.Header;

public class MainActivity extends AppCompatActivity {
    final int REQUEST_CODE = 123;
    final String URL = "http://api.openweathermap.org/data/2.5/weather";
    final String KEY = "9883d8493cbbfcd643e0837c6ca20314";
    // Time between location updates (5000 milliseconds or 5 seconds)
    final long TIME = 5000;
    // Distance between location updates (1000m or 1km)
    final float DISTANCE = 1000;
    TextView mCity;
    ImageView mImage;
    TextView mTemperature;
    String locationProvider = LocationManager.NETWORK_PROVIDER;
    // TODO: Declare a LocationManager and a LocationListener here:
    LocationManager mLocationManager;
    LocationListener mLocationListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mCity = (TextView) findViewById(R.id.position);
        mImage = (ImageView) findViewById(R.id.weatherImage);
        mTemperature = (TextView) findViewById(R.id.temp);
        ImageButton changeCityBtn = (ImageButton) findViewById(R.id.ChButtonCity);
        changeCityBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,ChangeCityActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        String newCity = getIntent().getStringExtra("city");
        if(newCity != null){
            getNewCityWeather(newCity);
        }else{
            getCurrentWeather();
        }
    }
    private void getNewCityWeather(String newCity) {
        RequestParams params = new RequestParams();
        params.put("q",newCity);
        params.put("appid",KEY);
        sendData(params);
    }
    private void getCurrentWeather() {
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                Log.d("climateApp : ","location changed");
                String latitude = String.valueOf(location.getLatitude());
                String longitude = String.valueOf(location.getLongitude());
                Log.d("latitude : ",latitude);
                Log.d("longitude : ",longitude);
                RequestParams params = new RequestParams();
                params.put("lat",latitude);
                params.put("lon",longitude);
                params.put("appid",KEY);
                sendData(params);
            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {

            }
        };
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_CODE);
            return;
        }
        mLocationManager.requestLocationUpdates(locationProvider, TIME, DISTANCE, mLocationListener);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == REQUEST_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                Log.d("climateApp : ","permission accepté");
                getCurrentWeather();
            }else{
                Log.d("climateApp : ","permission refusé");
            }
        }
    }
    private void sendData(RequestParams params){
        AsyncHttpClient client = new AsyncHttpClient();
        client.get(URL,params,new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                Log.d("climateApp : ","Response :" + response.toString());
                WeatherModel weatherModel = WeatherModel.getJsonData(response);
                setData(weatherModel);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                Log.d("climateApp : ","Echoué :" + throwable.toString());
                Log.d("climateApp : ","Status Code :" + statusCode);
                Toast.makeText(MainActivity.this, "Erreur!", Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void setData(WeatherModel weather){
        mTemperature.setText(weather.getTemp());
        mCity.setText(weather.getCity());
        int imageId = getResources().getIdentifier(weather.getIcon(),"drawable",getPackageName());
        mImage.setImageResource(imageId);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(mLocationManager != null){
            mLocationManager.removeUpdates(mLocationListener);
        }
    }
}
                            

3- الملف AndroidManifest.xml

باش تمكن التطبيق من إستعمال الأنترنيت و المواقع لي كتعني الإحداثيات كتزيد هاد الكود فالملف AndroidManifest.xml :

                                <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
                            


بحث في الموقع


إشترك للتوصل بالجديد