每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation

news2025/1/25 5:07:23

今日想法

今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。

所以用到了下方三个东西。

Viewbinding

build.gradle配置

首先在app模块的build.gradle里添加一下代码

默认情况下,每一个布局xml文件都会生成一个对应的Binding类

当然,如果不需要为该xml生成Binding类,可以在xml的根布局中配置tools:viewBindingIgnore=“true”。


传统设置布局

setContentView(R.layout.activity_web_view_to_h5);

viewbinding设置布局(Activity)

binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());

用法也很简单,在Activity的生命周期oncreate()中,直接通过binding点名字的方式就可以获取到控件实例,消除了findViewById的模版代码。

这里可以看到,setContentView的入参写法都变了,因为可通过XXXBinding类的getRoot函数获取到布局的根View,再通过setContentView添加到Activity。

viewbinding设置布局(Fragment)

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    binding = FragmentLoginBinding.inflate(inflater,container,false);
    return binding.getRoot();
}

viewbinding设置布局(RecyclerView.Adapter)

调用控件

binding.控件ID即可。


WebView

首先我新创了一个空的Activity,添加代码。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".ui.activity.WebViewToH5">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/web"/>

</androidx.constraintlayout.widget.ConstraintLayout>
package com.example.intelligentwatch.ui.activity;

import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
import com.example.intelligentwatch.databinding.ActivityWebViewToH5Binding;

public class WebViewToH5 extends AppCompatActivity {

    private ActivityWebViewToH5Binding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityWebViewToH5Binding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        //设置WebView支持JavaScript脚本
        binding.web.getSettings().setJavaScriptEnabled(true);
        //当需要跳转网页时目标网页仍在当前WebView中显示
        binding.web.setWebViewClient(new WebViewClient());
        //当需要跳转网页的时候直接调到系统浏览器去显示
//        binding.web.setWebChromeClient(new WebChromeClient());
        //传入相应浏览器网址,即可展示相应网页内容,这里用的是百度
        binding.web.loadUrl("https://baidu.com");
    }
}

跳转到这个Activity就可以自动打开百度了。


Navigation

这是jetpack库中的一个框架,只能绑定在FragmentContainerView容器中,一个FragmentContainerView容器对应绑定一个navigation文件。

从Fragment跳到Fragment或Activity都可以。

但是Activity跳到Fragment或Activity之间的跳转就只能老老实实startActivity了。

所以开头只能是Fragment,不然怎么叫FragmentContainerView容器呢?

FragmentContainerView容器

用来承载fragment的。

本来是叫fragment的,不过androidx更新后现在推荐叫FragmentContainerView,也就是下面这个。用 app:navGraph="@navigation/nav_graph" /> 来绑定navigation进行页面的跳转。

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment_content_main"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

navigation绑定和跳转目标

注释都写了,自己看吧。

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    <!--给fragmentUI控件绑定-->
    android:id="@+id/nav_graph.xml"
    <!--fragment初始页是哪个-->
    app:startDestination="@id/LoginFragment">

    <fragment
        <!--    设置id别人才找得到-->
        android:id="@+id/LoginFragment"
        <!--    会自动搜你项目的所有fragment,让你选择这个子元素哪个fragment-->
        android:name="com.example.intelligentwatch.ui.fragment.LoginFragment">
        <action
            <!--这个动作的名字,给点击事件绑定的-->
            android:id="@+id/toAboutActivity"
            <!--跳到哪个地方-->
            app:destination="@id/about_activity"/>
        <action
            android:id="@+id/action_LoginFragment_to_WebView_activity"
            app:destination="@id/WebView_activity" />
    </fragment>

    <activity
        android:id="@+id/about_activity"
        android:name="com.example.intelligentwatch.ui.activity.AboutCompany_Activity">
    </activity>

    <activity
        android:id="@+id/WebView_activity"
        android:name="com.example.intelligentwatch.ui.activity.WebViewToH5_Activity">
    </activity>

