海口网站建设公司,客户关系管理心得体会,网站编写语言什么好,知识付费网站建设android studio版本#xff1a;2021.2.1例程名#xff1a;hfserachcityid这几天没什么事做#xff0c;而且我原来那个“项目”因为免费api不能用了#xff0c;只能改为和风的免费api,但需要申请#xff0c;而且还要城市ID#xff0c;玩天气的基本都知道城市ID这个东西2021.2.1例程名hfserachcityid这几天没什么事做而且我原来那个“项目”因为免费api不能用了只能改为和风的免费api,但需要申请而且还要城市ID玩天气的基本都知道城市ID这个东西之前我找到一个在网页上查询城市 ID的网址但现在也用不了了我记得好像还哪里可以查但不记得了。既然和风也可以查就再做个app不就行了其实也可以把代码 放到我那个“项目”里这事以后再说。而且还可以顺便学点东西我肯定会遇到问题的解决的过程就是学习的过程。可没想到这个东西还真给我找了不少麻烦也算学到了东西。我之前做过一个“andriod 和风天气SDK获取实时天气保姆级教程”我原本想这不是一样吗代码都不用大的改动其实不一样而且我现在怀疑那个教程的代码还能不能用我真想不通代码干嘛改动那么大这样以前做的东西不都用不了算了生气也没用。先说说两个为难我的地方。这个东西获取的城市数据是ListLocationBean这种格式相关数据格式见https://dev.qweather.com/docs/android-sdk/geoapi/android-city-lookup/我以为是list于是按照listbean的获取值方法好一顿折腾就是不成功原来获取天气的时候就很简单而且当时还提供例程代码现在好了例程代码也没有了只能一遍遍试 因为我真不会啊。而且原来获取天气的代码搬过来没好使。折腾我好几天。在获取天气的时候直接可以在代码里面修改ui界面在这里不行settext出现致命错误Only the original thread that created a view hierarchy can touch its views.一查才知道不可以在非ui线程更新ui线程其实我哪里知道后来才知道是这么回事。于是又查解决办法书到用时方恨少啊。好了剩下的就是如何完整的做这个app了。重要申请key之前先建立项目项目的package name要用不建立没有这个名称。一、申请免费和风key. 网址https://id.qweather.com/#/register?redirecthttps%3A%2F%2Fconsole.qweather.com注册略。登录后进入“和风天气开发者控制台”点击左侧项目管理进入后点击右侧添加key进入下图(上图只是演示和风只能申请3个免费KEY):选择“android SDK”,key的名称随便写package name 必须与你的appg 一致否则无法获取数据。下面有提示如何获取package name,一般类似com.example.nothing这样。点击创建后如下图就得到了key 和public id.这两个在代码里和风初始化的时候都要用到。至此和风免费key申请完成此key每天有1000次免费访问足够了。二、新建项目。android studio2021.2.1file-new-newproject后如下图选择empty activity.next后项目名称自选我写的nothing是为了配合刚才那个和风key.最下面的minimumsdk是指最小兼容版本看个人需要这个以后也可以改。点finish完成。三、项目配置城市搜索开发文档https://dev.qweather.com/docs/android-sdk/geoapi/android-city-lookup/sdk下载https://dev.qweather.com/docs/configuration/android-sdk-config/把下载的sdk文件放到下图的文件夹内libs必须在project模式下才能看到可以在系统“文件管理器”打开如下路径AndroidStudioProjects\nothing\app\libs在android studio内打开文件夹在sdk文件上右键点击最下面add as library完成sdk导入。添加权限。打开androidmanafest.xml文件添加如下权限 uses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION /uses-permission android:nameandroid.permission.READ_PHONE_STATE /uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE /权限意义权限添加androidmanafest.xml位置如图示引用库。打开如下图build gradle文件,添加如下库 compile com.squareup.okhttp3:okhttp:3.12.12 3.12.12compile com.google.code.gson:gson:2.6.2 (2.6.2)至此项目配置完成。四、项目代码。主要部分都有注释。注意本代码不是nothing的代码注意包名。activity_main.xml(布局根据个人喜好下面是我使用的相对布局)?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/title1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop76dpandroid:text城市ID查询程序android:textColorandroid:color/holo_red_lightandroid:textSize20spapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.498app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/inputcityandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop140dpandroid:text请输入查询地区/城市android:textColorcolor/blackapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.167app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/citynameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop96dpandroid:text地区/城市名android:textColorcolor/blackapp:layout_constraintStart_toStartOfid/inputcityapp:layout_constraintTop_toBottomOfid/inputcity /TextViewandroid:idid/cityidandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop10dpandroid:text地区/城市ID:android:textColorcolor/blackapp:layout_constraintStart_toStartOfid/citynameapp:layout_constraintTop_toBottomOfid/cityname /TextViewandroid:idid/beloneareaandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop10dpandroid:text所属行政区域:android:textColorcolor/blackapp:layout_constraintStart_toStartOfid/cityidapp:layout_constraintTop_toBottomOfid/cityid /TextViewandroid:idid/textView11android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop10dpandroid:text上级城市:android:textColorcolor/blackapp:layout_constraintStart_toStartOfid/beloneareaapp:layout_constraintTop_toBottomOfid/belonearea /EditTextandroid:idid/inputandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop19dpandroid:ems8android:inputTypetextPersonNameandroid:minHeight48dpapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.0app:layout_constraintStart_toEndOfid/inputcityapp:layout_constraintTop_toBottomOfid/title1tools:ignoreSpeakableTextPresentCheck /TextViewandroid:idid/cityname1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text123app:layout_constraintStart_toEndOfid/citynameapp:layout_constraintTop_toTopOfid/cityname /TextViewandroid:idid/cityid1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop28dpandroid:text456app:layout_constraintBottom_toBottomOfid/cityidapp:layout_constraintStart_toEndOfid/citynameapp:layout_constraintTop_toTopOfid/cityname1 /TextViewandroid:idid/area1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text456app:layout_constraintBottom_toBottomOfid/beloneareaapp:layout_constraintStart_toEndOfid/belonearea /TextViewandroid:idid/areaandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text456app:layout_constraintBottom_toBottomOfid/textView11app:layout_constraintStart_toEndOfid/belonearea /Buttonandroid:idid/buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text确定app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.486app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/inputapp:layout_constraintVertical_bias0.0 /
/androidx.constraintlayout.widget.ConstraintLayoutmainactivity.javapackage com.example.hfserachcityid;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.google.gson.Gson;
import com.qweather.sdk.bean.base.Code;
import com.qweather.sdk.bean.geo.GeoBean;
import com.qweather.sdk.view.HeConfig;
import com.qweather.sdk.view.QWeather;public class MainActivity extends AppCompatActivity {public TextView viewname,viewid,viewarea,viewarea1;private EditText inputcity;private Button button;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewname(TextView)findViewById(R.id.cityname1);viewid(TextView)findViewById(R.id.cityid1);viewarea(TextView)findViewById(R.id.area);viewarea1(TextView)findViewById(R.id.area1);inputcity(EditText)findViewById(R.id.input);button(Button)findViewById(R.id.button);//和风初始化HeConfig.init(HE2303010152481612, 3cbc9266e3b24f38afbf182611fc3de4);HeConfig.switchToDevService();//按钮监听button.setOnClickListener(new View.OnClickListener(){Overridepublic void onClick(View v) {//此处注意gettext的值如果为空不可以用inputcity.gettext().tostring(),此值永远非空。//只能用equals,如果有值可以用方式。String string;//如果为空值无动作非空开始查询。if(string.equals(inputcity.getText().toString())){}else{getCity();}}});}//获取数据及解析关键代码public void getCity(){//获取输入框内容String inputct inputcity.getText().toString();//此方法为和风提供QWeather.getGeoCityLookup(MainActivity.this, inputct, new QWeather.OnResultGeoListener(){public static final String TAGhe_feng_city;//如果提供数据有问题显示 Overridepublic void onError(Throwable e) {Log.i(TAG, onError: , e);System.out.println(Weather Now Error:new Gson());}//如果返回结果正确则执行Overridepublic void onSuccess(GeoBean geoBean) {if (Code.OK geoBean.getCode()) {//getLocationBeanString idgeoBean.getLocationBean().get(0).getId();String namegeoBean.getLocationBean().get(0).getName();String adm2geoBean.getLocationBean().get(0).getAdm2();String adm1geoBean.getLocationBean().get(0).getAdm1();//因不可以在非ui线程修改ui线程内容所以必须使用runOnUiThread或类似方法。//直接使用viewname.setText(name);会导致错误程序退出。runOnUiThread(new Runnable() {Overridepublic void run() {viewname.setText(name);viewid.setText(id);viewarea1.setText(adm1);viewarea.setText(adm2);}});}else{//在此查看返回数据失败的原因Code code geoBean.getCode();System.out.println(失败代码: code);//Log.i(TAG, failed code: code);}}});}
}动图演示