androud studio 3.5.2
示例文件:Weathervolleyjson
关于json数据获取和解析这里就不讲了,有兴趣的看我之前的文章。
字体图标的好处就不讲了,网上一大堆。我做的那个app已经可以获取和解析和风天气了,但天气一直没有图标,感觉不太爽,于是上网逛,一般就两种方式,图片和图标字体,图片会用,只是感觉麻烦,图标字体没玩过,研究一下。
和风有自己的图标字体。下载连接:https://github.com/qwd/Icons/releases/tag/v1.1.0
里面有svg图标与有ttf、woff、woff2字体,我只需要ttf字体。所以研究这个。下面是详细步骤。
下载好的图标字体在icon文件夹下面,记住。
1、打开或新建android studio项目。并切换到project视图(具体怎么新建项目就不说了。)。
2、在src文件夹下,main文件夹上右键--new--folder--Assets Folder,Assets就是字体文件夹。
然后弹出下面窗口,不用管它,真接finish就行。:
就会出一个Assets文件夹,我这个截图文件夹里面已经有字体,所以左面才有那下拉三角,没有字体就不会有那个三角。
3、把刚才下载的字体文件qweather-icons.ttf,拷贝到这个文件夹下,路径一般是:\AndroidStudioProjects\Weathervolleyjson\app\src\main\assets,\app\src\main\assets这之前的路径可能跟你的电脑上不一样,要自己找那个项目文件。后面的一样。
4、在布局里面添加一个TextView控件。大小颜色什么的看自己喜欢,我的是这样的:
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:textSize="80dp"
android:textColor="@color/colorAccent"
android:text="TextView" />
5、加载图标字体。在onCreate里面在加载控件(比如TextView啥的)之后(注意是之后,不可以之前)添加下面代码。
Typeface font = Typeface.createFromAsset(getAssets(), "qweather-icons.ttf");//加载图标字体
textView.setTypeface(font);//设置textView使用图标字体。
那个Typeface怎么用我也不知道,反正也是跟别人学的,具体用法没查。其实使用图标字体有几种方法,大同小异,这个方法我觉得比较简单直接,好理解。
6、设置图标字体。
因为和风用的是代码,比如晴天在json里面是iconday,代码为100,多云的iconday值是101,看下图:
这个我要吐槽一下和风,太不专业,不敬业。一个字体图标整的乱七八糟。英文中文不对应,代码只跟英文对应,不跟中文对应,而且各个文件都不放在一个地方,要自己找。最最重要的是,各个地方图标还不一致,中文的只有代码没有图标。完全要自己研究。其实一个表就搞定的事,做事不用心,像我下面的表不就完了吗?
我这个表没做全,只做了白天的,晚上的没做。核对起来真的无比麻烦,要同时看三四个文件。这里一共有54种天气,基本上白天的全齐了。吐槽完毕,继续。
在和风json文件里是代码,但在字体文件中并不是代码,其他程序怎么用不知道,但在android里面是比较麻烦的。要用到两个数据。代码、和字符代码。代码就是100、101啥的,字符代码要在字附映射表软件(windows附件里有)里面查,每一个图标都有一个字符代码,看下图:
把图标字体安装到windows里,在软件里找到这个字体,再点一下图标,下面就显示这个字符代码了。因为我这个方法必须用这个字符代码才能显示,所以必须要一个个找。
下面要在json解析里面解析出iconday的代码。
String iconday=jsonObject.getString("iconDay");
解析出的数据为字符型,注意:后机的"iconDay"必须要与json文件里面的完全一样。否则不给解析,我就是犯了这个错误,D没大写,折腾了我几个小时才找到原因。
然后就是显示图标关键代码:
textView.setText(Html.fromHtml(""));
是用什么html方法显示,我也不知道叫什么,("")这里面必须这么写,前面有&#x,后面有;(分号),有人还写strings.xml文件,我看也挺麻烦,就这样吧,好理解。
然后就是一大堆判断,这步肯定是可以简化的,懒得去想,用这个方法就是复制粘贴,也简单。一共判断了54次。无非就是根据代码显示图标的字库代码。
if (iconday.equals("100")){
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("101")){
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("102")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("103")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("104")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("300")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("301")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("302")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("303")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("304")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("305")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("306")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("307")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("308")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("309")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("310")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("311")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("312")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("313")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("314")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("315")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("316")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("317")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("318")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("399")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("400")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("401")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("402")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("403")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("404")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("405")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("406")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("407")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("408")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("409")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("410")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("499")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("500")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("501")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("502")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("503")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("504")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("507")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("508")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("509")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("510")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("511")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("512")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("513")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("514")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("515")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("900")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("901")) {
textView.setText(Html.fromHtml(""));
}else{
textView.setText(Html.fromHtml(""));
}
下面是完全代码:
xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:orientation="vertical"
tools:context=".MainActivity">
<!-- This FrameLayout insets its children based on system windows using
android:fitsSystemWindows. -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="150dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="26日"
android:textColor="#FFFFFF"
android:textSize="30dp" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="27日"
android:textColor="#FFFFFF"
android:textSize="30dp" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="28日"
android:textColor="#FFFFFF"
android:textSize="30dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="180dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="小雨 23-26℃"
android:textColor="#FFEB3B"
android:textSize="30dp" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="小雨 23-26℃"
android:textColor="#FFEB3B"
android:textSize="30dp" />
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="小雨 23-26℃"
android:textColor="#FFEB3B"
android:textSize="30dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="210dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="西北风 2-3级"
android:textColor="#FF9800"
android:textSize="30dp" />
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="西北风 2-3级"
android:textColor="#FF9800"
android:textSize="30dp" />
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="西北风 2-3级"
android:textColor="#FF9800"
android:textSize="30dp" />
</LinearLayout>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:textSize="80dp"
android:textColor="@color/colorAccent"
android:text="TextView" />
</RelativeLayout>
java文件:(和风key已去掉,要填上自己的才能正常运行)
package com.example.weathervolleyjson;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Html;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private TextView textView1;
private TextView textView2;
private TextView textView3;
private TextView textView4;
private TextView textView5;
private TextView textView6;
private TextView textView7;
private TextView textView8;
private TextView textView9;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
Typeface font = Typeface.createFromAsset(getAssets(), "qweather-icons.ttf");
textView.setTypeface(font);
getjson();
}
public void initview()//把需要初始化的控件的逻辑都写在这里是一个很好的编程范式
{
textView=findViewById(R.id.textView);
textView1=findViewById(R.id.textView1);
textView2=findViewById(R.id.textView2);
textView3=findViewById(R.id.textView3);
textView4=findViewById(R.id.textView4);
textView5=findViewById(R.id.textView5);
textView6=findViewById(R.id.textView6);
textView7=findViewById(R.id.textView7);
textView8=findViewById(R.id.textView8);
textView9=findViewById(R.id.textView9);
}
public void getjson()
{
//1、获取json数据
//创建一个请求队列
RequestQueue requestQueue=Volley.newRequestQueue(MainActivity.this);
//创建一个请求
String url="https://devapi.qweather.com/v7/weather/3d?lang=zh&location=101280603&key=和风key位置gzip=n ";
StringRequest stringRequest=new StringRequest(Request.Method.GET,url, new Response.Listener<String>() {
//正确接受数据之后的回调
@Override
public void onResponse(String response) {
analyzeJSONArray(response);//解析response json数据
System.out.println("获取数据成功"+response);
}
}, new Response.ErrorListener() {//发生异常之后的监听回调
@Override
public void onErrorResponse(VolleyError error) {
textView1.setText("加载错误"+error);
}
});
//将创建的请求添加到请求队列当中
requestQueue.add(stringRequest);
}
//2、解析json数据
public void analyzeJSONArray(String json) {
try{
/**
* JSON数组在牛逼,一旦有了 key person 这样的标记,就必须先是个 JSON对象
* 最外层的JSON对象,最大的哪个 { ... }
*/
JSONObject jsonObjectALL = new JSONObject(json);
// 通过标识(person),获取JSON数组
JSONArray jsonArray = jsonObjectALL.getJSONArray("daily");
JSONObject jsonObject = jsonArray.getJSONObject(0);
String iconday=jsonObject.getString("iconDay");
String date = jsonObject.getString("fxDate");
String subdate= date.substring(date.length()-2);
String tianqi=jsonObject.getString("textDay");
String qiwenmax=jsonObject.getString("tempMax");
String qiwenmin=jsonObject.getString("tempMin");
String fengxiang = jsonObject.getString("windDirDay");
String fengli= jsonObject.getString("windScaleDay");
textView1.setText(subdate+"日");
textView2.setText(tianqi+" "+qiwenmin+"-"+qiwenmax+"℃");
textView3.setText(fengxiang+" "+fengli+"级");
if (iconday.equals("100")){
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("101")){
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("102")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("103")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("104")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("300")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("301")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("302")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("303")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("304")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("305")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("306")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("307")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("308")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("309")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("310")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("311")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("312")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("313")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("314")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("315")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("316")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("317")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("318")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("399")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("400")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("401")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("402")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("403")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("404")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("405")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("406")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("407")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("408")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("409")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("410")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("499")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("500")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("501")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("502")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("503")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("504")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("507")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("508")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("509")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("510")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("511")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("512")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("513")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("514")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("515")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("900")) {
textView.setText(Html.fromHtml(""));
}else if(iconday.equals("901")) {
textView.setText(Html.fromHtml(""));
}else{
textView.setText(Html.fromHtml(""));
}
JSONObject jsonObject1 = jsonArray.getJSONObject(1);
String date2 = jsonObject1.getString("fxDate");
String subdate2= date2.substring(date2.length()-2);
String tianqi2=jsonObject1.getString("textDay");
String qiwenmax2=jsonObject1.getString("tempMax");
String qiwenmin2=jsonObject1.getString("tempMin");
String fengxiang2 = jsonObject1.getString("windDirDay");
String fengli2= jsonObject1.getString("windScaleDay");
textView4.setText(subdate2+"日");
textView5.setText(tianqi2+" "+qiwenmin2+"-"+qiwenmax2+"℃");
textView6.setText(fengxiang2+" "+fengli2+"级");
JSONObject jsonObject2 = jsonArray.getJSONObject(2);
String date3 = jsonObject2.getString("fxDate");
String subdate3= date3.substring(date3.length()-2);
String tianqi3=jsonObject2.getString("textDay");
String qiwenmax3=jsonObject2.getString("tempMax");
String qiwenmin3=jsonObject2.getString("tempMin");
String fengxiang3 = jsonObject2.getString("windDirDay");
String fengli3= jsonObject2.getString("windScaleDay");
textView7.setText(subdate3+"日");
textView8.setText(tianqi3+" "+qiwenmin3+"-"+qiwenmax3+"℃");
textView9.setText(fengxiang3+" "+fengli3+"级");
} catch (Exception e) {
e.printStackTrace();
}
}
}
其实我想了一下,json解析两次就行了,再解析一次英文版的,然后取英文的天气,就不用那么多判断了。不知道行不行,就怕和风英文天气也不是一个标准,反正也没试,这样直接用天气代码不绝对不会出错,就是代码太难看。
最后显示结果:
最后显摆一下我做完的桌面手机摆件,就是只做了一个橫向布局,坚向的还没做。这段时间没空了,6月份以后再研究吧。不知道到那时还能记住多少。