</navigation>

也可以在design页面进行可视化设置。

通过小圆球拖动,来指定调到哪个fragment。

点击事件中绑定

@Override
public void onClick(View v) {
    int id = v.getId();
    switch (id){
        case R.id.button_first:
            Navigation.findNavController(v).navigate(R.id.WebView_activity);
            break;
        default:
            break;
    }
}

大功告成。

过几天再康康Glide图片加载框架的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux学习】基础IO——理解缓冲区 | 理解文件系统

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 基础IO☕理解缓冲区&#x1f9c3;缓冲区的共识&#x1f9c3;缓冲区的位置&#x1f9c3;缓冲区的刷…

Spring Boot+Vue前后端分离项目练习03之网盘项目文件夹创建及文件查询接口开发

1.集成Swagger 3接口文档 在前后端分离的项目中&#xff0c;接口文档的存在十分重要。swagger 是一个自动生成接口文档的工具&#xff0c;在需求变更十分频繁的情况下&#xff0c;手写接口文档是效率十分低下&#xff0c;这时swagger自动生生文档的的作用就体现出来了&#xf…

【uni-app教程】UniAPP 常用组件和 常用 API 简介# 知心姐姐聊天案例

五、UniAPP 常用组件简介 uni-app 为开发者提供了一系列基础组件&#xff0c;类似 HTML 里的基础标签元素&#xff0c;但 uni-app 的组件与 HTML 不同&#xff0c;而是与小程序相同&#xff0c;更适合手机端使用。 虽然不推荐使用 HTML 标签&#xff0c;但实际上如果开发者写了…

