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

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

今日想法


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

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


Viewbinding


build.gradle配置

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


8e2e7225d0890627ec4c1c2f3c91f7f6.png


默认情况下,每一个布局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)


762983dfdaf3e66332adb1c8de4dcc36.png


调用控件


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页面进行可视化设置。


c02ec911900db6be9c809c2fdef6f3e9.png


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


0d712e48263a48a6feabedabee1d50db.png


点击事件中绑定

@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图片加载框架的使用。

目录
相关文章
|
17天前
|
JavaScript 前端开发 Android开发
让Vite+Vue3项目在Android端离线打开(不需要起服务)
让Vite+Vue3项目在Android端离线打开(不需要起服务)
|
17天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
20天前
|
Java 开发工具 Android开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS两大星系璀璨夺目,各自拥有独特的光芒。本文将穿梭于这两个平台之间,探讨它们在开发环境、用户群体、成本效益等方面的差异,以及这些差异如何影响一个项目的航向和终点。我们将从初学者的视角出发,逐步深入,揭示选择合适平台的重要性,以及如何根据项目需求做出明智的选择。无论你是即将启航的新手开发者,还是已经在这片星海中航行的老手,这篇文章都将为你提供有价值的导航信息。
35 2
|
25天前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
1月前
|
IDE 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚,引领着技术进步的潮流。本文旨在深入剖析这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计以及市场分布等方面。通过对比分析,我们不仅能更好地理解每个平台的独特优势,还能洞察这些差异如何影响项目决策和最终成果。无论你是开发者还是企业决策者,了解这些内容都将助你一臂之力,在选择适合自己项目的开发平台时做出更明智的决策。
|
1月前
|
IDE 开发工具 Android开发
探索iOS与安卓开发的差异:平台选择对项目成功的影响
【8月更文挑战第22天】在数字化时代,移动应用成为企业和个人展示创意、提供服务的重要工具。iOS和安卓作为两大主流平台,各自拥有独特的优势和限制。本文将深入探讨这两个平台在开发过程中的主要差异,以及这些差异如何影响项目规划、用户体验和市场策略。通过比较分析,旨在为开发者和企业决策者提供有价值的见解,帮助他们根据项目需求做出明智的平台选择。
|
1月前
|
SQL 分布式计算 大数据
Android项目架构设计问题之平衡技术选型与业务需求之间的关系如何解决
Android项目架构设计问题之平衡技术选型与业务需求之间的关系如何解决
33 0
|
1月前
|
开发工具 Android开发
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
19 0
|
1月前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
18 0
|
1月前
|
Java API 开发工具
Android项目架构设计问题之为SDK添加新的回调支持如何解决
Android项目架构设计问题之为SDK添加新的回调支持如何解决
18 0