电信巨擘华为10月22日宣布推出“纯血”鸿蒙作业系统(操作系统) HarmonyOS 5.0,引发全球智能装备市场高度关注。这套系统强调完全自主研发,是首个国产行动作业系统。这套系统已成为全球第三大行动作业系统,仅次于苹果iOS系统和谷歌旗下的安卓(Android)。
华为宣布正式发布纯血鸿蒙作业系统之后,引发全球科技界关注。作为电子科技的领头羊,华为推出任何新产品及技术,拥有电子半导体业“独立自主”、摆脱依赖技术的背景。
在10月22日晚的发表会上,公司常务董事余承东强调此次推出鸿蒙5.0,代表华为实现了全面突破:“我们在操作系统的研发,用10年的时间干了欧美同行30多年才做成的事。”北京刊出评论员文章称,“‘纯血’鸿蒙更代表着企业在操作系统领域从‘跟跑’到‘领跑’的奋进,是打破‘缺芯少魂’困局的重要一步。”
上面都是吹水的哈,本文直接上手第一个鸿蒙项目,如何在开发工具DevEco Studio上run起来一个简单应用。
好的!下面是稍复杂一点的鸿蒙项目示例。这次我们将创建一个 新闻阅读应用,它包含以下功能:
- 从网络获取新闻列表。
- 显示新闻的标题和简短内容。
- 点击某条新闻,进入新闻详情页面。
项目:新闻阅读应用
项目功能:
- 从网络获取新闻数据:使用简单的 API(模拟)从服务器获取新闻列表。
- 展示新闻列表:使用
ListContainer
显示新闻的标题和简要内容。 - 点击查看详情:点击新闻标题,进入详细页面,显示新闻的全文内容。
1. 项目结构
news-app
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com.example.newsapp
│ │ │ └── MainAbility.java // 主入口代码
│ │ │ └── NewsDetailAbility.java // 新闻详情页面
│ │ ├── resources
│ │ │ ├── base
│ │ │ │ └── layout
│ │ │ │ ├── main_layout.xml // 新闻列表页面布局
│ │ │ │ └── news_detail.xml // 新闻详情页面布局
│ │ ├── config.json // 配置文件
│ ├── resources.json // 资源文件信息
2. 布局文件:main_layout.xml
路径:news-app/src/main/resources/base/layout/main_layout.xml
这是新闻列表页面的布局,包含:
- 一个
ListContainer
,用于显示新闻的标题和简要内容。
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:width="match_parent"
ohos:height="match_parent"
ohos:orientation="vertical"
ohos:padding="10vp">
<!-- 新闻列表 -->
<ListContainer
ohos:id="$+id:news_list"
ohos:width="match_parent"
ohos:height="match_parent"/>
</DirectionalLayout>
3. 新闻详情页面布局:news_detail.xml
路径:news-app/src/main/resources/base/layout/news_detail.xml
显示新闻的详细内容,包含:
- 一个
Text
用于显示新闻标题。 - 一个
Text
用于显示新闻的详细内容。
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:width="match_parent"
ohos:height="match_parent"
ohos:orientation="vertical"
ohos:padding="20vp">
<!-- 新闻标题 -->
<Text
ohos:id="$+id:news_title"
ohos:width="match_parent"
ohos:height="wrap_content"
ohos:text_size="25fp"
ohos:text_color="#000000"
ohos:margin_bottom="10vp"/>
<!-- 新闻内容 -->
<Text
ohos:id="$+id:news_content"
ohos:width="match_parent"
ohos:height="wrap_content"
ohos:text_size="18fp"
ohos:text_color="#000000"/>
</DirectionalLayout>
4. 主页面代码:MainAbility.java
路径:news-app/src/main/java/com/example/newsapp/MainAbility.java
在 MainAbility.java
中,我们会模拟从网络获取新闻数据,并将数据展示在新闻列表中。当用户点击某条新闻时,跳转到新闻详情页面。
package com.example.newsapp;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.components.ListContainer;
import ohos.agp.components.Text;
import ohos.agp.components.BaseItemProvider;
import ohos.agp.components.Component;
import ohos.agp.components.Button;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.util.ArrayList;
import java.util.List;
public class MainAbility extends Ability {
private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_CORE, 0xD001100, "MainAbility");
private ListContainer newsList;
private NewsAdapter newsAdapter;
private List<NewsItem> newsItems;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_main_layout);
newsList = (ListContainer) findComponentById(ResourceTable.Id_news_list);
// 模拟获取网络数据
newsItems = new ArrayList<>();
newsItems.add(new NewsItem("新闻1", "这是新闻1的简短内容"));
newsItems.add(new NewsItem("新闻2", "这是新闻2的简短内容"));
newsItems.add(new NewsItem("新闻3", "这是新闻3的简短内容"));
newsItems.add(new NewsItem("新闻4", "这是新闻4的简短内容"));
// 设置适配器
newsAdapter = new NewsAdapter(newsItems);
newsList.setItemProvider(newsAdapter);
// 点击新闻事件
newsList.setItemClickedListener((container, component, position, id) -> {
NewsItem clickedNews = newsItems.get(position);
Intent intent1 = new Intent();
intent1.setElement(new Intent.ElementName(getBundleName(), NewsDetailAbility.class.getName()));
intent1.setParam("newsTitle", clickedNews.getTitle());
intent1.setParam("newsContent", clickedNews.getContent());
present(NewsDetailAbility.class, intent1);
});
}
// 新闻项数据类
public static class NewsItem {
private String title;
private String content;
public NewsItem(String title, String content) {
this.title = title;
this.content = content;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
// 新闻适配器
public class NewsAdapter extends BaseItemProvider {
private List<NewsItem> newsItems;
public NewsAdapter(List<NewsItem> newsItems) {
this.newsItems = newsItems;
}
@Override
public int getCount() {
return newsItems.size();
}
@Override
public Object getItem(int position) {
return newsItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Component getComponent(int position, Component convertView, Component parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(ResourceTable.Layout_news_item, null);
}
NewsItem newsItem = newsItems.get(position);
Text titleText = (Text) convertView.findComponentById(ResourceTable.Id_news_title);
titleText.setText(newsItem.getTitle());
Text contentText = (Text) convertView.findComponentById(ResourceTable.Id_news_content);
contentText.setText(newsItem.getContent());
return convertView;
}
}
}
5. 新闻详情页面代码:NewsDetailAbility.java
路径:news-app/src/main/java/com/example/newsapp/NewsDetailAbility.java
在 NewsDetailAbility.java
中,我们会接收新闻标题和内容,并显示在新闻详情页面。
package com.example.newsapp;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
public class NewsDetailAbility extends Ability {
private Text newsTitle;
private Text newsContent;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_news_detail);
newsTitle = (Text) findComponentById(ResourceTable.Id_news_title);
newsContent = (Text) findComponentById(ResourceTable.Id_news_content);
// 从Intent获取数据
String title = intent.getStringParam("newsTitle");
String content = intent.getStringParam("newsContent");
newsTitle.setText(title);
newsContent.setText(content);
}
}
6. 配置文件:config.json
路径:news-app/src/main/config.json
配置文件用于定义应用的基本信息和启动项。
{
"app": {
"bundleName": "com.example.newsapp",
"vendor": "example",
"version": {
"code": 1,
"name": "1.0"
}
},
"module": {
"abilities": [
{
"name": ".MainAbility",
"label": "$string:app_name",
"icon": "$media:icon",
"type": "page",
"orientation": "unspecified",
"launchType": "singleton"
},
{
"name": ".NewsDetailAbility",
"label": "News Detail",
"icon": "$media:icon",
"type": "page"
}
]
}
}
总结
这个新闻应用项目演示了如何使用鸿蒙系统来构建一个
数据驱动的应用。它涵盖了以下技术:
- 网络数据获取:通过模拟数据方式,演示了如何处理新闻数据。
- UI布局和组件:通过
ListContainer
和Text
显示新闻列表和详情。 - 页面间数据传递:通过
Intent
传递新闻标题和内容到详情页面。 - 适配器模式:使用自定义适配器来渲染新闻列表。
这个示例项目帮助你理解如何在鸿蒙环境下构建多页面应用,如何处理数据、UI和页面跳转。如果你需要实现真正的网络请求,可以使用鸿蒙的网络库(如 HttpURLConnection
)来替代模拟数据。