华为机试题:HJ105 记负均正II(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【Kubernetes】第十七篇 - ECS 服务停机和环境修复

一&#xff0c;前言 上一篇&#xff0c;介绍了 Secret 镜像的使用&#xff1b; 三台服务每天大概 15 块钱的支出&#xff0c;用一个月也是不少钱&#xff1b; 闲时可以停掉&#xff0c;这样每天只有 4 块钱支出&#xff0c;剩下一大笔&#xff1b; ECS 服务停机后公网 IP 会…

移除元素(每日一题)

目录 一、题目描述 二、题目分析 2.1 方法一 2.1.1 思路 2.1.2 代码 2.2 方法二 2.2.1 思路 2.2.2 代码 一、题目描述 题目链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数…

【Maven】P1 Maven 基础知识

Maven 基础知识Maven基础仓库坐标快速坐标生成网站国内镜像仓库前言 本节&#xff1a;Maven第一节内容&#xff0c;记录maven是什么&#xff0c;解决了什么问题&#xff0c;进而推出他的作用&#xff1b;然后介绍maven中两个重要概念&#xff0c;仓库与坐标。 下一节&#xff1…

TIA博途中使用SCL语言实现选择排序算法并封装成FC全局库

TIA博途中使用SCL语言实现选择排序算法并封装成FC全局库 选择排序算法包括升序和降序2种: 升序排列: 第一轮从数据源中找到最小值排在第一位,第二轮从剩下的数据中寻找最小值排在第二位,依次类推,直到所有数据完成遍历;降序排列: 第一轮从数据源中找到最大值排在第一位,…

centOS 编译strongswan

安装编译环境 yum groupinstall "Development Tools" 编译strongswan Download strongSwan: wget https://download.strongswan.org/strongswan-x.x.x.tar.bz2 Unpack the tarball and navigate into the directory: tar xjf strongswan-x.x.x.tar.bz2; cd strong…

Editor.md 的使用方法及图片处理

目录1. 资源下载2. 生成页面2.1 编辑和预览页面2.2 文本渲染页面3. 图片上传3.1 前端配置3.2 后端接口4. 图片粘贴1. 资源下载 官网下载 gitee 下载 2. 生成页面 2.1 编辑和预览页面 将资源&#xff08;精简后 Editor.md 资源1&#xff09;导入项目&#xff1a; 按照官方教…

nvidia Jetson nano Linux内核编译

今天编译了nvidia 的jetson nano的内核。在网上找到的资料都比较老了。现在官网的最新版本是35.1.结合之前看到的博客的内容。关键是内核源码和交叉编译器的下载。找到官方文档后,编译成功!并且官方的文档是有一个编译脚本的。看之前的资料都是给出的命令,不知道这个nvbuild…

库函数qsort的使用以及模拟实现

首先&#xff0c;qsort函数是个库函数 那么就有头文件 #include<stdlib.h>这个函数的实现是利用快速排序的方法实现的 下面是该函数的参数//void qsort(void* base, //指向了待排序数组的第一个元素 // size_t num, //待排序的元素个数 // size_t …

FLoyd算法的入门与应用

目录 一、前言 二、FLoyd算法 1、最短路问题 2、Floyd算法 3、Floyd的特点 4、Floyd算法思想&#xff1a;动态规划 三、例题 1、蓝桥公园&#xff08;lanqiaoOJ题号1121&#xff09; 2、路径&#xff08;2021年初赛 lanqiaoOJ题号1460&#xff09; 一、前言 本文主要…

Cannot start compiler The output path is not specified for module mystatic(已解决)

1.背景&#xff1a;今天在idea上写了一些代码&#xff0c;右键run竟然跑不起来了&#xff0c;而且右下角的Event Log还报错。报错内容如下图&#xff1a;2.报错原因&#xff1a;项目代码和编译器的输出路径不在一块&#xff0c;导致idea无法找到模块的output path&#xff08;输…

Docker--(六)--Docker资源限制

前言系统压力测试Cpu资源限制Mem资源限制IO 资源限制【扩展】 1.前言 在使用 Docker 运行容器时&#xff0c;一台主机上可能会运行几百个容器&#xff0c;这些容器虽然互相隔离&#xff0c;但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制&#x…

VUE中给对象添加新属性时,界面不刷新怎么办

一、直接添加属性的问题 举例&#xff1a; 定义一个p标签&#xff0c;通过v-for指令进行遍历 然后给botton标签绑定点击事件&#xff0c;我们预期点击按钮时&#xff0c;数据新增一个属性&#xff0c;界面也 新增一行。 <p v-for"(value,key) in item" :key&qu…

18.用于大型程序的工具

文章目录用于大型程序的工具18.1异常处理18.1.1抛出异常栈展开栈展开过程中对象被自动销毁析构函数与异常异常对象18.1.2捕获异常查找匹配的处理代码重新抛出捕获所有异常的处理代码18.1.3函数try语句块与构造函数18.1.4noexcept异常说明违反异常说明异常说明的实参noexcept运算…

Potions (Hard Version) and (Easy Version)(背包DP + 反悔贪心)

[TOC](Potions (Hard Version) and (Easy Version)) 一、Potions(Easy Version) 1、问题 2、分析&#xff08;背包DP 贪心&#xff09; 简而言之就是我们需要从左到右开始选数字&#xff0c;选的过程中我们需要保证我们选的数字的和始终是大于等于0的&#xff0c;在满足这个…

零售电子货架标签解决方案

数字价格标签是一种新的零售趋势。它(ESLs)弥补了店内管理面临的挑战&#xff0c;是新零售的里程碑。电子货架标签(ESLs)为顾客开启了一段愉快的旅程。他们希望更多地参与到购物环境中&#xff0c;并从与商店的更深入互动中受益。 什么是电子货架标签&#xff1f; ESL系统用于…

C语言实现通讯录(实现增删查改显示功能)面向对象的编程

前言 大家好&#xff0c;我是程序猿爱打拳。今天我给大家带来的是C语言实现通讯录&#xff0c;主要的实现方式是结构体。 目录 1.设计思想 2.各个模块的实现 3.最终效果展示 1.设计思想 首先&#xff0c;我们在设计一个通讯录的时候。我们得知道通讯录的基本功能是什么。比…