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就是字体文件夹。

android 广告组件显示天气 安卓显示天气图标_android 广告组件显示天气

 然后弹出下面窗口,不用管它,真接finish就行。:

android 广告组件显示天气 安卓显示天气图标_和风天所_02

 就会出一个Assets文件夹,我这个截图文件夹里面已经有字体,所以左面才有那下拉三角,没有字体就不会有那个三角。

android 广告组件显示天气 安卓显示天气图标_android_03

 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,看下图:

android 广告组件显示天气 安卓显示天气图标_java_04

这个我要吐槽一下和风,太不专业,不敬业。一个字体图标整的乱七八糟。英文中文不对应,代码只跟英文对应,不跟中文对应,而且各个文件都不放在一个地方,要自己找。最最重要的是,各个地方图标还不一致,中文的只有代码没有图标。完全要自己研究。其实一个表就搞定的事,做事不用心,像我下面的表不就完了吗?

android 广告组件显示天气 安卓显示天气图标_java_05

我这个表没做全,只做了白天的,晚上的没做。核对起来真的无比麻烦,要同时看三四个文件。这里一共有54种天气,基本上白天的全齐了。吐槽完毕,继续。

在和风json文件里是代码,但在字体文件中并不是代码,其他程序怎么用不知道,但在android里面是比较麻烦的。要用到两个数据。代码、和字符代码。代码就是100、101啥的,字符代码要在字附映射表软件(windows附件里有)里面查,每一个图标都有一个字符代码,看下图:

android 广告组件显示天气 安卓显示天气图标_和风天所_06

把图标字体安装到windows里,在软件里找到这个字体,再点一下图标,下面就显示这个字符代码了。因为我这个方法必须用这个字符代码才能显示,所以必须要一个个找。

下面要在json解析里面解析出iconday的代码。


String iconday=jsonObject.getString("iconDay");


解析出的数据为字符型,注意:后机的"iconDay"必须要与json文件里面的完全一样。否则不给解析,我就是犯了这个错误,D没大写,折腾了我几个小时才找到原因。

然后就是显示图标关键代码:


textView.setText(Html.fromHtml(""));


是用什么html方法显示,我也不知道叫什么,("&#xF101;")这里面必须这么写,前面有&#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解析两次就行了,再解析一次英文版的,然后取英文的天气,就不用那么多判断了。不知道行不行,就怕和风英文天气也不是一个标准,反正也没试,这样直接用天气代码不绝对不会出错,就是代码太难看。

最后显示结果:

android 广告组件显示天气 安卓显示天气图标_android_07

 最后显摆一下我做完的桌面手机摆件,就是只做了一个橫向布局,坚向的还没做。这段时间没空了,6月份以后再研究吧。不知道到那时还能记住多少。

android 广告组件显示天气 安卓显示天气图标_android_08