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

本文介绍了如何在Android应用中使用Viewbinding来避免findViewById,通过设置build.gradle启用该功能。接着展示了如何在不跳转到浏览器的情况下,利用WebView加载H5页面。此外,还探讨了Jetpack的Navigation组件,用于Fragment和Activity之间的跳转,以及如何在导航图中定义和绑定目标页面。
摘要由CSDN通过智能技术生成

今日想法

今天是想把做一个跳转页面的时候调到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图片加载框架的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七qi_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值